0. 前言

这次是残酷的文档翻译机。

不得不说,git-scm 的东西已经写的很好了。只不过不记下来的话,之后还会忘。

话只说到我看得懂的程度而已,废话不多说了:

1. init

1
2
3
4
5
6
7
8
9
10
mkdir merge_test && cd merge_test
git init
echo 123 > 1.txt
git add -A && git commit -m "first cm"
git branch another
echo 456 > 1.txt
git add -A && git commit -m "2: master cm"
git checkout another
echo 789 > 1.txt
git add -A && git commit -m "2: another cm"

最后很明显可以得到:

1

如果我哪天连这些东西都看不懂,那就可以结束人生了。

2. —abort

我寻思最重要的一定是 --abort

一开始使用 git 的时候,不免像个 sb 一样。就好似刚开始使用 Verilog HDL。不得不说我就是个 sb,但同时也是个懒汉,发现了问题,不会去花费很大力气解决问题,更不可能去探明问题的本质,而是避重就轻,选择 “尽量之后不去犯这个错”。

貌似是 19 年的 2 月 7 日,我第一次接触 git,到了今天 —— 2020/9/5,我是肯定不会再在两个 branch 上修改同一个文件,然后来 git merge 了。即便真实情况中遇到,肯定也是通过复杂的手段避免了。

今天就权当学习了:

1
2
3
4
5
6
git checkout master
git merge another

Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Automatic merge failed; fix conflicts and then commit the result.

此时 git 处于 MERGING 状态,具体表现为:(master|MERGING)

2

如果想用 git switch 逃避的话,也会得到输出 error: you need to resolve your current index first

所谓的 HEAD 代表 HEAD 所指的 master,由于我在 mastergit merge another,所以 masterCurrentanotherincoming。个人以为这个还是很重要。


刚才自己多玩了几个参数,结果差点兜不住。

git 给的提示是很好的。让 restore 的地方就暴力点 restore .,让 restore --staged 的地方就 restore --staged .;说 Untracked files 就全都 rm 喽。

只要没进 MERGING,就不用 --abort 办事,不然反而会说 MERGE_HEAD missing


3. —squash

还是刚刚那个情形:

都在第 2 次提交,master 上有 1.txtanother 上有 2.txt

接下来是:

1
2
3
git checkout master
git merge --squash another
git status

3

这里可以看到,2.txt暂存区 了!
1.txt 处理冲突之后:

1
2
3
4
5
6
7
8
git add 1.txt
git status

On branch master
Changes to be commited:
(use "git restore --staged <file>..." to unstage)
modified: 1.txt
new file: 2.txt
1
2
3
4
git commit -m "Mg: another to master"
git lg
git checkout another
git lg

4

这种量比较小的,我觉得还是比较适合 --squash,尽管 --squash 可以将很多 commit 浓缩成一个。

现在 master 还是 master,原本的 another 还是 another,二者井水不犯河水。
git merge --squash 操作的时候,也可以看到当时的 master 分支并没有处于 MERGING 状态,那么自然也不可能通过 --abort 解除了。

因为 --squash 的出现,使得 another 上的所有提交与 master 当前的 status 比较,最后给出了只需一个 commit 就能让原本 log 复杂的情况,变成 master 提交数目仅+1 的情况。

而有关 Merge 的信息,也只会在 master 上,也就是正操作的分支上留下。

4. others

试想如果几天前我就知道 --continue 可以用来让处理完冲突的直接继续 merge;如果几天前我就知道 --no-commit 可以让我好好处理提交,那该多好;同理 --squash,之前是不知道咋用,没想到这么好啊。