2012-05-18 27 views
1

我经常使用git rebase --interactive来清理历史记录。发生了合并冲突,或者即使没有冲突,仍然存在合并。我总是有点害怕,即使我只是改变了提交的顺序,压扁了它们等等,我总是有点害怕。Git - 如何验证git-rebase - 交互没有改变项目的最终状态

我曾经保留我的工作树的备份副本粘贴到新的。然后我看着gitg中的提交窗口,看看是否所有东西都一样。这是一个痛苦,但我停止制作备份副本。

接下来我做了一个备份分支,我发现git diff backup-branch的作品。

现在我试着用:(因为我想停止做备份分支机构以及)

git --diff HEAD ORIG_HEAD 

但是,这表明我的变化,当我看的文件在我的工作目录中,它看起来像它没有改变。

此场景的正确命令是什么?

回答

0

我个人喜欢git log -p。我显示了每个提交的差异,包括合并。

2

在这种情况下,交互式重新分配始于结帐,并且出于某种原因,ORIG_HEAD在结帐后设置为。你实际上想要在rebase之前进行结账时与HEAD进行比较。您可以在引用日志找到它:

git reflog 

查找最接近的顶部和DIFF结账针对下一行提交。如果你引用日志是这样的:

ec4bd97 [email protected]{0}: rebase -i (finish): returning to refs/heads/big_cat_branch 
ec4bd97 [email protected]{1}: rebase -i (fixup): Divide the bug class into modules 
5d62142 [email protected]{2}: rebase -i (fixup): updating HEAD 
c28c562 [email protected]{3}: checkout: moving from big_cat_branch to c28c562 
7f6bc0e [email protected]{4}: commit: Fix bug related to big cats. 

那么你要diff的是这样的:

git diff HEAD 7f6bc0e 

git diff HEAD [email protected]{4} 

而且你所期望的任何输出,除非互动的rebase实际改变在您的代码中的东西。

如果你可以从reflog中获取该条目,但我不知道除了获取ORIG_HEAD指向的提交(使用git rev-parse ORIG_HEAD)之外的简单方法,在引用日志中对其进行了批注,并看着下面一行。你可以编写一个脚本来完成它,但手动找到它并不难。

(你可能会认为ORIG_HEAD ^会给你想要的东西,但给你的承诺,在提交历史,而不是在你的本地reflog了。你要后者。先ORIG_HEAD

+0

喜,这是有道理的。我仍然不明白的是'git reset --hard ORIG_HEAD'用于撤销git rebase。请参阅此处[示例](http://stackoverflow.com/a/5375113/1115652) – nus

+1

'git reset --hard ORIG_HEAD'只适用于非交互式资源分配。如果您执行'rebase -i',则会为每次提交重置ORIG_HEAD。 为了节省我自己的时间,我通常会标记我正在重新绑定的提示,以便我可以轻松地回到它(或将其与最终分支状态进行比较)。这是Rob上述方法的捷径。 – ellotheth

相关问题