如何解决与git merge的冲突而不提交不需要的文件?

时间:2018-01-22 17:24:53

标签: git merge meld

我在解决与git merge的冲突时遇到问题。当我尝试命令git merge branch_1时,出现了与文件的冲突。我能够使用git mergetool与Meld成功解决它。问题是,在我完成之后,我再次尝试合并,但它说我必须提交我的更改以结束合并。所以在做之前我检查了git status,我发现暂存区域中有一堆文件没有修改过。我想这些文件是由失败的合并带来的,但是现在我应该如何在不提交这些文件的情况下完成合并?谢谢!

3 个答案:

答案 0 :(得分:1)

  

我在解决与git merge的冲突时遇到问题。当我尝试命令git merge branch_1时,出现了与文件的冲突。

这很正常。请记住,git merge branch_1表示:

  1. 标识当前提交(当前分支的提示)。我将这个 L 称为左或本地或--ours(我知道l没有出现在ours ...)。
  2. 确定另一个提交(branch_1的提示)。我将此 R 称为Right或Remote或其他或--theirs
  3. 自动查找第三次提交。第三个提交是合并基础,它是两个分支首先回到一起的点:

                 o--L   <-- current_branch (HEAD)
                /
    ...--o--o--B
                \
                 o--R   <-- branch_1
    

    提交 B 这里是合并基础提交。

  4. 制作两个差异。我们会发现自合并基础以来我们的变化:

    git diff --find-renames B L   # what we did
    

    ,另一个发现自合并基础以来他们的变化:

    git diff --find-renames B R   # what they did
    
  5. 使用两个git diff命令合并找到的两个更改集。将每个更改的副本复制到每个文件。构建一个新的文件集,用于提交,就像在 B 中那样,除了我们在 B-vs-L 中更改的每个文件的每一行都是已更改,并且他们在 B-vs-R 中更改的每个文件的每一行也都已更改。

  6. 如果这些更改都不冲突,请提交结果。否则,停止并抱怨相互冲突的变化。离开,准备提交,非冲突文件。将冲突的文件保留为冲突状态,准备好使用某种合并工具进行手动合并或合并。

  7.   

    我能够使用Meld的git mergetool成功解决它。

    git mergetool所做的是找到在步骤6中未合并的文件。在您的情况下,只有一个这样的文件。然后git mergetool在每个此类文件上运行该工具,如果该工具声称您已成功解决冲突,git mergetool将该文件添加到准备提交的文件集中,从而解决冲突。

      

    [Git]说我必​​须提交我的更改才能完成合并。所以在这之前我检查了git状态,我发现暂存区域中有一堆文件我没有修改过。我猜那些合并失败的文件,

    事实上,这些文件已成功合并。 (好吧,至少Git这么认为。你可能想验证Git认为什么是好的,真的很好,因为Git不是很聪明。:-))注意git diff --cached将比较索引中的内容,准备提交,与当前分支当前提示中的内容相对应。

      

    但是现在如何在不提交这些文件的情况下完成合并?

    通常,您 希望在您提交的文件中包含那些暂存的,准备提交的更改:它们来自 B-vs-R 变更集,通常你应该保留它们。

    如果您确实不应保留它们,请注意您可以对工作树中的内容执行任何操作,然后git add将修改后的文件复制到工作树中index / staging-area这样无论你做了什么 else (或者说)包含在内。您甚至可以提取任何其他提交中出现的任何文件的版本,包括当前分支的提示。

    无论你在index / staging-area 中放入什么,都将在下一次提交中。这是索引/临时区域的定义。 (请注意,它不包含更改,它包含文件 - 特定文件的副本。这是与git diff进行比较的行为,用于显示更改。git status正在运行git diff

答案 1 :(得分:1)

使用git commit完成合并。

当你遇到合并冲突时,git会展示它能够合并的所有东西。具有合并冲突的文件不会暂存,必须手动处理。 git status会告诉您哪些文件受到影响。

您可以使用git mergetool - 这通常会在退出时暂存(希望)解决的更改。您通常会为每个已解决的冲突文件获取* .orig文件。这个只是告诉你原始文件是什么样的。显然,你不想提交这些文件......

另外,如果你不喜欢mergetool并希望手动修复它,你可以在首选的编辑器中编辑它们。通过编辑解决的冲突必须通过git add path/to/conflicting/file标记为已解决,以使git知道您已解决冲突。

最后,运行git commit以完成合并。

答案 2 :(得分:0)

Git不支持在单独的提交中提交冲突解决方案,因为除了合并提交之外,这些更改没有意义。将它提交到正在合并的两个分支之一是没有意义的,因为分辨率会更改来自另一个分支的代码,并且在合并提交之上提交它是没有意义的,因为合并提交会包含冲突,这会使其成为无效的提交。

您应该只运行git merge --continue(或等效地,git commit)来创建单个合并提交,其中包含对来自两个分支的文件的修改以及您在解决冲突时所做的修改。