我在尝试将上游更改合并回我的分支时遇到冲突,我不知道如何解决它们。
我创建了自己的fork。我克隆了它。我对我的分支,承诺和推送的分支进行了更改。但随后主fork更新了,我尝试通过合并上游来更新我自己的fork:
$ cd repo-name
$ git remote add upstream git://github.com/username/repo-name.git
$ git fetch upstream
$ git merge upstream/master
合并说文件有问题,自动合并不起作用。它告诉我自己修复并重新合并。所以我实际上去了主叉的GitHub上的(上游)存储库,并将新文件的所有代码复制到我的fork上的文件中,并尝试再次合并。然后,git给了我这个错误:
致命:'合并'是不可能的,因为你有未合并的文件。 请在工作树中修复它们,然后使用'git add / rm'作为 适合标记解决方案并进行提交,或使用'git commit -a'。
我有什么争论吗?我做了些蠢事吗? “未合并的文件”是什么意思?合并文件的合并不是全部吗?合并之前是否必须提交更改?
答案 0 :(得分:33)
您所看到的意味着自动合并无法解决文件中的冲突。您需要手动解决这些冲突。运行git mergetool
或git gui
。
答案 1 :(得分:11)
“git merge”命令尝试将来自另一个分支的更改合并到当前分支上。如果合并是干净的,意味着没有冲突,它将提交。由于您的合并确实存在冲突,因此它没有提交。您需要解决冲突。
从上游回购中提取副本是一种方法 - 通过接受上游回购的版本。你可以使用“git checkout --theirs conflicting_file.txt”
在git中做到这一点编辑文件以使其成为您想要的形状是另一种方式。
一旦修复,你需要使用“git add conflicting_file.txt”添加然后提交。然后你的工作副本是干净的,准备好更多的黑客攻击。祝你好运。
答案 2 :(得分:7)
在Git中,有些情况合并拒绝甚至开始以保护您的本地更改。这可能发生在两种情况下:
您的存储库中的 未提交更改与合并冲突。 git将拒绝与以下消息合并:
error: Your local changes to the following files would be overwritten by merge: foo Please, commit your changes or stash them before you can merge. Aborting
然后您必须先提交更改(git commit -a
或git add
+ git commit
),或者使用git stash save
隐藏更改。
您在未完成合并操作中。有一些冲突,例如
Auto-merging foo CONFLICT (content): Merge conflict in foo Automatic merge failed; fix conflicts and then commit the result.
并且您尚未完成解决冲突(通过编辑文件并将其标记为使用git add
解析,或通过git mergetool
使用某些图形合并工具)并且未使用{创建最终合并提交{1}},或者使用git commit -a
中止合并(注意:这会丢弃所有更改,您将无法完成解决冲突的工作!!!)。
或者您刚刚运行第二个git reset --hard
太快,或者使用git merge
而不是git merge
来创建合并提交。
error: 'merge' is not possible because you have unmerged files. hint: Fix them up in the work tree, hint: and then use 'git add/rm ' as hint: appropriate to mark resolution and make a commit, hint: or use 'git commit -a'. fatal: Exiting because of an unresolved conflict.
如上所述解决冲突,例如在Junio C Hamano撰写的旧Fun with completing a merge文章中,最终确定与git commit
的合并,或者放弃合并,或将其隐藏起来。然后,如果您打算创建第二个合并,则可以执行此操作。
旁注:默认情况下,git-aware shell提示符显示您是否处于合并,rebase或应用补丁(git commit
操作)的过程中。您还可以将其配置为显示工作目录是否脏(与最新版本不同,即HEAD)。
答案 3 :(得分:3)
第二次运行git commit
(在添加文件后),而不是git merge
。
此外,冲突解决方案将创建文件以帮助您合并。另请参阅git mergetool
。
答案 4 :(得分:2)
解决合并后,需要使用git add
将已更改的文件添加到索引中,然后提交(如消息所示)。这说git“是的,我确实想做出这些改变”。
请记住,如果您正在使用命令行界面,请在提交之前使用git add
(正常或提交合并)。像magit这样的前端可以为你精简这一点,所以你不必担心每次都输入“git add”。