我一直在使用 git merge
,但我不明白它是否会将合并的分支中的所有提交都添加到当前分支,还是只添加最后一个提交。
例如,如果我有一个分支 A
和一个分支 B
A
包含提交:1 2 5B
包含提交:3 4
那么,如果我在分支 A
中执行 git merge B
,会发生什么?
如果我在分支 B
中执行 git merge A
,会发生什么?
我最想知道的是合并完成后会发生什么,所有提交都添加到当前分支还是只添加最后一个提交?
我一直在使用 git merge
,但我不明白它是否会将合并的分支中的所有提交都添加到当前分支,还是只添加最后一个提交。
例如,如果我有一个分支 A
和一个分支 B
A
包含提交:1 2 5
B
包含提交:3 4
那么,如果我在分支 A
中执行 git merge B
,会发生什么?
如果我在分支 B
中执行 git merge A
,会发生什么?
我最想知道的是合并完成后会发生什么,所有提交都添加到当前分支还是只添加最后一个提交?
mkdir test-repo
cd test-repo
git init
添加一些内容(我们将创建一个文件,在每次提交时更改该内容)
echo 0 > file.txt
git add file.txt
git commit -m '0'
创建分支A
git checkout -b A
echo 1 > file.txt; git add file.txt; git commit -m '1'
echo 2 > file.txt; git add file.txt; git commit -m '2'
echo 3 > file.txt; git add file.txt; git commit -m '3'
git log --graph --oneline --all
git checkout master
git checkout -b B
echo 4 > file.txt; git add file.txt; git commit -m '4'
echo 5 > file.txt; git add file.txt; git commit -m '5'
git log --graph --oneline --all
在分支A中,我们有一个数字为3的文件,在B中有一个数字为5的文件 让我们将A合并到B中(当前分支是B,请记住)
git merge B
cat file.txt
<<<<<<< HEAD
5
=======
3
>>>>>>> A
修复和提交:
git commit
git log --graph --oneline --all
git reset --hard HEAD~1
git log
现在让我们反过来,切换到分支A并将B合并到A中。
git checkout A
git merge B
cat file.txt
<<<<<<< HEAD
3
=======
5
>>>>>>> B
git commit
git log --graph --oneline --all
那么它们有什么区别呢?冲突的顺序是不同的,但更重要的是你所在分支的最终分支名。
因此,合并会创建另一个提交来将一个分支的不同历史链接到另一个分支中(这就是为什么在这个示例中提交0不会重复出现的原因)。
您应该使用rebase
。但这超出了本问题的范围。
如果您想从一个分支创建一个单独的提交以添加到另一个分支,您可以使用squash
和rebase
。
当您通过实践学习时,Git会变得更加容易。经常检查您的git log
。学习如何使用git reflog
来增强信心(这就是git伟大的原因),并给git rebase
命令一个机会。然后与您的团队交流并决定最佳工作流程。
相反地:
a. 进行变基会通过复制所有“不同”的提交来将它们带入当前分支;它们最初将“表现”得就像为当前分支创建的本机提交一样。
b. 摘录会复制单个提交(如果您使用分支名称作为参数,则是最后一个提交);但您可以指定一个范围。
A
和B
的混合提交,但是如果您尝试使用git restore --source=HEAD~n file.txt
,当n
增加时,您只会看到当前分支的更改,而不是合并分支的更改。它们只是在日志中虚拟存在。 - S.B