如何获取 git 个自动合并文件的列表

How to get list of git auto merge files

有没有办法确定 'git merge' 在用户解决文件冲突并执行 git [=] 之后成功自动合并了哪些文件16=]?如果用户在同一提交中更新了任何成功自动合并的文件,那么也很高兴知道这一点。我有一个预接收挂钩,只需要 运行 手动合并的文件。

好的,根据澄清评论,我会说没有 完美的 答案,但是您可以通过简单地重复合并来获得一个可能足够好的近似值,使用 --no-commit 以防止合并完成,然后使用 git ls-files -u 查找当前未合并的文件:

$ git checkout <first-commit-id>
[output indicates detached HEAD]
$ git merge --no-commit <second-id>
[output includes any merge issues]
$ git ls-files -u

git ls-files的实际输出因合并冲突而异。例如,modify/modify 合并冲突(在 fileB 中):

100644 7531cd0643738673e94e850c07a681aedd008bca 1   fileB
100644 85159a3450148691cd6eec96eb06263240990850 2   fileB
100644 bbf71554709c5a9ae8d253b8e15270534f40e3f7 3   fileB

但存在 rename/delete 冲突(fileB 在 "main" 分支中重命名为 fileE,但在被合并的 "side" 分支中删除):

100644 7531cd0643738673e94e850c07a681aedd008bca 2   fileE

(在此特定情况下没有第 1 阶段或第 3 阶段变体)。其他组合也是可能的:请参阅 git read-tree documentation 并特别注意“3 向合并”部分。

一旦你有来自 git ls-files -u 的输出(如果 git 可以告诉所有东西都干净地合并,它是空的——这并不意味着合并是正确的,它甚至可能是完整的garbage if git 在语义上确实是错误的——但它是 git 现在可以自动执行的操作,这大概与 git 那时也可以自动执行的操作相同),中止 in -progress合并并恢复适当的分支:

$ git merge --abort
$ git checkout <original-branch>

如果(如 "pre-receive hook" 建议的那样)这一切都在 --bare 存储库中完成,您将需要一个临时工作树(或整个克隆)来执行合并,我真的没有时间在这里试验。

您需要 git checkout 的两个有问题的 SHA-1 只是合并的两个父代。 (请注意,所有这一切都假设一个 2-parent 合并:章鱼合并是正确的。)

如果进行合并的人有 运行 和 -s ours 或某些 -X 选项,这不会重复他们所做的,并且可能会给你一个无用的答案,这就是为什么这无论如何都不完美。不过,我怀疑这是您可以获得完全自动化的最佳选择。

(另请注意,如果您想要一些可能有意义的细微变化,您可能只想单独使用 git read-tree -m,而不是完整的 git merge。这只是基于我的 "suspicion of intent" 在这里。我还认为,无论你想出什么,充其量也只是边际效用,最好让你的用户在推送之前自己检查一下。)