【问题标题】:How to overcome git merge history ambiguity/obfuscation with '--ours'?如何用'--ours'克服git合并历史模糊/混淆?
【发布时间】:2012-08-30 14:59:47
【问题描述】:

我想知道是否有任何工具可以提供更详细的文件历史记录,尤其是关于保留 our 更改的合并。这个问题最好用一个例子来解释。

假设我在 masterfeature 分支上进行了冲突更改:

git checkout master
<made some change to file.txt>
git commit -a -m "Change on master"
git checkout -b feature
<made conflicting change to file.txt>
git commit -a -m "Change on feature"

如果我将feature 合并到master 并使用git checkout --ours file.txt 保留我的更改,我得到的file.txt 的结果与将master 合并到feature(然后将feature 合并到master 快进 master)。 (我知道有效地合并--ours 也可能在无意中与mergetool 完成。)

在这两种情况下使用git log -p,合并提交不会报告file.txt 的任何更改,但其内容在不同情况下有所不同。现在file.txt 的更改历史已被混淆,很难知道master 中的哪个版本。我可以运行 git log -- file.txt,但此解决方案无法扩展,并且要求您已经知道哪些文件是错误合并的一部分。

如果有人做出错误的合并决定,则很难追踪哪些文件保持不变。否则,如果合并对文件进行了更改,则很容易看到这一点。

【问题讨论】:

    标签: git merge revision-history


    【解决方案1】:

    如果冲突得到解决,它们只是得到了错误的解决(根据你的 cmets 在这个答案上),查看两个分支之间 file.txt 差异的一种方法是使用 git diff

    git diff master feature -- file.txt
    

    如果您在没有任何文件说明的情况下发出 git diff master feature,您将看到所有 repo 文件中的所有差异。 git diff 的创造性应用程序将允许您隔离几乎任何您想要的更改。

    否则,您最好的选择可能是合并提交本身。默认情况下,提交消息会输出一个冲突部分,我建议不要删除。

    【讨论】:

    • 如果其他人使用git mergetool 并选择为每次冲突保留其本地更改,则结果是相同的。我使用git checkout --ours &lt;file&gt; 来复制(并更好地描述)有问题的行为。
    • @Slythfox 几乎完全改变了我的答案。没有意识到您正在使用该命令来重现它。
    • 我还没有机会玩这个。以前,我发现了错误的合并提交,重新合并,然后使用git ls-files -u 获取冲突文件列表,并将其与错误合并进行比较,以了解哪些文件发生冲突但仍保留为“我们的”。它似乎工作,有点。我还与git checkout --patch &lt;revision&gt; &lt;file&gt; 一起玩,以了解错误合并和已知良好提交之间的变化,这似乎与git diff 的想法相同。
    • @Slythfox 这或多或少是一样的想法,是的。
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多