我已经提交了A,B,C和D,我需要保留最近的一个D.
我看到一种方法是使用git rebase -i --root
,因为你可以选择和压缩提交。
虽然我不太了解pick和squash之间的区别,但是我想知道由于提交是增量的,因此提交D包括其间的所有更改,为什么你必须经历{{1}保持最近的提交而不只是删除其余的提交?
或者我错过了关于git的基本信息?你有没有彼此无关的提交吗?有一天使用提交B,在另一种情况下使用最近的提交D?
答案 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 annotate
和git merge
这样的命令在很大程度上依赖于可用的历史记录,没有那些git是一个不太有用的工具。