获取在git中作为最后一次运行的一部分合并的文件列表

时间:2017-11-02 11:35:46

标签: git merge branch release

获取在git

中作为上次运行的一部分合并的文件列表

我有dev_branch&主。开发人员将更改提交到dev_branch。

作为简单发布工作流程的一部分,dev_branch生成的所有通道都合并为master。

作为所需增量部署的一部分,想了解自master上的最后一张图片以来合并了哪些文件集。

很少......

一个。 git diff HEAD^ HEAD - 只给我一个changeList,但不是所有的changeList更改都合并为master

B中。 git diff --name-only master dev_branch - 获取我需要的东西,但是一旦合并完成,我就无法运行。

2 个答案:

答案 0 :(得分:1)

假设master为123abc,dev为321cba。

您的第二个示例相当于合并前的git diff 123abc 321cba

合并后,master现在为456def。

但合并后你仍然可以使用git diff 123abc 321cba。分支名称指向新的哈希值,但旧的哈希值永远存在。

如果您忘记了它们,

git log将为您提供哈希名称,并且可以使用标记来简化。

答案 1 :(得分:1)

您报告的结果表明您正在进行“快进”合并。在合并的一侧没有更改的工作流中,这是默认行为。

当您进行快进合并时,某些知识会丢失 - 例如“先前主提交”的标识。

(我应该澄清 - 以前的主提交的标识应该仍然存在于合并发生的repo的reflog中。合并之后,你可以 - 在同一个repo中 - 说

git diff master master@{1}

得到你想要的东西。但是repos之间不共享reflog - 即push和fetch不会传播它们。而且它们不是永久性的。当refs移动时,它们会改变。它们是从错误中恢复过来的好工具,但我不会让它们成为你“快乐路径”工作流程的一部分。)

“检入开发人员,定期合并到主人”等工作流程的一个关键优势是,您保持了解“之前的主提交是什么”。您可以通过保留分支拓扑来保留这些知识,并通过在合并命令中使用--no-ff选项来实现这一点

git checkout master
git merge --no-ff dev_branch

现在,git不会将master ref移动到dev_branch提示处的现有提交,而是创建一个新的“合并提交”,它将两个历史记录连接起来。生成的内容(TREE对象)是相同的。

有些人会抱怨这一点,因为他们认为合并提交是“丑陋的”,线性化的历史在美学上更令人愉悦。如果你在这个阵营中根深蒂固,你将不得不使用一个笨拙的解决方案 - 我会提供一些。

但是,如果您希望将dev分支与maser分支分开,那么就像使用真正的合并(--no-ff)然后

一样简单
git diff master^ master

将开始向您展示您想要的内容。

至于笨拙的解决方案:嗯,如果你坚持使用快进合并,那么你需要的是保留以前主分支的知识。所以你可以使用标签。

git checkout master
git tag -f old_master
git merge dev_branch
git diff old_master master

上述程序并不可怕,但它确实使标签成为常规的一部分。这不是最好的事情,所以你可以使用分支

# 1st time
git checkout master
git branch old_master
git merge dev_branch
git diff old_master master

# subsequent times
git checkout old_master
git merge --ff-only master
git checkout master
git merge dev_branch
git diff old_master master

(请注意,我在推进--ff-only时使用old_master;这无关紧要,因为如果您遵循此工作流程,合并将始终默认为快进;使用该标志只会如果不满足这些期望,则导致进程停止并出现错误。)