John和Tom克隆了同一个远程仓库。 远程仓库的内容是这样的:
FileA.c
John像这样进行本地提交,即将FileA.c移动到名为John的文件夹中并在本地提交。
John\FileA.c
Tom也会像这样进行本地提交,即将FileA.c移动到名为Tom的文件夹中并在本地提交。
Tom\FileA.c
如果Tom和John都把他们的本地回购推送到远程仓库,比如说GitHub,Git将如何合并?
我希望自己清楚明白。 谢谢!
答案 0 :(得分:4)
执行git commit
但不执行git push
时,更改会添加到本地存储库中,而不会提交给全局存储库。因此,无论谁先推送他的更改,他都不会遇到任何冲突,因为远程服务器不知道其他用户尚未pushed
所做的更改。稍后,当下一个用户尝试推送更改时,git将给出全局存储库已更改的错误,您必须先提取更改。因为,更改在同一个文件中并且位置已更改,将会发生冲突,git本身无法解决。
下一个用户必须再次进行更改并将其推送以更新全局存储库。
答案 1 :(得分:2)
Git / SVN / etc,尽可能做合并:如果他们看到已添加/删除/修改了单独的,非干扰的代码行,那么它将简单地组合John / FileA.c所做的更改。和Karen / FileA.c(让你的例子中的某个人成为女孩= P)。如果合并脚本看到已经编辑了相同的代码行,那么它会在文件中将其标记为冲突。
我认为这一点已经完成,但这个过程是在本地进行的;无论是凯伦还是约翰,都取决于谁是最后尝试和推动的人。最后推送的人将被通知从远程仓库撤出并解决任何冲突,然后再推送他们自己的更改。
答案 2 :(得分:1)
Git永远不会在push
期间合并。两个开发者中的一个(穷人试图推送最后一个)必须在本地解决冲突并告诉git移动文件的位置。如果没有人为干预,Git无法知道文件应该在哪里结束。
# dev1
git clone …
mkdir John && git mv FileA.c John/FileA.c
git commit -m 'move file to john subdir'
git push origin master
# dev2
git clone …
mkdir Tom && git mv FileA.c Tom/FileA.c
git commit -m 'move file to tom subdir'
git push origin master
# git errors out: non-fast-forward, pull first to resolve potential conflicts
git pull origin master
# merge conflict in FileA.c
# tell git which file to delete and which file to keep:
git rm Tom/FileA.c && git add John.FileA.c
git commit # creates a merge commit
git push origin master
答案 3 :(得分:1)
第二次推送操作将失败;合并必须在当地完成。在这种情况下,必须手动解决冲突。
答案 4 :(得分:1)
关于git的好处是,在不影响任何服务器的情况下,很容易自己尝试这些东西。最后一个人推动的结果是:
02:32:54 ~/desktop/tom
$ git push
To /cygdrive/h/desktop/test
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to '/cygdrive/h/desktop/test'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.
02:32:54 ~/desktop/tom
$ git pull
remote: Counting objects: 3, done.
remote: Total 2 (delta 0), reused 0 (delta 0)
Unpacking objects: 50% (1/2) Unpacking objects: 100% (2/2) Unpacking objects: 100% (2/2), done.
From /cygdrive/h/desktop/test
307f68a..2539f44 master -> origin/master
error: refusing to lose untracked file at 'John/FileA.c'
error: refusing to lose untracked file at 'John/FileA.c'
CONFLICT (rename/rename): Rename "FileA.c"->"Tom/FileA.c" in branch "HEAD" rename "FileA.c"->"John/FileA.c" in "2539f448bb15d10f14bef74688dc3470975c2dbf"
CONFLICT (rename/rename): Rename "FileA.c"->"Tom/FileA.c" in branch "HEAD" rename "FileA.c"->"John/FileA.c" in "2539f448bb15d10f14bef74688dc3470975c2dbf"
Automatic merge failed; fix conflicts and then commit the result
Git很好,并询问哪个重命名是正确的。请注意,并非所有版本控制系统都能够检测到这种重命名/重命名冲突。
答案 5 :(得分:0)
其他答案的关键点是git不会猜测应该发生什么[使用一些预先编码的推定],而是它会警告用户难度,因为它不能介意阅读各种用户意图。
声称有能力进行此类合并的大多数其他系统都未通过透视测试 - 他们不知道您真正想要的是什么。让聪明的人(就是你和我;-)做出决定。