12-丢弃提交的内容
reset --hard 丢弃最新提交有的时候刚提交的commit内容写得实在太烂连自己的都看不下去与其修改它还不如丢掉重写。这种情况就可以用reset来丢弃最新的提交。比如你刚写了一部分内容并作了commit写完后回头看了看你觉得「不行得重新写」。此时就可以用reset --hard来撤销这条commit。git reset --hard HEAD^HEAD^表示往回数一个位置的commit。因为需要撤销最新的一个commit所以就是要恢复到它的父commit也就是HEAD^。那么在执行上述命令之后最新一条commit就被撤销了不过就像图上显示的被撤销的那个commit并没有消失只是你不再用到它了。如果你在撤销它之前记下了它的SHA-1码你还是可以通过SHA-1来找到它的。假如有一个commit你刚写完的时候并没有觉得它不好可是在几次提交以后你突然灵光一现「哎呀那个commit不该写我要撤销」不是最新的提交就不能用reset --hard来撤销了。这种情况的撤销就要用之前介绍过的一个指令交互式rebase即rebase -i。用交互式 rebase 撤销提交之前介绍过交互式rebase可以用来修改某些旧的commits。其实除了修改提交它还可以用于撤销提交。比如下面这种情况你想撤销倒数第二条commit那么可以使用rebase -igit rebase -i HEAD^^然后就会跳到commit序列的编辑界面这个在之前已经介绍过你需要修改这个序列来进行操作。不过不同的是之前讲的修正commit的方法是把要修改的commit左边的pick改成edit而如果你要撤销某个commit做法就更加简单粗暴一点直接删掉这一行就好。pick的直接意思是「选取」在这个界面的意思就是应用这个commit。而如果把这一行删掉那就相当于在rebase的过程中跳过了这个commit也就是把这个commit撤销掉了。现在再看log就会发现之前的倒数第二条commit已经不在了。git log用 rebase --onto 撤销提交除了用交互式rebase你还可以用rebase --onto来更简便地撤销提交。rebase加上--onto选项之后可以指定rebase的「起点」。一般的rebase告诉 Git 的是「我要把当前commit以及它之前的commits重新提交到目标commit上去这其中rebase的「起点」是自动判定的选取当前commit和目标commit在历史上的交叉点作为起点。例如下面这种情况如果在此时执行rebase那么 Git 会自动选取branch1分支ce78a3和main分支3f5ecd的历史交叉点c379097作为rebase的起点依次将branch1分支的a5b4e2和ce78a3重新提交到3f5ecd的提交路径上去。git rebase 3f5ecd执行rebase操作之后的提交历史变成下图所示注意结果图也说明了rebase操作会改变commit的 SHA-1 值而--onto参数就可以额外给rebase指定它的起点。例如以下图所示如果我只想把5提交到3上不想附带上4那么我可以执行git rebase --onto 第3个commit 第4个commit branch1--onto参数后面有三个附加参数目标commit、起点commit注意rebase会把起点排除在外、终点commit。所以上面这行指令就会从4往下数拿到branch1所指向的5然后把5重新提交到3上去。同样的你也可以用rebase --onto来撤销提交git rebase --onto HEAD^^ HEAD^ branch1上面这行代码的意思是以倒数第二个commit为起点注意起点不包含在rebase序列中branch1为终点rebase到倒数第三个commit上。也就是这样小结一、撤销最新的提交方式是通过git reset --hard 目标commit。二、撤销过往的提交方法有两种用git rebase -i在编辑界面中删除想撤销的commits用git rebase --onto在rebase命令中直接剔除想撤销的commits。两种方法理念是一样的在rebase的过程中去掉想撤销的commit让他它消失在历史中。