【问题标题】:How to list only auto merged files in git如何在git中仅列出自动合并的文件
【发布时间】:2016-01-13 17:19:06
【问题描述】:

是否有任何命令可以在拉取后仅列出 git 中的自动合并文件。自动合并不会强迫我们看代码。有时我需要明确检查自动合并的文件。

Git 将更改的文件通常以三种类型混合在一起。新文件出现或旧文件被删除,自动合并和冲突。如果 git 在内部识别自动文件,所以我只是认为会有任何命令仅列出自动合并的文件。顺便说一下,我想在合并提交之前获取此列表。

【问题讨论】:

  • 您希望这个列表before 还是after 合并成为合并提交?我还要注意,例如,如果您从合并的分支中获取对文件 F 的更改,并且在您自己的分支中没有对 F 进行更改,则 F 不是“自动合并文件”(或至少我不会称它为一个),但该文件的更改可能会导致问题,具体取决于您的其他文件(也可能不是“自动合并”)在 F 中的使用方式。所以我不确定这样的列表会有多大用处.
  • Git 将更改的文件登记在三种类型中。新文件出现或旧文件被删除,自动合并和冲突。如果 git 在内部识别自动文件,所以我只是认为会有任何命令仅列出自动合并的文件。顺便说一下,我想在合并提交之前获取此列表。

标签: git automerge


【解决方案1】:

为了清楚地回答这个问题,让我们从一些定义和注释开始:

  • 要执行合并,git 必须找到“合并基础”,它(非常松散地)是“当前分支和要合并的分支共享开发历史的提交”。
  • 您现在正在进行合并,并且使用了--no-commit 或遇到了合并冲突。如果是后者,您还没有解决这些冲突。
  • 因此,您的工作树已准备好提交文件,但您尚未实际提交。
  • 合并一旦提交,就有两个父提交。一个是提交,在您进行合并提交之前您所在的分支的尖端。由于您尚未进行合并提交,因此您当前的 HEAD 提交现在是该分支的尖端。所以下面的“HEADcommit”这句话的意思是“合并之前的分支尖端”。
  • 同时,我们还需要一个简短的单词或短语来表示来自待合并分支(将成为第二个父分支)的提交。我将其称为“入站”提交。 (我在其他地方没有看到这个词,我只是在浏览了一些词库条目后才编出来的。)

根据您的评论回复,我相信您希望找到与HEAD 提交相比任何 更改的文件,即那些从入站提交中获取任何更改的文件,无论是或者 git 没有合并这些而没有发现冲突。

如果这是正确的,答案很简单:

git diff --cached --name-only

将列出它们。 (这有点令人惊讶,因为没有--name-onlygit diff --cached 不会 显示未合并的文件。)

您是否只希望 git 已成功合并(或认为已成功合并)的文件:

git status --porcelain | awk '/^M / { print $2 }'

将列出这些。 (省略awk,并可选择使用-s--short 而不是--porcelain,以查看git status 的输出。在这种情况下,我们查找状态为“已合并,准备提交”的文件. 有合并冲突的文件将处于M 状态。)

您可能还想将文件与其基于合并的版本进行比较。在多个合并库的(有些罕见的)情况下,这并不是太困难除了。不过,我会在这个答案中省略这些细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2020-04-21
    • 2012-02-18
    • 2012-02-09
    • 1970-01-01
    相关资源
    最近更新 更多