代码之家  ›  专栏  ›  技术社区  ›  Tom DeMille

如何放弃远程更改并将文件标记为“已解决”?

  •  187
  • Tom DeMille  · 技术社区  · 16 年前

    我有一些本地文件,我从远程分支提取,并且存在冲突。我知道我希望保留本地更改并忽略引起冲突的远程更改。是否有一个命令我可以用来表示“将所有冲突标记为已解决,使用本地冲突”?

    2 回复  |  直到 8 年前
        1
  •  312
  •   Marián Černý    8 年前

    git checkout --ours 签出本地文件版本的选项(与 --theirs ,这是您拉入的版本)。你可以通过 . GIT校验 告诉它检查树上的所有东西。然后您需要将冲突标记为已解决,您可以使用 git add 并在完成后提交您的工作:

    git checkout --ours .  # checkout our local version of all files
    git add -u             # mark all conflicted files as merged
    git commit             # commit the merge
    

    注意 . GIT校验 命令。这很重要,很容易错过。 GIT校验 有两种模式:一种是切换分支,另一种是将文件从索引中签出到工作副本中(有时先将它们从另一个修订版中拉入索引)。它的区别在于您是否传入了文件名;如果您没有传入文件名,它将尝试切换分支(尽管如果您也没有传入分支,它将再次尝试签出当前分支),但如果有修改过的文件会影响,它将拒绝这样做。因此,如果需要覆盖现有文件的行为,则需要传入 . 或文件名,以便从 GIT校验 .

    在传递文件名时,使用 -- ,如 git checkout --ours -- <filename> .如果不这样做,并且文件名恰好与分支或标记的名称匹配,Git会认为您希望签出该修订版,而不是签出该文件名,因此使用 checkout 命令。

    我会详细介绍一下冲突和 merging 在Git工作。当您合并到其他人的代码中时(这也发生在拉取过程中;拉取本质上是一个先取后合并的过程),可能的情况很少。

    最简单的是你在同一个版本上。在这种情况下,你“已经是最新的”,什么都不会发生。

    另一种可能是他们的修订只是您的后代,在这种情况下,您将默认有一个“快进合并”,其中 HEAD 只是更新为提交,而不发生合并(如果确实要记录合并,可以使用 --no-ff )

    然后你进入到你实际需要合并两个修订的情况中。在这种情况下,有两种可能的结果。一种是合并是干净的;所有的更改都在不同的文件中,或者在同一个文件中,但距离足够远,两组更改都可以毫无问题地应用。默认情况下,当发生干净合并时,它将自动提交,但您可以使用 --no-commit 如果需要预先编辑它(例如,如果重命名函数 foo bar ,其他人添加了调用 ,它将完全合并,但会生成一个断开的树,因此您可能希望将其作为合并提交的一部分进行清理,以避免出现任何断开的提交)。

    最后一种可能性是有一个真正的合并,并且有冲突。在这种情况下,Git将尽可能多地进行合并,并生成带有冲突标记的文件。( <<<<<<< , ======= >>>>>>> )在你的工作副本中。在索引中(也称为“临时区域”;文件存储的位置 Git添加 在提交它们之前,每个有冲突的文件都有3个版本;文件的原始版本来自要合并的两个分支的祖先,版本来自 (合并的一侧),以及来自远程分支的版本。

    为了解决冲突,您可以编辑工作副本中的文件,删除冲突标记并修复代码以使其正常工作。或者,您可以从合并的一方或另一方签出版本,使用 git checkout --ours git checkout --theirs . 一旦您将文件放入所需的状态,就表示已经完成了文件合并,并准备使用 Git添加 ,然后您可以提交合并 git commit .

        2
  •  18
  •   Community Mohan Dere    9 年前

    确保冲突源:如果是 git merge ,请参见 Brian Campbell answer .

    但如果是 git rebase ,以便丢弃 遥远的 (其)变更和使用 地方的 更改时,必须执行以下操作:

    git checkout --theirs -- .
    

    见“ Why is the meaning of “ ours ” and “ theirs ” reversed" “看看如何 我们的 他们的 在重新设置基的过程中交换(因为 upstream 分支已签出)。

    推荐文章