git命令进阶

2019/04/21

新公司上班有天不小心把代码推到master了,一方面因为老大给我了管理员的权限,一方面是自己从来没想过自己可以成功的推代码到master,一般都会失败的,所以过了很久才反应过来。

第一反应是

git log
git reset <head>
git push --force

强行回退

但是看了下commit,发现自己的代码上边已经有好几个commit了,就是说其他人在我后边也推代码了,所以reset肯定不行了,这就很可怕了,当时没想出来,回头搜了一下,发现了revert这个命令。其实git并不会考虑不到这方面的问题,revert可以完美解决这个问题。

revert和reset

这两个命令都能回退代码。

比如我现在有两个commit,现在要回退到first。


git reset

如果使用reset方法,可以通过git log拿到first的commit,然后再通过git reset <first commit>回退代码。

因为reset之后落后于远程分支了,所以需要使用git push --force强制覆盖旧的代码

这个时候就没有second这个commit了

git revert

git revert和git reset的使用方法几乎一样,区别也很简单,revert是还原,reset是重置,听起来区别不大。

revert可以指定一个commit,并且还原到这个commit提交的时候。所以需要指定second的commit。并且这个会被视为是一个普通操作,相当于代码的删减操作。所以依然需要把代码重新推上去,但并不需要push --force。

所以代码里会多出来三个commit的,git默认记录revert为一个commit。但和reset实现的效果是一样的。而reset配合push --force可以把代码的commit从记录里完全删掉。所以reset其实是有风险的。

git log
git revert <second commit head>
git add .
git commit -m 'revert second'
git push


revert会指定一个commit revert,只会把这个commit的修改的代码还原,并不会回退其他人的commit,这个是他和reset最大的区别。

fetch和pull

pull作为一个使用git的人最初学到的命令之一就不做多的解释了,简单的说就是把本地的文件的commit head更新的和远程一致。

说白了就是把远程的代码拿到并且和本地的合并起来。

这也就是说pull做了两件事

1. 拿到代码

2. 合并

而git fetch其实做的就是拿到代码这一步。

所以git pull看起来像是

git fetch
git merge

同样的操作需要执行这两步,那这个到底有什么用呢

git fetch本身并不是用来拉取代码的,而是用来拉取远程仓库的信息的,所以git fetch之后,如果落后于远程几个commit,那么可以通过git status看到相应的提示,也可以通过git diff来查看文件被修改了哪些,但愿不愿意现在就把这些加入到自己的本地里就取决于自己的心情了。

所以git fetch就用在想知道远程的信息,但并不期望合并代码的时候。

git fetch是用的时候可能会把所有的远程信息都带到本地,如果本地没有这个分支,就会创建分支并把代码拉下来。所以如果没有 --set-upstream的话,使用git fetch也需要加上远程和分支比如

git fetch origin test

这样就不会拉取所有的分支的信息了。

rebase

通常我们开辟一个新的分支都是基于某个旧的分支的,比如当前分支在develop上,然后我们切一个新的分支叫做feature

git checkout -b feature

feature会有和develop分支一摸一样的commit,并且基于此在新的分支开发新的功能。

比如现在develop上只有一个commit

然后切换到feature上开发了一个大的功能


这个时候多了五个commit,但其实合并到develop的时候只希望有一个second就好了。

这个时候就能可以用到rebase了。

rebase的意思很好理解,re指的是重新,而base是基于,所以rebase就是基于原来的分支重新提交commit。

输入git rebase -i develop

会进入一个vim,可以看到五个commit之前都会有一个pick,然后是commit的head值,然后是commit的message。

pick的意思是使用。在注释里可以看到其他的选项,包括reword,edit,squash,fixup,exec和drop

而squash就是用来合并commit的。

只需要把除了第一个以外的每个pick改成squash,就能达到合并的效果。最后会进入一个重新编辑message的界面。或者根据提示输入

git rebase --continue

来进入编辑commit message的界面。

当然rebase还提供了一系列的功能来管理commit,可以达到各种各样的效果。rebase的drop也能实现撤销commit的功能。

commit -amend

一个非常有意思的命令,commit修正,一般用于commit的message写错了和文件漏提交了。

比如修改的时候忘了删除没用的测试代码,这个时候就可以使用这个命令。

git commit -amend执行之前需要先将代码放到暂存区,就是执行git add命令。执行之后会进入vim的上一个commit的messge编辑区,可以修改message,这个和rebase的edit功能类似,修改成功会把新的add的文件一块纳入上一个commit了。

嗨,请先登录

加载中...
(๑>ω<๑) 又是元气满满的一天哟