說來慚愧贺氓,以前弄git罗洗,老是焦頭爛額教寂,后來某只人肉wiki介紹了一個(gè)網(wǎng)站籍滴,http://learngitbranching.js.org/,發(fā)現(xiàn)簡(jiǎn)直是git小白的福音贰镣。
原來一直都是看各種git介紹的文章似懂非懂呜象,真正用的時(shí)候腦子也轉(zhuǎn)不過彎來。這個(gè)網(wǎng)站的好處是你可以盡情地練習(xí)~
前提條件是知道git add和git commit碑隆,git add 是把文件放到暫存區(qū)恭陡,而git commit是把文件從暫存區(qū)到倉(cāng)庫
下面的內(nèi)容是我學(xué)習(xí)的筆記。
git commit
某個(gè)同學(xué)說上煤,你就把git記錄看成無數(shù)的commit休玩,然后branch相當(dāng)于指針,git就相當(dāng)于commit們和指向它的指針們劫狠,后來想想覺得挺有道理的
我平時(shí)提交的時(shí)候拴疤,都是這樣提交的
git commit -m "message"
這個(gè)游戲里面簡(jiǎn)化掉了
git commit
然后藍(lán)色背景的表示初始狀態(tài),紅色的表示要達(dá)成的目標(biāo)
比如第一關(guān)独泞,紅色背景比藍(lán)色北京多了兩個(gè)結(jié)點(diǎn)呐矾,所以我們就執(zhí)行兩次commit
還有一個(gè)是當(dāng)前指針指向,git一定會(huì)有一個(gè)當(dāng)前指針懦砂,
git branch
branch理解為git的分支凫佛,就是在一個(gè)commit上面有兩個(gè)指針,為啥總覺得像一條路有了岔路口
創(chuàng)建新分支有兩種方式孕惜,比如創(chuàng)建newBranchName的分支
git branch newBranchName
git checkout newBranchName
第一行是創(chuàng)建新分支,第二行是把當(dāng)前指針指向新分支
它們可以用一行解決
git checkout -b newBranchName
在新的指針上面繼續(xù)commit晨炕,就相當(dāng)于開了一條新路
git merge
開完新路之后可以合并衫画,合并的一種方式是git merge
如上圖所示,如果我們master分支想要合并bugFix的提交瓮栗,那么可以
git merge bugFix
然后你就發(fā)現(xiàn)master這里新建了一個(gè)提交削罩,這個(gè)提交又是bugFix的下一個(gè)提交瞄勾,又是master的下一個(gè)提交
git rebase
git merge在很多分支的時(shí)候,會(huì)導(dǎo)致分支很亂弥激,而第二種合并分支的方法是 git rebase进陡。Rebase 實(shí)際上就是取出一系列的提交記錄,“復(fù)制”它們微服,然后在另外一個(gè)地方逐個(gè)的放下去趾疚。
如下圖,
如果用rebase合并的話
git rebase master
結(jié)果如下圖
關(guān)于rebase以蕴,我的理解是將一個(gè)分支放到另外一個(gè)分支下面糙麦,其實(shí)rebase后面是帶兩個(gè)參數(shù)的
git rebase branch1 branch2
然后他們的分支就會(huì)按照,branch1丛肮,branch2的順序排列赡磅,如果branch2省略,那么就指代當(dāng)前分支宝与。如上面的例子焚廊, git rebase master
,此時(shí)指針在bugFix后面习劫,所以最終的結(jié)果是master在前咆瘟,bugFix在后。
HEAD
有的時(shí)候會(huì)提醒分離的HEAD榜聂,其實(shí)HEAD是當(dāng)前的指向搞疗,它可以指向提交,也可以指向分支须肆。
如下圖匿乃,如果用git checkout C1
的話,HEAD就從分支master脫離豌汇。原來HEAD指向master的時(shí)候幢炸,master指向C1, 所以它本質(zhì)是指向C1的。
^和~
如果我們想要HEAD指向當(dāng)前提交的上一個(gè)提交
比如說現(xiàn)在我們的HEAD指向了master拒贱,我們想要指向C1宛徊,那么
git checkout master^
就會(huì)變成
當(dāng)然我們用
git checkout HEAD^
也能做到
如果我們想向前幾個(gè)分支,那么可以使用~逻澳,比如向前移動(dòng)兩個(gè)分支
git checkout HEAD~2
git branch -f
有的時(shí)候我們想移動(dòng)分支闸天,那么就用到git branch -f了,它允許我們強(qiáng)制移動(dòng)分支斜做。
具體用法是
git branch -f branchName Location
比如我們想讓master分支移動(dòng)到HEAD指向的上一個(gè)提交苞氮。
git branch -f master HEAD^
有了這個(gè)命令以后,我們就可以讓分支的指向自由移動(dòng)了~
因此把
變成
相信也不難吧~
git checkout HEAD^
git branch -f master C6
git branch -f bugFix C0
get reset和git revert
他們都是用來撤銷commit瓤逼,不同的是笼吟,git reset適合本地的库物,而git revert適合遠(yuǎn)程的,也就是說如果 git reset適用于并沒有同步到遠(yuǎn)程的commit贷帮,
比如戚揭,回退一個(gè)提交
git reset HEAD~1
reset以后,當(dāng)前分支指針指向的就是你reset的時(shí)候提交的
你還可以通過傳入這些標(biāo)記來修改你的緩存區(qū)或工作目錄:
--soft – 緩存區(qū)和工作目錄都不會(huì)被改變
--mixed – 默認(rèn)選項(xiàng)撵枢。緩存區(qū)和你指定的提交同步民晒,但工作目錄不受影響
--hard – 緩存區(qū)和工作目錄都同步到你指定的提交
而利用revert
git revert HEAD~1
git cherry-pick
cherry-pick能夠?qū)⑵渌种У奶峤粡?fù)制到當(dāng)前分支下面
比如下圖
我們希望
只把side分支的C2和C4提交合并到master
git cherry-pick C2 C4
得到
交互式git rebase
當(dāng)你想要改變當(dāng)前分支的提交的時(shí)候,這個(gè)可以做到诲侮,比如說你想更改最近三個(gè)提交镀虐,那么
git rebase -i HEAD~3
然后再文本編輯器編輯就好了