我正在努力理解为什么 Git 会为两个没有冲突的分支合并产生一个具有唯一 SHA1 的提交记录。将“没有冲突”的信息存储起来,是否真的值得在版本历史中增加额外的混乱呢?
我正在努力理解为什么 Git 会为两个没有冲突的分支合并产生一个具有唯一 SHA1 的提交记录。将“没有冲突”的信息存储起来,是否真的值得在版本历史中增加额外的混乱呢?
git merge
的方法是a)将本地分支与远程分支同步,b)实际上将两个单独的分支合并在一起。A--B--C--D--E--F--G
^ ^
| +-- origin/master
+-- master
git merge origin/master
只是将master
指针移动到新的位置。这就是所谓的“快进合并”,通常不会导致新的提交(尽管如果您有理由可以明确请求一个提交)。A--B--C--D--E--F--G <-- branch1
\
J--K--L--M--N <-- branch2
branch2
上,并且想合并到branch1
,那么简单地移动你的branch2
指针是没有意义的。如果你只是将branch2
移动到指向G
,那么你将失去在J
到N
之间所做的更改。在这种情况下,git merge
必须创建一个新的提交,其中结果工作树看起来像你复制了C
(G
和N
的合并基础,可以通过运行git merge-base branch1 branch2
查看),然后应用了D
到G
和J
到N
中的所有更改。即使这不会导致冲突(两个分支修改了不同的文件集或者至少是文件的不同区域),结果的工作目录状态也不与G
或N
匹配,因此需要创建一个新的提交。因此,git
将创建一个新的提交,其中包含从两个分支应用更改的工作目录,并将标记该提交具有G
和N
作为父项。git log
、git diff
等查看那个提交,并查看是否有冲突,但这不是创建新提交的原因。git rebase
,但我正在尝试理解为什么如果没有冲突,git merge
可能更可取。值得一提的是,当我刚开始使用 git 时,我发现 git merge
比 git rebase
更加可怕。 - pattivacekrebase
不总是压缩历史记录,但它可以。更好的说法是它重写了历史记录... - twalberg
git rebase
不如git merge
。这使得它清晰明了:您将失去合并之前状态的信息。这对我来说也是有道理的,这也解释了为什么快进式合并不需要唯一提交。 - pattivacekmerge
通常会更新工作树,因此除非您从脏树开始(merge
倾向于不喜欢),否则总体效果基本相同。 - twalberg