Git學(xué)習(xí)筆記(三)

分支管理

分支在實(shí)際中的作用是喜每,再給當(dāng)前項(xiàng)目開發(fā)新功能的時(shí)候间护,可以將新功能未完成的代碼庫提交到獨(dú)立的分支企蹭,但整體完成后再合并到主分支白筹。從而既保證了原項(xiàng)目能正常運(yùn)作,又杜絕了新功能丟失進(jìn)度的風(fēng)險(xiǎn)谅摄。

創(chuàng)建與合并分支

創(chuàng)建dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b參數(shù)表示創(chuàng)建并切換徒河,相當(dāng)于以下兩條命令:

$ git branch dev
$ git checkout dev

git branch命令查看當(dāng)前分支:

$ git branch
* dev
  master

git branch命令會(huì)列出所有分支,并在當(dāng)前分支前標(biāo)*號(hào)送漠。

現(xiàn)在可以在dev分支上進(jìn)行修改顽照,比如在readme.txt加上一行:

Creating a new branch is quick.

在提交并切換到master分支后,可以發(fā)現(xiàn)master分支的提交點(diǎn)沒有變化闽寡。

接下來合并master分支和dev分支:

$ git merge dev       
Updating b3ce958..f39faf9
Fast-forward
 readme.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Fast-forward信息表示此次合并是”快進(jìn)模式“代兵,直接把master指向dev的提交爷狈。

合并完成后可以放心刪除dev分支:

$ git branch -d dev 
Deleted branch dev (was f39faf9).

解決沖突

在合并分支是也可能會(huì)出現(xiàn)一些問題奢人,比如:
創(chuàng)建一個(gè)新的分支featurel,并將readme.txt文件的最后一行改為:

Creating a new branch is quick AND simple.

featurel分支上提交:

$ git add readme.txt
$ git commit -m "And simple"
[featurel 724fe08] And simple
 1 file changed, 1 insertion(+), 1 deletion(-)

切換到master分支:

$ git checkout master 
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

此時(shí)Git還會(huì)提示本地master分支進(jìn)度比遠(yuǎn)程master分支超前一個(gè)提交淆院。
如果我們?cè)?code>master分支上把readme.txt文件的最后一行修改為:

Creating a new branch is quick & simple.

并提交何乎,那么master分支與featurel分支都分別有了新的提交,如圖:

這種情況下土辩,Git無法執(zhí)行“快速合并”支救,只能試圖把各自的修改合并起來,但這種合并就可能會(huì)有沖突拷淘,比如:

$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

readme.txt文件存在沖突各墨,需要手動(dòng)解決之后才能提交。此時(shí)可用git status查找沖突的文件启涯。

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both modified:      readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

此時(shí)編輯readme.txt可以看到:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

Git用<<<<<<<贬堵,=======恃轩,>>>>>>>標(biāo)記出不同分支的內(nèi)容。

再次修改如下后保存:

Creating a new branch is quick and simple.

并提交:

$ git add readme.txt 
$ git commit -m "conflict fixed"
[master f648aa0] conflict fixed

現(xiàn)在的分支情況就如下圖所示:

沖突處理

用帶參數(shù)的git log也可以看到分支的合并情況:

*   f648aa0  conflict fixed
|\  
| * 44f163b AND simple
* | 2a2a0d6 & simple
|/  
* 2db35f3 brach test
...

最后黎做,刪除feature1分支:

$ git branch -d feature1
Deleted branch feature1 (was 44f163b).

分支管理策略

合并分支時(shí)叉跛,加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支蒸殿,能看出來曾經(jīng)做過合并筷厘,而fast forward合并就看不出來曾經(jīng)做過合并。
操作如下:

$ git checkout -b dev
Switched to a new branch 'dev'

$ git add readme.txt 
$ git commit -m "add merge"
[dev 6224937] add merge
 1 file changed, 1 insertion(+)

$ git checkout master
Switched to branch 'master'

$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
 readme.txt |    1 +
 1 file changed, 1 insertion(+)

此時(shí)用git log可查看分支歷史:

$ git log --graph --pretty=oneline --abbrev-commit
*   7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
*   59bc1cb conflict fixed
...

Bug分支

Git提供了stash功能可以暫存不方便提交的工作宏所,以便于切換到其他分支時(shí)不丟失當(dāng)前進(jìn)度酥艳。
示例:

$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge

可用git stash list查看暫存的工作。
恢復(fù)則有兩種選擇爬骤,一是用git stash apply恢復(fù)充石,但是恢復(fù)后,stash內(nèi)容并不刪除霞玄,你需要用git stash drop來刪除骤铃;
另一種方式是用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪了溃列。

Future 分支

軟件開發(fā)中劲厌,總有無窮無盡的新的功能要不斷添加進(jìn)來膛薛。

添加一個(gè)新功能時(shí)听隐,肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支搞亂了哄啄,所以雅任,每添加一個(gè)新功能,最好新建一個(gè)feature分支咨跌,在上面開發(fā)沪么,完成后,合并锌半,最后禽车,刪除該feature分支。

現(xiàn)在刊殉,終于接到了一個(gè)新任務(wù):開發(fā)代號(hào)為Vulcan的新功能殉摔,該功能計(jì)劃用于下一代星際飛船。

于是準(zhǔn)備開發(fā):

$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'

5分鐘后记焊,開發(fā)完畢:

$ git add vulcan.py
$ git status
# On branch feature-vulcan
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   vulcan.py
#
$ git commit -m "add feature vulcan"
[feature-vulcan 756d4af] add feature vulcan
 1 file changed, 2 insertions(+)
 create mode 100644 vulcan.py

切回dev逸月,準(zhǔn)備合并:

$ git checkout dev

一切順利的話,feature分支和bug分支是類似的遍膜,合并碗硬,然后刪除瓤湘。

但是,就在此時(shí)恩尾,接到上級(jí)命令弛说,因經(jīng)費(fèi)不足,新功能必須取消特笋!

雖然白干了剃浇,但是這個(gè)分支還是必須就地銷毀:

$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.

銷毀失敗。Git友情提醒猎物,feature-vulcan分支還沒有被合并虎囚,如果刪除,將丟失掉修改蔫磨,如果要強(qiáng)行刪除淘讥,需要使用命令git branch -D feature-vulcan

現(xiàn)在強(qiáng)行刪除:

$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 756d4af).

刪除成功堤如!

多人協(xié)作

當(dāng)從遠(yuǎn)程倉庫克隆時(shí)蒲列,實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對(duì)應(yīng)起來了,并且搀罢,遠(yuǎn)程倉庫的默認(rèn)名稱是origin蝗岖。
要查看遠(yuǎn)程庫的信息,用git remote

$ git remote
origin

或者榔至,用git remote -v顯示更詳細(xì)的信息:

$ git remote  -v 
orgin   https://github.com/yimingjin1995/learngit.git (fetch)
orgin   https://github.com/yimingjin1995/learngit.git (push)

上面顯示了可以抓取和推送的origin的地址抵赢。如果沒有推送權(quán)限,就看不到push的地址唧取。

推送分支

推送分支铅鲤,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫。推送時(shí)枫弟,要指定本地分支邢享。例如:

$ git push origin dev
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市淡诗,隨后出現(xiàn)的幾起案子骇塘,更是在濱河造成了極大的恐慌,老刑警劉巖韩容,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件款违,死亡現(xiàn)場離奇詭異,居然都是意外死亡宙攻,警方通過查閱死者的電腦和手機(jī)奠货,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來座掘,“玉大人递惋,你說我怎么就攤上這事柔滔。” “怎么了萍虽?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵睛廊,是天一觀的道長。 經(jīng)常有香客問我杉编,道長超全,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任邓馒,我火速辦了婚禮嘶朱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘光酣。我一直安慰自己疏遏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布救军。 她就那樣靜靜地躺著财异,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唱遭。 梳的紋絲不亂的頭發(fā)上戳寸,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音拷泽,去河邊找鬼疫鹊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跌穗,可吹牛的內(nèi)容都是我干的订晌。 我是一名探鬼主播虏辫,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蚌吸,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了砌庄?” 一聲冷哼從身側(cè)響起羹唠,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娄昆,沒想到半個(gè)月后佩微,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萌焰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年哺眯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扒俯。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奶卓,死狀恐怖一疯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夺姑,我是刑警寧澤墩邀,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站盏浙,受9級(jí)特大地震影響眉睹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜废膘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一竹海、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丐黄,春花似錦站削、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至菩鲜,卻和暖如春园细,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背接校。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工猛频, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛛勉。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓鹿寻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诽凌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子毡熏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容