【问题标题】:Merge conflict resolution: how to accept all remote changes except the ones in files changed by $AUTHOR?合并冲突解决:如何接受除 $AUTHOR 更改的文件中的所有远程更改?
【发布时间】:2016-06-05 08:36:59
【问题描述】:

我有一个私人项目,它是从另一个项目的版本 1 中派生出来的(我称之为 ABC)。我对一些文件进行了几处更改并将这些更改提交到我的本地存储库中,但大多数其他文件都保持不变。这棵树或多或少看起来像这样:

-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o <- abc/master
        \
---------o <- abc/v1
          \
-----------o-o-o-o-o <- mine/master

一段时间后,ABC 发布了第 2 版。然后,树更改为:

-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o <- abc/master
        \                       \
---------o <- abc/v1             \
----------\-----------------------o <- abc/v2
           \
------------o-o-o-o-o <- mine/master

我想将该新版本合并到我的树中,但新版本对我自己修改的几个文件进行了许多更改。我知道你可以让 git 在解决合并冲突时更喜欢远程修改而不是本地修改,但问题是这样做可能会删除我所做的更改,这对我来说很重要。

有没有办法告诉 git 在解决我没有接触的文件上的冲突时只接受远程更改,但留下我接触过的文件让我解决?也就是说,我想要一种方法来指定某些特定作者(在本例中为我)更改的文件不应自动解决冲突。

【问题讨论】:

    标签: git merge git-merge merge-conflict-resolution


    【解决方案1】:

    一种可能的解决方案是使用git stash。运行 'git stash' 将存储所有未提交的本地更改,然后你可以拉入较新版本的 ABC。使用新版本的 ABC 后,您可以运行 'git stash pop' 来恢复本地更改,并解决合并冲突。

    【讨论】:

    • 这是假设您没有进行任何提交,就像您刚刚开始使用 ABC 版本 1。
    • 我有,不过。我已经编辑了描述以使我的情况更清楚。
    【解决方案2】:

    我认为没有直接的选项告诉 git 合并排除某些文件,但您可以使用 git diff --name-only 来获取您已修改的文件列表。将您修改的文件复制到备份文件夹。这样做时,cp --parents 将帮助您保持文件层次结构。

    接下来,您运行git merge -s theirs 以获取其他分支的所有修改到您的分支,然后用备份文件夹中的文件覆盖工作树。

    现在git diff 将向您展示不同之处。您可以修改它以手动进行合并。

    【讨论】:

    • 这似乎是要走的路,因为我遇到的许多问题来自git merge 混合了我没有更改的文件的v1v2 版本。我会试试看它是否有效。
    • --theirs 不是 git 合并选项
    • @Romário 对不起,应该是 'git merge -s theirs'
    • 没有theirs git 策略了。最接近的应该是git merge -s recursive -Xtheirs,但不是一回事。
    • @Romário,而不是使用git merge,您可以复制所有文件其他分支以覆盖您分支的文件并根据需要进行提交,我认为这不是一个大问题.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多