首先我们在github创建了一个项目test,默认存在分支master,我们新建分支develop,本地用idea打开两个窗口,便于我们进行演示,两个窗口都checkout到develop分支,然后clone项目
1、我们演示reset和revert的区别
先解释一下:第一个图片是reset,一共是123三个提交,当我们使用git reset --hard HARD~1时,指针移动到2提交点,随之提交点3消失,此时远程分支还是在3提交点,所以远程分支比我们多了一个版本,所以此时要是推送到远程就必须使用 git push -f 进行强制推送。
第二个图片是revert,当想要回退到提交点2时,找到提交点2的commit_id(可在log->HARD里面找),然后git revert commit_2,此时本地会产生一个新的提交点,然后commit push
下面解释一下reset的三个参数:soft mixed hard
演示一下:
如图,我在本地提交个00000,版本号version是e50f066,我们先看看此时git的状态,使用git status
如图可以看到,我们本地比远程多了一个版本,因为我只commit还没pushd到远程分支,所以git提示我们使用git push将本地push到远端
好了,此时我们使用:git reset --soft b67ca50
我们发现此时提交个00000没了,再看看此时git状态
看到了吧,他说我们有个test.txt可以提交,说明test.txt刚才提交的00000已经从本地版本库拿出来了,现在放在暂存区中;
那我们再看看:git reset --mixed b67ca50
同样我们发现提交个00000没了,但是此时git状态
文件时红色的,说明什么?是不是--mixed命令将test.txt从本地版本库拿出来,现在放在了工作区,也就是说他比soft多使用了git checkout --命令
最后我们看看:git reset --hard b67ca50
同样我们发现此时提交个00000没了,再看看此时git状态
看到没,工作区的00000也没了
所以这三个参数一个比一个狠
下面看看revert
在你电脑.git文件夹下找到log,打开HARD文件,找到上一个提交的id:b67ca50b9f59489e82684d2caa623157005006a2
然后使用git revert b67ca50b9f59489e82684d2caa623157005006a2
执行完之后00000的提交版本没有消失,此时看看git状态
看到没,然我们解决一下,然后add commit
此时产生了一个新的提交点
2、rebase和merge
rebase和merge都是用来合并分支,他俩之间的区别是什么?我们举个例子比较一下,我们在test-master目录提交了11111并push到远端分支
我们在另一个idea的test目录同一行提交222222
此时我们执行pull,肯定会产生冲突
解决完冲突我们提交上去,然后在test-master执行pull操作,22222被更新出来了,但我们看提交记录
提交记录分叉了,但如果我们使用rebase操作呢,即git pull --rebase origin develop
也是让我们解决冲突,解决完冲突提交上去,再在test-master执行pull操作
提交记录时一条直线没有分叉
所以这两个操作都可以用于解决冲突
rebase还可以整合提交记录:
合并多个commit为一个完整commit
当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把如下分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。
现在我们多次提交几个数字,
我们使用rebase命令将这三次提交合并为1个提交
git rebase -i HEAD~3
上面未被注释的部分列出的是我们本次rebase操作包含的所有提交,下面注释部分是git为我们提供的命令说明。每一个commit id 前面的pick表示指令类型,git 为我们提供了以下几个命令:
-
pick:保留该commit(缩写:p)
-
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
-
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
-
squash:将该commit和前一个commit合并(缩写:s)
-
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
-
exec:执行shell命令(缩写:x)
-
drop:我要丢弃该commit(缩写:d)
这相当于Linux的vi操作,所以我们可以修改内容
看到3次提交变成了一条提交
3、git fetch和git pull的区别
git pull 比git fetch多了meger操作