zoukankan      html  css  js  c++  java
  • Git操作

    4.1、创建工作目录与常用指令

    工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。
    image

    4.2、获得Git仓库

    创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。

    4.2.1、创建全新仓库

    需要用GIT管理的项目的根目录执行:

    # 在当前目录新建一个Git代码库
    $ git init
    
    # 当然也可以直接创建项目名称一起新建一个目录,将其初始化为Git代码库
    $ git init [project-name]
    
    

    4.2.2、克隆远程仓库

    另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地,而不是取某一个特定版本,所以用clone而不是checkout,语法格式如下:

    # 克隆一个项目和它的整个代码历史(版本信息)
    $ git clone [url]
    

    4.3、Git文件操作

    ​ 版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。

    4.3.1、文件4种状态

    image

    • Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
    • Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
    • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
    • Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified

    image

    4.3.2、查看文件状态

    #查看指定文件状态
    git status [filename]
    
    #查看所有文件状态
    git status
    

    4.3.3、添加文件与目录

    image

    工作区(Working Directory)就是你在电脑里能看到的目录。

    版本库(Repository)工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

    将untracked状态的文件添加到暂存区,语法格式如下:

    # 添加指定文件到暂存区
    $ git add [file1] [file2] ...
    
    # 添加指定目录到暂存区,包括子目录
    $ git add [dir]
    
    # 添加当前目录的所有文件到暂存区
    $ git add .
    

    4.3.4、移除文件与目录(撤销add)

    image

    当执行如下命令时,会直接从暂存区删除文件,工作区则不做出改变

    #直接从暂存区删除文件,工作区则不做出改变
    git rm --cached <file>
    

    通过重写目录树移除add文件:

    #如果已经用add 命令把文件加入stage了,就先需要从stage中撤销
    git reset HEAD <file>...
    

    当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

    移除所有未跟踪文件

    #移除所有未跟踪文件
    #一般会加上参数-df,-d表示包含目录,-f表示强制清除。
    git clean [options] 
    
    #只从stage中删除,保留物理文件
    git rm --cached readme.txt 
    
    #不但从stage中删除,同时删除物理文件
    git rm readme.txt 
    
    #把a.txt改名为b.txt
    git mv a.txt b.txt 
    

    当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

    当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

    当执行 “git rm –cached ” 命令时,会直接从暂存区删除文件,工作区则不做出改变。

    当执行 “git checkout .” 或者 “git checkout — ” 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

    当执行 “git checkout HEAD .” 或者 “git checkout HEAD ” 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改 动。

    4.3.5、查看文件修改后的差异

    git diff用于显示WorkSpace中的文件和暂存区文件的差异

    用"git status"只能查看对哪些文件做了改动,如果要看改动了什么,可以用:

    #查看文件修改后的差异
    git diff [files]
    
    #比较暂存区的文件与之前已经提交过的文件
    git diff --cached
    

    也可以把WorkSpace中的状态和repo中的状态进行diff,命令如下:

    #比较repo与工作空间中的文件差异
    git diff HEAD~n
    

    image

    4.3.6、签出

    如果仓库中已经存在文件f4.txt,在工作区中对f4修改了,如果想撤销可以使用checkout,签出覆盖

    检出命令git checkout是git最常用的命令之一,同时也是一个很危险的命令,因为这条命令会重写工作区

    语法:

    #用法一
    git checkout [-q] [<commit>] [--] <paths>...
    #用法二
    git checkout [<branch>]
    #用法三
    git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>]
    

    是可选项,如果省略则相当于从暂存区(index)进行检出

    image

    $ git checkout branch
    #检出branch分支。要完成图中的三个步骤,更新HEAD以指向branch分支,以及用branch  指向的树更新暂存区和工作区。
    
    $ git checkout
    #汇总显示工作区、暂存区与HEAD的差异。
    
    $ git checkout HEAD
    #同上
    
    $ git checkout -- filename
    #用暂存区中filename文件来覆盖工作区中的filename文件。相当于取消自上次执行git add filename以来(如果执行过)的本地修改。
    
    $ git checkout branch -- filename
    #维持HEAD的指向不变。用branch所指向的提交中filename替换暂存区和工作区中相   应的文件。注意会将暂存区和工作区中的filename文件直接覆盖。
    
    $ git checkout -- . 或写作 git checkout .
    #注意git checkout 命令后的参数为一个点(“.”)。这条命令最危险!会取消所有本地的  #修改(相对于暂存区)。相当于用暂存区的所有文件直接覆盖本地文件,不给用户任何确认的机会!
    
    $ git checkout commit_id -- file_name
    #如果不加commit_id,那么git checkout -- file_name 表示恢复文件到本地版本库中最新的状态。
    

    4.3.7、忽略文件

    有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等

    在主目录下建立".gitignore"文件,此文件有如下规则:

    1. 忽略文件中的空行或以井号(#)开始的行将会被忽略。
    2. 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
    3. 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
    4. 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
    5. 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
    #为注释
    *.txt #忽略所有 .txt结尾的文件
    !lib.txt #但lib.txt除外
    /temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
    build/ #忽略build/目录下的所有文件
    doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
    

    4.3.8、提交

    通过add只是将文件或目录添加到了index暂存区,使用commit可以实现将暂存区的文件提交到本地仓库。

    # 提交暂存区到仓库区
    $ git commit -m [message]
    
    # 提交暂存区的指定文件到仓库区
    $ git commit [file1] [file2] ... -m [message]
    
    # 提交工作区自上次commit之后的变化,直接到仓库区,跳过了add,对新文件无效
    $ git commit -a
    
    # 提交时显示所有diff信息
    $ git commit -v
    
    # 使用一次新的commit,替代上一次提交
    # 如果代码没有任何新变化,则用来改写上一次commit的提交信息
    $ git commit --amend -m [message]
    
    # 重做上一次commit,并包括指定文件的新变化
    $ git commit --amend [file1] [file2] ...
    

    修订提交

    如果我们提交过后发现有个文件改错了,或者只是想修改提交说明,这时可以对相应文件做出修改,将修改过的文件通过"git add"添加到暂存区,然后执行以下命令:

    #修订提交
    git commit --amend
    

    撤销提交(commit)

    原理就是放弃工作区和index的改动,同时HEAD指针指向前一个commit对象

    #撤销上一次的提交
    git reset --hard HEAD~1
    
    #撤销提交
    git revert <commit-id>
    #这条命令会把指定的提交的所有修改回滚,并同时生成一个新的提交。
    

    4.3.9、日志与历史

    查看提交日志可以使用git log指令,语法格式如下:

    #查看提交日志
    git log [<options>] [<revision range>] [[--] <path>…?]
    

    "git log --graph"以图形化的方式显示提交历史的关系,这就可以方便地查看提交历史的分支信息,当然是控制台用字符画出来的图形。

    "git log -1"则表示显示1行。

    查看所有分支日志

    "git reflog"中会记录这个仓库中所有的分支的所有更新记录,包括已经撤销的更新。

    4.3.10、撤销更新

    1)、撤销暂存区更新

    使用"git add"把更新提交到了暂存区。这时"git status"的输出中提示我们可以通过"git reset HEAD ..."把暂存区的更新移出到WorkSpace中

    2)、撤销本地仓库更新

    使用git log查看提交日志

    撤销提交有两种方式:使用HEAD指针使用commit id

    在Git中,有一个HEAD指针指向当前分支中最新的提交。当前版本,我们使用"HEAD",那么再钱一个版本可以使用"HEAD",如果想回退到更早的提交,可以使用"HEAD~n"。(也就是,HEAD=HEAD1,HEAD^^=HEAD2)

    git reset --hard HEAD^
    git reset --hard HEAD~1
    # 使用git log 查看提交的版本号指定撤回
    git reset --59cf9334cf957535cb328f22a1579b84db0911e5
    

    现在又想恢复被撤销的提交可用"git reflog"查看仓库中所有的分支的所有更新记录,包括已经撤销的更新,撤销方法与前面一样。

    git reset --hard HEAD@{7}
    git reset --hard e0e79d7
    

    --hard:撤销并删除相应的更新

    --soft:撤销相应的更新,把这些更新的内容放到Stage中

    4.3.11、删除文件

    1)、删除未跟踪文件

    如果文件还是未跟踪状态,直接删除文件就可了,bash中使用rm可以删除文件

    2)、删除已提交文件

    -f 强制删除,物理删除了,同时删除工作区和暂存区中的文件

    撤销删除:

    #to discard changes in working directory
    git checkout -- <file>...
    

    3)、删除暂存区的文件,不删除工作区的文件

    使用git reset HEAD ...同样可以实现上面的功能

    4.3.12、文件操作小结

    image

    Git很强大,很灵活,这是毋庸置疑的。但也正因为它的强大造成了它的复杂,因此会有很多奇奇怪怪的问题出现,多用就好了。

    4.4、GIT分支

    分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

    如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

    截止到目前,我们都只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

    image

    image

    image

    git分支中常用指令:

    # 列出所有本地分支
    $ git branch
    
    # 列出所有远程分支
    $ git branch -r
    
    # 列出所有本地分支和远程分支
    $ git branch -a
    
    # 新建一个分支,但依然停留在当前分支
    $ git branch [branch-name]
    
    # 新建一个分支,并切换到该分支
    $ git checkout -b [branch]
    
    # 新建一个分支,指向指定commit
    $ git branch [branch] [commit]
    
    # 新建一个分支,与指定的远程分支建立追踪关系
    $ git branch --track [branch] [remote-branch]
    
    # 切换到指定分支,并更新工作区
    $ git checkout [branch-name]
    
    # 切换到上一个分支
    $ git checkout -
    
    # 建立追踪关系,在现有分支与指定的远程分支之间
    $ git branch --set-upstream [branch] [remote-branch]
    
    # 合并指定分支到当前分支
    $ git merge [branch]
    
    # 选择一个commit,合并进当前分支
    $ git cherry-pick [commit]
    
    # 删除分支
    $ git branch -d [branch-name]
    
    # 删除远程分支
    $ git push origin --delete [branch-name]
    $ git branch -dr [remote/branch]
    

    4.4.1、新建分支与切换分支

    ​ 每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
    ​ 开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

    image

    每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

    image

    默认分支是这样的,master是主分支

    image

    1)、新建一个分支,但依然停留在当前分支,使用:$ git branch [branch-name]

    2)、切换分支,git branch ,如果name为-则为上一个分支

    3)、新建一个分支,并切换到该分支,$ git checkout -b [branch]

    4)、新建一个分支,指向指定commit使用命令:$ git branch [branch] [commit]

    5)、新建一个分支,与指定的远程分支建立追踪关系使用命令:$ git branch --track [branch] [remote-branch]

    4.4.2、查看分支

    1)、列出所有本地分支使用$ git branch

    2)、列表所有远程分支使用$ git branch -r

    3)、列出所有本地分支和远程分支使用$ git branch -a

    4.4.3、分支合并

    合并指定分支到当前分支使用指令$ git merge [branch]

    4.4.4、解决冲突

    如果同一个文件在合并分支时都被修改了则会引起冲突,如下所示:

    提交前两个分支的状态

    image

    在dev6分支中同样修改file11.txt

    image

    dev6与master分支中file11.txt文件都被修改且提交了,现在合并分支

    image

    提示冲突,现在我们看看file11.txt在master分支中的状态

    image

    Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>dev6 是指dev6上修改的内容

    解决的办法是我们可以修改冲突文件后重新提交,请注意当前的状态产master | MERGING:

    image

    重新提交后冲突解决:

    image

    手动解决完冲突后就可以把此文件添 加到索引(index)中去,用git commit命令来提交,就像平时修改了一个文件 一样。

    git log --graph命令可以看到分支合并图。

    image

    分支策略

    master主分支应该非常稳定,用来发布新版本,一般情况下不允许在上面工作,工作一般情况下在新建的dev分支上工作,工作完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。

    4.4.5、删除分支

    删除本地分支可以使用命令:$ git branch -d [branch-name],-D(大写)强制删除

    删除远程分支可以使用如下指令:

    $ git push origin --delete [branch-name] 
    $ git branch -dr [remote/branch]
    

    -d表示删除分支。分支必须完全合并在其上游分支,或者在HEAD上没有设置上游

    -r表示远程的意思remotes,如果-dr则表示删除远程分支

  • 相关阅读:
    Fiddler 教程
    Android 利用 aapt 解析 apk 得到应用名称 包名 版本号 权限等信息
    Android获取Manifest中<meta-data>元素的值
    Android资源混淆保护实践
    Android中捕获TTextView文本中的链接点击事件方法
    Android APK 手动命令编译、打包、签名步骤
    Android签名总结
    软件概要设计模板
    整理了一份React-Native学习指南
    appium简明教程(转)
  • 原文地址:https://www.cnblogs.com/zhouyon/p/14724257.html
Copyright © 2011-2022 走看看