用于保持最近提交的git rebase

时间:2014-10-07 12:02:38

标签: git git-rebase

我已经提交了A,B,C和D,我需要保留最近的一个D. 我看到一种方法是使用git rebase -i --root,因为你可以选择和压缩提交。

虽然我不太了解pick和squash之间的区别,但是我想知道由于提交是增量的,因此提交D包括其间的所有更改,为什么你必须经历{{1}保持最近的提交而不只是删除其余的提交?

或者我错过了关于git的基本信息?你有没有彼此无关的提交吗?有一天使用提交B,在另一种情况下使用最近的提交D?

1 个答案:

答案 0 :(得分:6)

git提交并不是真正的增量,每次提交都包含整个树。只有用户界面根据与父级的差异提交提交。从这个意义上说,你不通过git rebase来保持最近的提交并丢弃其余的提交,你也可以使用git commit-tree管道命令来创建承诺。完全相当于rebase的是这样的一行:

git reset --hard $(git commit-tree HEAD: -m message)

这条密集的线路做了以下事情:

  • HEAD:是指当前头部提交中包含的树对象。

  • git commit-tree TREE -m MESSAGE创建一个包含指定树的新的无父提交,在我们的例子中是HEAD的树。它的输出是新创建的提交的SHA1。

  • git reset --hard COMMIT将当前分支和工作树重置为指定的提交,在本例中为新创建的根提交。

git不鼓励创建没有历史记录的提交,因为这样的提交使得git很难对数据进行操作。像git annotategit merge这样的命令在很大程度上依赖于可用的历史记录,没有那些git是一个不太有用的工具。