“重塑”分支历史的安全方式

时间:2015-07-14 12:53:42

标签: git

通常,在使用git时,我会犯下改变或合并我不想要的东西的错误。例如,假设我有三个我最初不想在历史记录中显示的提交,以及我所做的一个提交,例如A-B-C-D,其中D是我想要的提交。所以我跑

git rebase -i HEAD~4

我压缩ABC。但后来,我决定我实际上想要两次提交,因为A与其他三个完全无关,如果它本身就是历史会更有意义。我现在要做的是,

git reflog | grep 'rebase -i' 

会吐出一些以

结尾的列表
<someHash> HEAD@{<num>}: rebase -i (start): checkout HEAD~4
然后我会跑

git checkout HEAD@{<num>+1}
git br -D <branchIWasWorkingOn>
git checkout -b <branchIWasWorkingOn>
git rebase -i HEAD~4

并完成我以前做过的完全相同的事情,但这次pick提交A。这真的很麻烦,需要删除分支,这让我很紧张,这个工作流程并不是特别安全。我的问题是,是否有一种更安全的方式来重写历史而不是reflog&amp; branch deletion方法?

1 个答案:

答案 0 :(得分:3)

如果需要,我最喜欢拆分提交的方法是简单地git reset --soft HEAD~1,它会将最后一次提交的所有更改(在您的情况下为4个合并提交)带到暂存区域。从那里你可以按照你认为合适的方式重新发送它们。所以基本的流程就是像A-B-C-D这样的提交,其中D是你要分手的多次提交。运行git reset --soft HEAD~1,您将在暂存区域中A-B-C进行D更改。提交多个单独的时间,如你所说,两个,你有A-B-C-E-F

如果提交位于HEAD的顶部,那就太好了。但是如果你需要返回几个提交,你仍然需要创建一个分支git reset --hard HEAD~n来删除额外的提交(不要担心它们在另一个分支上是安全的)。然后运行git reset --soft HEAD~1。一旦你重新提交了你想要的任何东西,你就可以在这个分支上重新设置你原来的分支,以达到你想要的地方。

我不能说它比你的方法更清洁,可能会更容易一些。对我来说,它至少更容易想象发生了什么。话虽这么说,如果你改写历史,它会有点混乱。请确保你花时间并注意在什么时候被删除。

另外,作为一个不错的旁注,事实证明,即使是从分支出来的变更提交也不会让它们消失。 Git缓存一切。所以我删除了之前不应该提交的提交,但是因为我通过在终端中向上滚动来了解提交哈希,所以我能够将其恢复到原来的状态。因此,当您删除某些内容时,并非所有内容都会丢失。