通常,在使用git时,我会犯下改变或合并我不想要的东西的错误。例如,假设我有三个我最初不想在历史记录中显示的提交,以及我所做的一个提交,例如A-B-C-D
,其中D
是我想要的提交。所以我跑
git rebase -i HEAD~4
我压缩A
,B
和C
。但后来,我决定我实际上想要两次提交,因为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
方法?
答案 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缓存一切。所以我删除了之前不应该提交的提交,但是因为我通过在终端中向上滚动来了解提交哈希,所以我能够将其恢复到原来的状态。因此,当您删除某些内容时,并非所有内容都会丢失。