麻烦将上游更改合并回我的分支

时间:2011-04-24 20:00:28

标签: git merge commit conflict partial

我在尝试将上游更改合并回我的分支时遇到冲突,我不知道如何解决它们。

我创建了自己的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'。

我有什么争论吗?我做了些蠢事吗? “未合并的文件”是什么意思?合并文件的合并不是全部吗?合并之前是否必须提交更改?

5 个答案:

答案 0 :(得分:33)

您所看到的意味着自动合并无法解决文件中的冲突。您需要手动解决这些冲突。运行git mergetoolgit 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 -agit 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”。