git rebase
rebase是一个非常强大的指令,可以对你的提交做各种修改。先体验一下我觉得最厉害的的,比如在某一次提交之后,我又提交了好几次,但是我发现我这次提交有问题,想要修改,怎么办了?也就是去修改几次前的提交内容,rebase 可以帮你实现。
1.修改中间某一次提交的内容:
比如我现在分支上面有两次提交,内容是两个txt文件。
现在我再创建一个文件aa.txt,进行第三次交。结果状态如下。
我再创建一个文件bb.txt,进行第四次提交,结果如下:
这时候我觉得我第三次提交的aa.txt是有问题的,我需要删除(这里为了演示方便,如果纯粹只是删除在当前直接删除就可以了),我们用rebase可修改第三次commit。
因为是倒数第二次,就用 git rebase -i HEAD~2
-i是交互的意思。
我们就进入到这个界面,我们可以在里面编辑。
仔细看一下下面的注释,为什么rebase可以对提交进行各种操作,就是这个命令实现的。pick就是使用这次提交,我们进入界面默认就是pick,因为这几个提交我们都在使用。reword是重新编辑提交的message,有点像git commit --amend。edit是重新编辑这次提交,即可以改内容。squash是把这一次提交与上一次提交合并,注意顺序是合并的上一次上面去,比如third合并到second,fixup是合并后把message都不要了,drop是丢掉这次提交。
故我们要修改third提交,就编辑如下:
:wq 保存出来,
这个提示是说你可以使用git commit --amend来修改提交,如果你修改ok了就执行git rebase --continue
我们看我们的状态,
第四次提交已经没有了,我们又回到第三次的状态,很像reset到第三次。
我们删除aa.txt
注意需要再一次提交,最后运行git rebase --continue,再看我们的状态
我们又回到第四次提交,但是aa.txt已经不在了,中间多出了一次提交remove aa.txt.
是不是很方便,如果是直接reset到第三次,第四次就没有了,而这样的做法既删除了aa.txt,第四次的提交也不用修改。
2.合并多次提交
其实third remove aa.txt这两次提交是无用的,我们在实际编程中经常会遇到这种多次提交,太多了影响感官。我们想合并最后几次提交,直接成为third提交。
git rebase -i HEAD~3
当然如果确认third remove aa.txt无用,直接使用d删除即可,这次我们还是合并。注意是当前的合并到前面的,故
保存退出后出现界面
如果你想修改commit的message就要写入,带#就会被忽略。我们这里默认使用了third
再看状态
合并成一次提交了,内容是第四次提交的内容。
交换两次提交的顺序
只需要把pick的顺序换一下就可以了。
记住你想操作几次提交就用git rebase -i HEAD~n
版本回退问题
版本回退我们也是经常遇到的,大家都知道用git reset ,但实际它后面是带有三种参数,–soft --mixed --hard
这个图很好的说明了三个参数,比如reset某次commit ,soft是回退到git add的状态,mixed是回退到工作区状态,hard是直接抹掉。
比如我发现了我这次的提交有问题,想返回来修改,则使用mixed,这些修改就还在工作区,我在这次修改上面继续修改即可。说白了就是撤回这次提交。
如果我根本不想要这次修改,就直接用hard。这种一般是为了版本回退,比如git reset --hard commit_id .我觉得我这个用的还挺多的。注意问题是我们怎么再回到最新的commit_id
使用git reflog找到最新的commit_id 就可以使用git reset --hard回到最新的。
这里一定要注意,最好reset hard之前记住最新的id,如果你找不到了,你的代码就没有了