有关Git本地仓库的操作(笔记二)

344 阅读8分钟

笔记一的链接:有关Git本地仓库的操作(笔记二)

6.Git分支

Git分支的基础知识

  • HEAD

    • HEAD是唯一的
    • HEAD所指向的分支,就是当前所在分支
    • 通过git log可以查看HEAD现在所指向的分支是哪一个
  • master分支

    • master分支是git init命令执行后就会自动生成,master是Git的默认分支
    • 它会在每次提交中自动前移,其余分支也是如此
    • 它与其它分支并无区别,只是在创建时默认生成,多数人愿意将其称为主分支(实际并无主次)
  • 其它分支

    • 由自己创建
  • 分支是团队项目的基础,灵魂

Git分支相关的操作和命令

  • git branch

    • 查看所有分支,分支前面有 * 号的分支就是当前所处分支
  • git branch [branchName]

    • [branchName] 是自己创建分支名称
  • git checkout [branchName]

    • 切换分支到自己想要到的分支名称上
  • git checkout -b [branchName]

    • 该语句用于创建分支,并且将分支切换到新创建的这个分支上 * git log --decorate --oneline
    • 用于查看分支上有哪些提交操作

Git分支的合并操作和命令

  • 合并时需要先切换回自己的主分支(一般以master为主分支),然后进行合并

  • git merge [branchName]

    • 该命令,将名为[branchName]的这个分支合并到当前分支上来
    • 如果master在需要合并的[branchName]分支上,并没有分叉出去将会发生快速前移,快速迁移后,HEAD指针将会同时指向两个分支,不友好,所以需要用以下命令阻止快速前移。
      • git merge --no-ff -m '这是一次合并操作' [branchName]
      • 快速前移在历史(git log)中,不会有我们操作过合并分支的记录,不够友好,所以,有了上述的阻止快速前移命令。
    • 快速前移的图例:
      • 快速前移合并前:
      • 快速前移合并后:
  • git log --oneline --decorate --all --graph

    • 该命令,将目前所有的提交命令显示出来,并且会在左侧生成一个树状图

      • --oneline:将当前命令显得简短一些(短哈希)

      • --decorate:打印出分支的信息

      • --all:不仅仅打印当前分支,打印所有分支

      • --graph:生成树状图

        形如:

分支冲突

  • master和branch1处于同一条commit路径上(并且属于直接祖先关系),master和branch1将会自动直接合并,不会冲突。(branch1是指的自己需要合并的分支,这里的合并方式也指的是快速前移)
  • 如果不是直接祖先关系,就会判断是否有相同文件中有不同内容,如果有不同的内容话,就需要自己手动处理后再次提交,或则放弃合并,或则撤销(后面有撤销相关笔记)。
    • 手动处理:提交警告后,打开警告相关文件,然后进行手动选择需要保留的部分和删除不需要的部分,解决完后再次提交。
    • 取消合并:git merge --abort,直接取消本次合并,回退到合并之前的操作

删除分支

  • git branch -d [branchName]
    • 合并完成后,分支的意义就不会太大,可以通过该语句删除分支。
    • 如果分支从未合并,但是如果仍要删除,需要使用命令:git branch -D [branchName]强制删除
    • HEAD所指向的分支,无法删除。

7.撤销

  • git checkout [fileName]
    • fileName:文件名,该命令会撤销本次的文件的修改(如果文件进入了已修改状态,即可用该命令撤回本次的文件修改)
    • 该命令只适用于没有放入暂存区,没有提交的文件
    • 原理是:它会自动去将你所指定的文件,回退到与上一次提交的内容去,也就是将你此次的修改给回退了。(目前我知道这是不可逆的,谨慎适用)
  • git reset HEAD fileNmae
    • 取消掉已经在暂存区中的文件
  • git commit -m '描述' --amend
    • 该命令会将上一次的提交的描述内容进行覆盖操作。(紧接着操作才可以)
    • 该命令适用于发现自己描述写错的时候使用
  • git commit --amend
    • 该命令会将这次的提交和上次的提交用同一个描述(也就是合并上一次的提交)
    • 该命令适合于发现自己上次提交的内容中还需要补充一些提交内容

Reset

  • git reset "HEAD[^]"
    • 撤销命令,^的个数相当于当前位置向前撤销几条
    • git reset "HEAD~[Number]"
      • 当希望撤消3步的时候,写法变为:git reset "HEAD~3",Number为所需要回退的步数
    • git reset [哈希值]
      • 撤销是不等于是丢失(也就是commit的东西是仍然存在的),可以通过哈希返回。假如撤销了哈希为4fs5a4f的快照,或者撤销了它之前的很多操作想回到哈希为4fs5a4f的快照的提交,那么通过:git reset 4fs5a4f即可返回之前的提交。
  • git reflog
    • 查看日志历史提交记录,有每一次的提交的哈希值,可以结合git reset [哈希值]命令的操作。
  • git reset "HEAD[^]" --hard
    • 该命令会撤销,并且删除掉工作区所有操作,清空暂存区(不建议适用)。
  • git reset "HEAD[^]" --soft
    • 该命令会撤销,不删除掉工作区操作,不会清空暂存区。
  • git reset "HEAD[^]" --mixed(默认)
    • 该命令会撤销,不删除掉工作区操作,但是会清空暂存区。

Checkout和Reset的区别

  • checkout的移动只会带着HEAD进行移动,而Reset的移动,会带着分支一起移动

    • reset会带着master指针(分支的指针)一起移动,对git log 有影响

    • checkout只会移动HEAD不会带着master指针一起移动,这样的移动,打印出来的日志git log并没有变化

    • 所以常用checkout来切换分支,因为他不会带上master指针(分支的指针)

    • 为了便于理解,所以附图如下:



      • ​ 移动前:



      • 移动后:

8.存储

  • git stash

    • 存储暂存区以及工作目录中的修改文件
    • 该命令执行后,会生成一个新的存储,后续将其取出来使用即可
    • 适用情景:当切换分支时,不希望暂存区和工作区的操作一并带过去时就可以适用存储
  • git statsh -u

    • 该命令的意思是将为追踪的文件也同时放入到存储当中(默认是不会将未追踪文件一并加入的)
  • git statsh list

    • 通过该命令打印所有的存储内容,也是为后续指定取出打印出相应信息(stashName)

    • 红框部分即为stashName:

  • git stash apply [stashName]

    • [stashName]是上方打印出来的
    • 取出对应储存放入工作区(没有进入暂存区)
  • git stash apply [stashName] --index

    • 取出对应储存并且放入暂存区等待提交
  • git stash drop

    • 移除储存,后面可以跟对应的名称,指定删除
    • 默认删除一个(第一个),也就是第一次存储的内容

9.rabase(变基)

  • 变基和merge一样都是分支合并,变基更加注重过程,而merge更加注重结果

  • git rabase master

    • 该命令执行前,需要将HEAD移动到需要合并的分支上,这里假设需要合并的分支为branch1,然后执行语句后,branch1上的所有提交操作,将会放到master分支的后方,然后执行以下命令进行快速前移完成合并。

    • git checkout master //将HEAD指向master分支的指针
      git merge branch1   //执行merge命令快速前移,完成合并
      
    • 需要注意的是,合并后,原branch1上的记录并没有马上删除,所以,master后方衔接上的部分,不会和branch1上的哈希值相同。在我们长期未操作后,Git才会自动回收原branch1上的分支。(短时间内可以通过git relog查看原branch1上的快照)

9.其它操作

  • tag标签:

    • 虽然commit可以写描述,但是哈希太长,没有规律,所以适用tag来进行版本标注,tag不会自动前移

    • 下列列举有关标签的操作命令:

      git tag v1.0    //git标签,默认在最近一次提交上
      git tag v0.2 [哈希值]    //该条命令是给指定哈希值添加标签
      git tag    //查看所有标签
      git tag -a v1.0 -m "描述" [哈希值]    //添加标签,并且添加详细描述
      git show v1.0    //查看标签1.0的详细信息
      git tag -d v1.0    //删除指定标签
      
  • git config --global alias.co checkout

    • 该命令的作用取别名。
    • git config:设置配置。
    • --global:设置在全局(可以改为--local设置为当前文件)。
    • alias.co checkout:这一段的意思是,将checkout取别名为co。(alias:别名)
  • 忽略文件

    • 在命令行中生成文件:touch .gitignore

    • 然后再该文件中直接配置即可

    • 需要注意的是:.gitignore文件只能忽略哪些没有被跟踪(track)的文件夹,如果某些文件已经纳入了版本管理,那么修改.gitignore是无效的,解决办法是:

      • git rm -r --cached .:删除暂存区的文件,而不是删除工作区文件(-r删除文件夹及其子目录)
      • git add .:添加到暂存区
      • git commit -m 'update gitignore':提交