说来惭愧,以前弄git,老是焦头烂额,后来某只人肉wiki介绍了一个网站,http://learngitbranching.js.org/,发现简直是git小白的福音。
原来一直都是看各种git介绍的文章似懂非懂,真正用的时候脑子也转不过弯来。这个网站的好处是你可以尽情地练习~
前提条件是知道git add和git commit,git add 是把文件放到暂存区,而git commit是把文件从暂存区到仓库
下面的内容是我学习的笔记。
git commit
某个同学说,你就把git记录看成无数的commit,然后branch相当于指针,git就相当于commit们和指向它的指针们,后来想想觉得挺有道理的
我平时提交的时候,都是这样提交的
git commit -m "message"
这个游戏里面简化掉了
git commit
然后蓝色背景的表示初始状态,红色的表示要达成的目标
比如第一关,红色背景比蓝色北京多了两个结点,所以我们就执行两次commit
还有一个是当前指针指向,git一定会有一个当前指针,
git branch
branch理解为git的分支,就是在一个commit上面有两个指针,为啥总觉得像一条路有了岔路口
创建新分支有两种方式,比如创建newBranchName的分支
git branch newBranchName
git checkout newBranchName
第一行是创建新分支,第二行是把当前指针指向新分支
它们可以用一行解决
git checkout -b newBranchName
在新的指针上面继续commit,就相当于开了一条新路
git merge
开完新路之后可以合并,合并的一种方式是git merge
如上图所示,如果我们master分支想要合并bugFix的提交,那么可以
git merge bugFix
然后你就发现master这里新建了一个提交,这个提交又是bugFix的下一个提交,又是master的下一个提交
git rebase
git merge在很多分支的时候,会导致分支很乱,而第二种合并分支的方法是 git rebase。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
如下图,
如果用rebase合并的话
git rebase master
结果如下图
关于rebase,我的理解是将一个分支放到另外一个分支下面,其实rebase后面是带两个参数的
git rebase branch1 branch2
然后他们的分支就会按照,branch1,branch2的顺序排列,如果branch2省略,那么就指代当前分支。如上面的例子, git rebase master
,此时指针在bugFix后面,所以最终的结果是master在前,bugFix在后。
HEAD
有的时候会提醒分离的HEAD,其实HEAD是当前的指向,它可以指向提交,也可以指向分支。
如下图,如果用git checkout C1
的话,HEAD就从分支master脱离。原来HEAD指向master的时候,master指向C1, 所以它本质是指向C1的。
^和~
如果我们想要HEAD指向当前提交的上一个提交
比如说现在我们的HEAD指向了master,我们想要指向C1,那么
git checkout master^
就会变成
当然我们用
git checkout HEAD^
也能做到
如果我们想向前几个分支,那么可以使用~,比如向前移动两个分支
git checkout HEAD~2
git branch -f
有的时候我们想移动分支,那么就用到git branch -f了,它允许我们强制移动分支。
具体用法是
git branch -f branchName Location
比如我们想让master分支移动到HEAD指向的上一个提交。
git branch -f master HEAD^
有了这个命令以后,我们就可以让分支的指向自由移动了~
因此把
变成
相信也不难吧~
git checkout HEAD^
git branch -f master C6
git branch -f bugFix C0
get reset和git revert
他们都是用来撤销commit,不同的是,git reset适合本地的,而git revert适合远程的,也就是说如果 git reset适用于并没有同步到远程的commit,
比如,回退一个提交
git reset HEAD~1
reset以后,当前分支指针指向的就是你reset的时候提交的
你还可以通过传入这些标记来修改你的缓存区或工作目录:
--soft – 缓存区和工作目录都不会被改变
--mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
--hard – 缓存区和工作目录都同步到你指定的提交
而利用revert
git revert HEAD~1
git cherry-pick
cherry-pick能够将其他分支的提交复制到当前分支下面
比如下图
我们希望
只把side分支的C2和C4提交合并到master
git cherry-pick C2 C4
得到
交互式git rebase
当你想要改变当前分支的提交的时候,这个可以做到,比如说你想更改最近三个提交,那么
git rebase -i HEAD~3
然后再文本编辑器编辑就好了