Git将如何合并这个?

Git将如何合并这个?,git,Git,约翰和汤姆克隆了同一个远程回购协议。 远程回购的内容如下: FileA.c John进行如下的本地提交,即将文件a.c移动到名为John的文件夹中,并在本地提交 John\FileA.c Tom\FileA.c Tom还进行了如下的本地提交,即将文件a.c移动到名为Tom的文件夹中,并在本地提交 John\FileA.c Tom\FileA.c 如果Tom和John都将本地回购推到远程回购,比如GitHub,Git将如何合并 我希望我说清楚了。 谢谢 Git在推送过程中永远不会合并。两

约翰和汤姆克隆了同一个远程回购协议。 远程回购的内容如下:

FileA.c
John进行如下的本地提交,即将文件a.c移动到名为John的文件夹中,并在本地提交

John\FileA.c
Tom\FileA.c
Tom还进行了如下的本地提交,即将文件a.c移动到名为Tom的文件夹中,并在本地提交

John\FileA.c
Tom\FileA.c
如果Tom和John都将本地回购推到远程回购,比如GitHub,Git将如何合并

我希望我说清楚了。
谢谢

Git在
推送过程中永远不会合并。两个开发人员中的一个(尝试最后推的可怜的开发人员)必须在本地解决冲突,并告诉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

Git/SVN/etc,尽可能地进行合并:如果他们看到添加/删除/修改了独立的、互不干扰的代码行,那么它将简单地合并由John/FileA.c和Karen/FileA.c所做的更改(将示例中的某个人变成girl=p已成为惯例)。如果合并脚本看到相同的代码行已被编辑,则会在文件中将其标记为冲突


我认为这一点已经提出,但这一过程发生在当地;要么是凯伦,要么是约翰,这取决于谁是最后一个尝试推的人。最后推送的人将被通知退出远程回购,并在推送他们自己的更改之前解决任何冲突。

第二次推送操作将失败;合并必须在本地完成。在这种情况下,将出现必须手动解决的冲突。

当您执行
git commit
但不执行
git push
时,更改将添加到本地存储库中,而不会提交到全局repo。因此,无论谁先推送他的更改,他都不会得到任何冲突,因为远程服务器不知道其他用户所做的更改,而这些更改尚未推送。稍后,当下一个用户尝试推送更改时,git将给出错误消息,即全局回购已更改,您必须先拉取更改。由于更改在同一个文件中,并且位置已更改,因此会发生冲突,而git本身无法解决这一问题。
下一个用户将不得不再次进行更改并推送它以更新全局回购。

其他答案的关键点是,git不会猜测应该发生什么(使用一些预先编码的假设),而是会警告用户困难,因为它不介意阅读各种用户意图


大多数其他声称有能力进行这种合并的系统都没有通过千里眼测试——它们不知道你真正想要的是什么。让聪明的人(即你和我;-)来做决定。

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很好,询问哪个重命名是正确的。请注意,并非所有版本控制系统都能够检测这种重命名/重命名冲突