git reset和git rebase的简单使用

1、git reset:主要用来版本回退

git reset --参数 head;

参数可以选择:

hard :当使用这个命令后,工作区、暂存区的内容都会和当前head指向的内容相同。

soft: 当使用这个这个命令后,head指针指向指定的commit,但是工作区、暂存区的内容不会发生变化。

mixed: 从这个英文的意思(混合的)就可以看出,是介于hard和soft之间,暂存区的内容将会发生变化,但是工作区的内容不会发生变化。

例子:

git reset --hard head^  将head指向上一次commit。

git reset --hard head^^ 将head指向上上次commit。

git reset --hard head~10 将head指向上10次的commit。

git reset --hard 指定commit版本号 将head移动到指定的commit 

如何用呢,例如我提交的上一次commit信息错了,但是暂存区内容是对的,那么我可以使用git reset --soft head^ 来取消上一次commit。

如果git reset错了怎么办,这个时候就要使用git reflog, git reflog和git log很像,git不会显示已删除的commit 记录(reset操作导致或者其它操作),但是git reflog会显示,

使用git reflog会显示所有的commit记录。

然后在重新使用git reset命令。不过这里是使用指定的commit版本号,不能使用head了

 

2、git rebase

使用场景1:本地有多个commit,想合并成一个commit。

git rebase -i  commit版本号;进入VI便捷界面,按i进入编辑模式,编辑完成后按esc ,然后按:,最后输入wq保存并退出.

 

 这里参数很多,主要使用的是

pick:保留这份commit。

reword: 保留这份commit,但是会重新编辑commit信息

squash : 这份commit的内容虽然会保留,但是会合并到先前的commit中。

drop: 移除这份commit的内容

等等

例如下面的,第二次,第三次commit都会合到第一个commit里面。

 

 保存成功后,会要你输入合并commit后的commit信息,

 

 输入commit信息后,保存退出就可以看到使用git log就可以看到多个commit合并了。

如果远程以前push过,这时候push会失败,应为远程的commit版本已经高于本地的commit版本号了。所以这个时候可以用

git push -f 强制推送。采用强制推送时注意代码是正确的,没有丢失。

 

使用场景2:整合分支

基于master分支拉取新的分支:dev , 在master分支和和dev分支分别有新的commit,此时在master分支执行git merge dev时,会出现新的commit版本号,如下图所示,可以看到分叉了。

 

 这时git rebase就可以排上用场了。使用git reset --hard head^把merger回退,然后切换到dev分支。

 接着使用git rebase master命令,成功后,查看git log,可以看到dev分支上已经没有分叉了

 

 要注意的是master分支此时head仍在以前的节点,然后在master节点上merger dev,由于使用的是fast-forward模式,merge是不会产生新的分支的。

 

使用场景3:与远程代码同步时使用git pull --rebase

这个其实和第二种情况有点类似,当然这也是不同的。当你在dev分支上开发时,代码写完了,先commit到本地仓库,然后push到远程仓库,发现远程仓库代码改变了,就需要pull把远程代码拉到本地,pull实际上的命令就是fetch+merge,fetch其实就是更新本地的远程commit信息,可以在文件夹.git\refs\remotes\origin中找到相应分支的commit信息,然后在和本地进行merge,如果本地进行了已有commit信息,那么不会进行fast-forward,就会产生merge的commit信息。

 可以看到在远程有新的commit时,是无法push到远程的。

例如:分支情况如下

 

 

 

使用git pull时明显多了一个merge commit

  

 

 

使用git pull --rebase后

 

 

 

 

posted @ 2020-10-21 09:53  一花一世界!  阅读(6982)  评论(0编辑  收藏  举报