让我们想象一下我们有一个master
branch.
然后我们创建一个newbranch
git checkout -b newbranch
并做出两个新的承诺newbranch
: commit1 and commit2
然后我们切换到master并makecherry-pick
git checkout master
git cherry-pick hash_of_commit1
调查gitk
我们看到commit1其精心挑选的版本具有不同的哈希值,因此从技术上讲它们是两个不同的提交。
最后我们合并newbranch
into master
:
git merge newbranch
并看到这两个具有不同哈希值的提交合并没有问题,尽管它们意味着相同的更改应该应用两次,因此其中之一应该失败。
git 是否真的在合并时对提交的内容进行了智能分析,并决定不应应用两次更改,或者这些提交在内部标记为链接在一起?
简短回答
别担心,Git 会处理它。
长答案
Unlike e.g. SVN1, Git does not store commits in delta format, but is snapshot-based2,3. While SVN would naively try to apply each merged commit as a patch (and fail, for the exact reason you described), Git is generally able to handle this scenario.
合并时,Git 会尝试将两个 HEAD 提交的快照合并为一个新快照。如果两个快照中的代码或文件的一部分是相同的(即因为提交已经被精心挑选),Git 将不会触及它。
Sources
1 Skip-Deltas in Subversion http://svn.apache.org/repos/asf/subversion/trunk/notes/skip-deltas
2 Git Basics https://git-scm.com/book/en/v2/Getting-Started-Git-Basics
3 The Git object model http://shafiulazam.com/gitbook/1_the_git_object_model.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)