题记

Git是一个非常优秀的开源的分布式版本控制系统,非常值得好好学习一下。

这里分享一个可能是学习git的最好的网站:https://learngitbranching.js.org/ ,这篇博客用来记录我在这里学习到的知识点。并附上示意图的链接,没有附上图片的原因是希望图片能作为cheat sheet。

分支

分支的新建和切换

新建分支,但不切换:git branch 分支名

切换分支:git checkout 分支名

新建分支,并切换:git checkout -b 分支名

新建分支并切换分支

分支的合并

方法一. merge

合并分支前

git merge bugFix bugFix分支合并进master中。

合并分支后1

git checkout bugFix

git merge master

master分支合并进bugfix。

合并分支后2

方法二. rebase

我们想要把 bugFix 分支里的工作直接移到 master 分支上。

移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。

合并分支前

git rebase master

合并分支后

注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3’ 是我们 Rebase 到 master 分支上的 C3 的副本。现在唯一的问题就是 master 还没有更新,下面咱们就来更新它吧。

git rebase bugFix

由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。

更新master

提交树上移动

git log 查看提交记录的哈希值

git checkout C1 让HEAD指向提交记录C1.

^向上移动1个提交记录。比如 master^ 相当于“master 的父节点”;master^^master 的第二个父节点

~<num>向上移动多个提交记录,如~3

git branch -f master HEAD~3master 分支强制指向 HEAD 的第 3 级父提交。

撤销变更

git reset

git reset HEAD~1 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。

git reset

git revert

虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!

git revert HEAD

git revert

奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。

Git Cherry-pick

git cherry-pick C2 C4 将C2和C4复制过来

这里有一个仓库, 我们想将 side 分支上的工作复制到 master 分支,你立刻想到了之前学过的 rebase 了吧?但是咱们还是看看 cherry-pick 有什么本领吧。

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