Git学习
题记
Git
是一个非常优秀的开源的分布式版本控制系统,非常值得好好学习一下。
这里分享一个可能是学习git的最好的网站:https://learngitbranching.js.org/ ,这篇博客用来记录我在这里学习到的知识点。并附上示意图的链接,没有附上图片的原因是希望图片能作为cheat sheet。
分支
分支的新建和切换
新建分支,但不切换:git branch 分支名
切换分支:git checkout 分支名
新建分支,并切换:git checkout -b 分支名
分支的合并
方法一. merge
git merge bugFix
bugFix分支合并进master中。
git checkout bugFix
git merge master
master分支合并进bugfix。
方法二. rebase
我们想要把 bugFix 分支里的工作直接移到 master 分支上。
移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。
git rebase master
注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3’ 是我们 Rebase 到 master 分支上的 C3 的副本。现在唯一的问题就是 master 还没有更新,下面咱们就来更新它吧。
git rebase bugFix
由于
bugFix
继承自master
,所以 Git 只是简单的把master
分支的引用向前移动了一下而已。
提交树上移动
git log
查看提交记录的哈希值
git checkout C1
让HEAD指向提交记录C1.
^
向上移动1个提交记录。比如 master^
相当于“master
的父节点”;master^^
是 master
的第二个父节点
~<num>
向上移动多个提交记录,如~3
git branch -f master HEAD~3
将 master
分支强制指向 HEAD
的第 3 级父提交。
撤销变更
git reset
git reset HEAD~1
向上移动分支,原来指向的提交记录就跟从来没有提交过一样。在reset后, C2
所做的变更还在,但是处于未加入暂存区状态。
git revert
虽然在你的本地分支中使用
git reset
很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!
git revert HEAD
奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录
C2'
引入了更改 —— 这些更改刚好是用来撤销C2
这个提交的。也就是说C2'
的状态与C1
是相同的。
Git Cherry-pick
git cherry-pick C2 C4
将C2和C4复制过来
这里有一个仓库, 我们想将
side
分支上的工作复制到master
分支,你立刻想到了之前学过的rebase
了吧?但是咱们还是看看cherry-pick
有什么本领吧。
本地栈式提交
来看一个在开发中经常会遇到的情况:我正在解决某个特别棘手的 Bug,为了便于调试而在代码中添加了一些调试命令并向控制台打印了一些信息。
这些调试和打印语句都在它们各自的提交记录里。最后我终于找到了造成这个 Bug 的根本原因,解决掉以后觉得沾沾自喜!
最后就差把
bugFix
分支里的工作合并回master
分支了。你可以选择通过 fast-forward 快速合并到master
分支上,但这样的话master
分支就会包含我这些调试语句了。你肯定不想这样,应该还有更好的方式……
git checkout master
git cherry-pick bugFix
相关资料
Git Learning 学习笔记 https://blog.csdn.net/Edisonleeee/article/details/94554710