未合并文件的git日志

4

背景

最近我遇到了一个问题,即在合并期间意外未合并文档文件,导致文件丢失。

由于某种原因,我弄错了合并操作,并且实际上删除了该文件(以及其他几个文件),因为我忘记它们的存在。

现在我想查看我的历史记录,看看是否有其他合并出了问题。

重现问题

git init
echo "file a" > a
git add a
git commit -m "file a added"

git checkout -b branch_c
echo "file c" > c
git add c
git commit -m "file c added"

git checkout master
git checkout -b branch_b
echo "file b" > b
git add b
git commit -m "file b added"

# For whatever reason we forgot to merge file c and forgot about it
git merge --no-commit branch_c
git reset c
git commit -m "merge branch c, but forgot file c"
git clean -fxd

# Commands such as git-log fail to show that files were excluded from merges
git log --name-status --all

问题

如何列出从未合并到某个分支的文件? 是否有一种使用git-log的方法,以便它显示未被合并的文件?


通过一些混乱的脚本,你可以得到你想要的结果:git log --all --stat,从结果中提取所有文件名,并在一个干净的沙盒中查找它们。也许?注意:这也会包括过去被 git rm 删除的文件,所以不完全是你想要的。 - joanis
2个回答

1
从您附加的脚本开始,我首先想到的是比较完全合并和部分合并。然后,根据您想要检查的合并提交数量,甚至可以创建自定义脚本。顺便说一下,
检出您要检查的合并提交的第一个父级。
git checkout branch_b^

通过创建一个新分支(temp_branch)并进行完全合并来退出分离的头。

git checkout -b temp_branch
git merge -m "full merge with all files" branch_c

现在你可以使用git diff-tree直接比较这两个树。
git diff-tree --compact-summary HEAD branch_b

这将返回类似于以下内容的东西:
 c (gone) | 1 -
 1 file changed, 1 deletion(-)

许多选项除了--compact-summary都是可用的。 最后,删除临时分支(git branch -D)。 老实说,我不知道git log是否足够强大以显示未合并的文件,但对我来说这似乎是一个合理的解决方案。

0
如何列出从未合并到某个分支的文件?有没有一种方法可以使用git-log来显示未合并的文件?
不行。问题在于,就Git而言,这些文件已经被合并了。
换句话说,Git并不会合并文件。Git合并提交。一旦您生成了最终提交结果,根据Git的定义,该结果是现在合并的提交中包含的所有文件的正确结果。那是因为Git关心的是提交,而不是文件。

Marco Luzzara的回答提供了你可以做的事情:重新执行每个问题中的合并,以查看是否会得到与上次相同的结果。Git正在进行的工作将使Git能够以更自动化的方式为您完成此操作,就Git所能做的而言(也就是说,合并的自动重做可能会出现合并冲突,并且在最好的情况下,Git只能向您显示某个文件的合并冲突组合版本与合并提交版本的对比)。但这不是今天可用的,可能还需要一段时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接