列出属于 git 合并冲突解决的一部分的文件,无论更改如何

List files that were part of a git merge conflict resolve, regardless of changes

当通过保留当前分支版本解决 git 合并冲突时,运行 git status 时不会列出任何文件,因为没有文件被更改。
当然,如果选择其他分支版本来解决冲突,则会列出更改。

有没有办法在合并冲突解决后(提交之前)查看参与合并冲突的文件,而不考虑更改?

演示

以下是对我所说内容的几乎完整复制:

假设我们有:

现在,让我们create a conflict:

$ git checkout dev
$ echo test1 > t.txt
$ git commit -am "test1"
$ git checkout master
$ echo test12 > t.txt
$ git commit -am "test12"
$ git merge dev

最后一行的输出是:

Auto-merging t.txt
CONFLICT (content): Merge conflict in t.txt
Automatic merge failed; fix conflicts and then commit the result.

现在,让我们编辑文件来解决冲突:

编辑前:

$ nano t.txt

<<<<<<< HEAD
test1
=======
test12
>>>>>>> dev

让我们通过在编辑器中删除 dev 的版本来解决冲突。因此,编辑后:

$ cat t.txt

test1

现在:

$ git add .
$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

但是,如果不是通过保留 master 的版本来解决冲突,我们会使用 dev 的版本,如下所示:

$ cat t.txt

test12

...那么更改的文件将被列出:

$ git add .
$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

        modified:   t.txt

所以,回到我的问题,我想以某种方式列出 t.txt 在任何情况下它都是已解决的合并冲突的一部分。可以吗?

So, going back to my question, I'd like to somehow list t.txt in any case it was part of a resolved merge conflict [even before committing the result the first time]. Can it be done?

Git 没有用于解决合并冲突的可重做的“撤消”,但幸运的是,如果您对戴上工程师的帽子感到满意,那么很容易看到之前的内容而不会造成任何伤害:

scratch=`mktemp -d`
git worktree add -d $scratch @
cd $scratch
git merge MERGE_HEAD    # with whatever options you used before

并且您已经重新创建了原始的冲突状态。 cd 返回并 git worktree remove $scratch 当你完成查找时。

我能想到的唯一无法重新创建的情况是,如果你 运行 开启了 rerere,并且你在解析 and[=28 后手动 运行 rerere =] 你想看看如果你不这样做的话结果会是什么,我想还没有人教 Git 如何处理它。

编辑:顺便说一句,如果结账很痛苦以至于您愿意跳舞来避免它,那么 Git 可以做的事情叫做“最小结账合并” only 检出需要某种合并解析的文件。这……快得离谱。 Google 的排名 my answer about this 不是很高,所以这里有一个 link,而且......好吧,这几乎和工作树解决方案一样简单。

git clone -ns . `mktemp -d`
cd $_
git reset -q
git merge $(git -C $OLDPWD rev-parse MERGE_HEAD)
git ls-files -u | uniq

并且您已获得冲突文件列表。那个临时克隆很可能非常小,你可以放弃它,让系统随时清理它,但如果你觉得挑剔,你可以直接删除它,cd -; rm -rf $OLDPWD 完成后。