比较git branch和rebased branch

时间:2012-02-15 22:33:22

标签: git git-rebase

我将一个相当古老的话题分支重新设置为主人。由于在rebase期间存在相当多的冲突,我想将旧的主题分支与重新分配的分支进行比较,以确保我不会意外删除或搞砸任何有关主题的更改。我得到的最接近的是git diff master...topicgit diff master...topic-rebased的结果差异。这种方法很有效,但是除了它不是一个非常强大的解决方案之外,在上下文代码,行号,提交哈希等的变化中,最终差异中存在很多噪声。有更简单的方法吗?

3 个答案:

答案 0 :(得分:5)

我正在努力解决同样的问题并提出类似的想法,如Ryan和Adam Dymitruk,并发现它们不是很令人满意:比较最后的差异是棘手的,也没有告诉你如果你引入“错误”的地方找到它。

我目前的rebase工作流程包括将每个重新定位的提交与原始提交进行比较,因此我可以在出现潜在错误时发现并纠正这些错误,而不必重做rebase。我正在使用以下一对git别名来促进这一点:

rc = !git diff -w $(cat .git/rebase-merge/stopped-sha) > .git/rebase-merge/current-diff
rd = !git diff -w $(cat .git/rebase-merge/stopped-sha) | diff --suppress-common-lines .git/rebase-merge/current-diff - | cut -b 1-2 --complement | less

git rc将差异存储在HEAD来自正在重新分支的分支的最新修订版之间。重放以下提交后,git rd将此存储的diff与新HEAD之间的差异与正在重新分支的分支上的下一次提交进行比较。因此,这只显示通过重播最后一次提交引入的差异(“错误”)。

检查差异后,调用git rc更新存储的差异并继续变基。

不是手动调用git rcgit rd,您甚至可以将它们添加到git-rebase-todo,以便在重播每次提交后自动调用它们。

答案 1 :(得分:4)

您可能希望区分每个产生的有效更改(补丁):

diff <(git log master..topic -p) <(git log master..old-place-of-topic -p)

这将有效删除master中引入的任何更改。

答案 2 :(得分:0)

如果您不关心主题分支的提交历史记录,您可以重做rebase并添加--squash标志。这将在您的主分支上提供单个提交,您可以在其中逐个浏览已更改的文件。我还要在rebase中添加标志--no-commit,以便在提交git rebase之前查看更改。

git checkout master
git rebase --squash --no-commit topic
//review changes with your favourite git tool
git commit

如果您不想重做rebase,KDiff3之类的外部差异工具可能会对您有所帮助。