Git實(shí)戰(zhàn)(四)| Git分支管理實(shí)操,搞定在線合并和本地合并

類(lèi)似于SVN這種集中式版本管理,三年前剛來(lái)上海工作時(shí)候,在華為駐場(chǎng)上班,華為用的就是SVN,印象最深的就是那個(gè)小烏龜?shù)膱D標(biāo);后來(lái)到外面工作,漸漸發(fā)現(xiàn)用Git的非常多,慢慢學(xué)習(xí)了解發(fā)現(xiàn)Git這種分布式的版本管理確實(shí)很好很強(qiáng)大,后面也就重點(diǎn)學(xué)習(xí)Git的分支管理策略了(其實(shí)SVN我現(xiàn)在壓根就不會(huì)了,哈哈。。。)

centralized workflows
以Bitbucket的官方文檔的實(shí)例作為簡(jiǎn)單介紹:
例如Mary現(xiàn)在想要開(kāi)發(fā),在開(kāi)發(fā)前她可以通過(guò)checkout命令建立一個(gè)新的分支:

Feature Branch Workflow: comit changes
Before she starts developing a feature, Mary needs an isolated branch to work on. She can request a new branch with the following command
git checkout -b marys-feature master
然后Mary可以在這個(gè)本地進(jìn)行相關(guān)的更改:
git status
git add <some-file>
git commit
接著她可以不斷將本地修改上傳至特性分支的中心倉(cāng)庫(kù)中,直到自己全完修改完成

git push -u origin marys-feature

git push
然后,她在git gui(GitHub或GitLab等)中提交pull請(qǐng)求,請(qǐng)求將marys特性合并到master中,團(tuán)隊(duì)成員將自動(dòng)收到通知。
Mary的同事Bill收到了pr,Bill覺(jué)得在合并到正式項(xiàng)目中之前還需要做一些修改,于是在pr的回復(fù)中對(duì)Mary進(jìn)行告知,接著Mary繼續(xù)修改開(kāi)發(fā),完成后再次提交pr:
一旦Bill準(zhǔn)備接受pull request,有人需要將該特征merge到穩(wěn)定的項(xiàng)目中(這可以由Bill或Mary來(lái)完成)
git checkout master
git pull?
git pull?
origin marys-feature?
git push

在GitHub上進(jìn)行基本的演示(實(shí)際工作中,公司用的還是GitLab較多,后面會(huì)有總結(jié)演示)
1.1) 先使用git checkout -b命令來(lái)創(chuàng)建一個(gè)新的分支并切換到此分支中去,用git branch命令可查看當(dāng)前所處分支:
$ git checkout -b gitTestBranch?
Switched to a new branch 'gitTestBranch'?
$ git branch?
* gitTestBranch?
??master
1.2) 將readme.txt文件最后一行加入如下內(nèi)容并commit
I am a test engineer.
I want to study Git.
?branch gitTestBranch update

1.3) push到遠(yuǎn)程倉(cāng)庫(kù)并查看分支,首次push需要用git push -u 或git push --set-upstream 命令設(shè)置上下游的關(guān)聯(lián)關(guān)系:

在GitHub上查看master分支和gitTestBranch分支的對(duì)比,可見(jiàn)gitTestBranch已成功push:
master:

gitTestBranch:

1.4) 使用git log --graph --all --decorate=short命令可以查看提交的分支走向,如果分支較多的話就會(huì)出現(xiàn)如下效果:

1.5)這個(gè)時(shí)候我們可以通過(guò)pr對(duì)分支進(jìn)行merge:
發(fā)起pr
沒(méi)有conflict,可以直接merge

這個(gè)時(shí)候再看master分支,就已經(jīng)被成功合并了

2.1) 先在readme.txt文件中加入一行branch gitTestBranch update2,然后提交到遠(yuǎn)程分支中:
I am a test engineer.?
I want to study Git.
?branch gitTestBranch update1
branch gitTestBranch update2?
git commit -a -m "gitTestBranch second update"?
git push

2.2)通過(guò)fetch將gitTestBranch分支拿下來(lái)到本地,修改本地文件并合并
修改本地gitTestBranch分支,修改加入“branch gitTestBranch update3”并提交到遠(yuǎn)程分支
vi readme.txt?
I am a test engineer.?
I want to study Git.
branch gitTestBranch update1?
branch gitTestBranch update2?
branch gitTestBranch update3?
?$ git commit -a -m "third update"?
$ git push
2.3)master分支上fetch拿取遠(yuǎn)程gitTestBranch分支,修改沖突,合并提交
$ git checkout master
$ git fetch origin gitTestBranch
?$ git merge origin/gitTestBranch?
# fix conflict?
$ git commit -a -m "fix conflict"
$ git push
2.4)這時(shí)候在GitHub上進(jìn)行查看:
commit歷史中可見(jiàn)提交記錄:

檢查master,發(fā)現(xiàn)已經(jīng)被成功合并
