0%

Learn Git Branching 记录

起因

有一天 CP Editor 群内:

想到我对 Git 也是一窍不通,所以就来学了。

基础篇

git commit 可以用来创建一个新的提交记录。

过关命令:

1
2
$ git commit
$ git commit

git branch <name> 可以用来创建分支,git checkout <name> 可以切换分支。

可以通过 git checkout -b <name> 来在创建新分支的同时切换到新分支。

过关命令:

1
$ git checkout -b bugFix

git merge <name> 可以将分支合并到当前分支。

过关命令:

1
2
3
4
5
$ git checkout -b bugFix
$ git commit
$ git checkout master
$ git commit
$ git merge bugFix

另外一种合并分支的方法是 git rebase <name>

某种程度上可以认为是将指向 LCA 的节点的指针指向另外一个节点。

过关命令:

1
2
3
4
5
6
$ git checkout -b bugFix
$ git commit
$ git checkout master
$ git commit
$ git checkout bugFix
$ git rebase master

高级篇

HEAD 指向的是当前分支上最近一次提交记录,可以把它当成某种指针。

如果要指向分支上的历史版本的记录,可以使用 git checkout <hash-value> 来改变 HEAD 的指向。

过关命令:

1
$ git checkout C4

哈希值太长怎么办?

另外一种方式是使用相对引用(^)。这里介绍两个简单的用法:

  • 使用 ^ 向上移动一个提交记录
  • 使用 ~<num> 向上移动多个提交记录

将操作符 ^ 加在引用名称后面,表示它的父节点。

过关命令:

1
$ git checkout bugFix^

我们可以用这些命令来强制修改分支位置。如命令 git branch -f master HEAD~3

这个命令会将 master 分支强制指向 HEAD 的第 3 级父节点。

过关命令:

1
2
3
$ git branch -f master C6
$ git branch -f bugFix HEAD~2
$ git checkout HEAD^

撤销变更的方法主要有两种,git resetgit revert

git reset 可以让当前分支往回移,但只使用于本地。

git revert 则是新建一个提交记录,只不过这是用来撤销用的新记录,内容与要撤销的父节点内容相同。

过关命令:

1
2
3
$ git reset HEAD^
$ git checkout pushed
$ git revert HEAD

移动提交记录

git cherry-pick 可以自由修改提交树,将目标提交记录直接放在当前位置的下面。

过关命令:

1
$ git cherry-pick C3 C4 C7

但别忘了这里的 C3 C4 C7 都是哈希值,真实的哈希值可是长多了。

另外一种方法是使用交互式的 rebase(git rebase -i)。

这个是 UI 界面,很直观。

过关命令:

1
$ git rebase -i HEAD~4

然后在 UI 界面里进行操作即可。

杂项

第一关很简单。

过关命令:

1
2
$ git checkout master
$ git cherry-pick C4

考虑一种情况:

我们在某分支上进行了一次提交,然后又创建了新分支,然后又提交了一次。

此时想修改最开始的提交记录,怎么做呢?

我们可以先用 git rabase -i 进行排序,然后进行修改,然后再恢复到原来的顺序。

过关命令:

1
2
3
4
$ git rebase -i HEAD^^
$ git commit --amend
$ git rebase -i HEAD^^
$ git rebase caption master

使用 git cherry-pick 又是怎么做的呢?

这里直接给出答案:

过关命令:

1
2
3
4
$ git checkout master
$ git cherry-pick C2
$ git commit --amend
$ git cherry-pick C3

我们可以用 git tag 来对一个提交记录作一个类似标记的东西。

过关命令:

1
2
3
$ git tag v0 C1
$ git tag v1 C2
$ git checkout C2

可以用 git describe <ref> 来描述最近的 tag。

输出结果为 <tag>_<numCommits>_g<hash>。tag 表示的是离 ref 最近的标签,numCommits 是表示这个 ref 与 tag 相差有多少个提交记录,hash 表示的是所给定的 ref 所表示的提交记录哈希值的前几位。

过关命令略。

高级话题

在需要多次 rebase 时,记得最后更新 master 分支。

过关命令:

1
2
3
4
$ git rebase master bugFix
$ git rebase bugFix side
$ git rebase side another
$ git rebase another master

还记得 ^ 吗?其实跟 ~ 一样可以在后面加上数字,当同一个节点有多个父亲时,可以选择移动到的是第几个父亲。

过关命令:

1
$ git branch bugWork master ^^2^

git cherry-pick 天下第一!

过关命令:

1
2
3
4
5
$ git checkout one
$ git cherry-pick C4 C3 C2
$ git cherry-pick two
$ git cherry-pick C5 C4 C3 C2
$ git branch -f three C2

Git 的本地操作基本上就是这些了,远程操作等到考完二模再学吧(哭)。

二模前一天晚上想找个休闲的方式,所以选择了这个(雾)。