查找在git merge commit期间发生冲突或本地编辑的文件

时间:2014-04-07 03:30:18

标签: git merge pre-commit

背景:我正在开发一个预提交工具。作为开发人员,拉动另一个开发人员的分支并让预先提交的钩子大声抱怨我甚至没有触及的文件会非常令人沮丧。

我希望能够在我的实现中做的是在合并提交的情况下,只运行由我手动编辑的冲突的文件的钩子在合并冲突期间本地。

到目前为止我尝试过:

  • git diff --staged - 这是当前解决方案的功能和不正确的原因,因为它包含所有文件,包括干净合并的文件。
  • git diff MERGE_HEAD - 这非常接近,但是如果我合并的分支在 之后从主分支出来,那么它包含了我还没有来自master的所有更改合并。
  • .git/MERGE_MSG包含冲突文件列表。这似乎是一个很好的起点,但不包含本地编辑的文件。
  • 提交后git show --name-only正好得到了我想要的东西。但是为时已晚(我正在实施预先提交:D)

2 个答案:

答案 0 :(得分:4)

当您git add解决冲突时,您将删除冲突记录。因此,要保留此信息而不必重新构建它,请保留索引文件:

cp .git/index .git/preserved-merge-index

然后

GIT_INDEX_FILE=.git/preserved-merge-index git ls-files --unmerged

会告诉你冲突,

GIT_INDEX_FILE=.git/preserved-merge-index git diff-files --name-only

将显示工作树中自从合并索引中记录以来发生更改的所有内容。

通过评论,您还可以直接在合并中添加文件。要解决这些问题,在解决所有合并冲突后,您可以

GIT_INDEX_FILE=.git/preserved-merge-index git diff-index --name-only `git write-tree`

答案 1 :(得分:2)

我认为解决方案是git diff -m。我发现这个文件很混乱,所以这是我的总结。给定命令git diff -m child parent1 parent2 ....,您将看到一个多父差异,显示如何从每个父母到达孩子。 parent1的第一列中代表[ +-],依此类推。这里的主要障碍是你问题中的孩子没有可引用的名字。 git write-tree来到这里救援;它为当前暂存的文件创建一个名称,并将其打印出来。

请注意,如果存在任何未合并的文件,写入树将失败,这可能是您想要的,但是您需要确保您的系统在这种情况下能够理解某些内容。

$ CURRENTLY_ADDED=`git write-tree`
$ git diff -m $CURRENTLY_ADDED HEAD MERGE_HEAD
diff --cc README
index 2ef4a65,8e2e466..be3d46e
--- a/README
+++ b/README
@@@ -1,10 -1,5 +1,10 @@@
 -deleted only in <theirs>
 +added only in <theirs>
- deleted only in <ours>
+ added only in <ours>
--deleted during merge
++added during merge