git-分支管理

mayihetu發表於2018-03-16
檢視分支
git branch        檢視本地分支
git branch -a    檢視本地分支和遠端分支
git branch -v    檢視本地各個分支及最後一個提交物件的資訊
git branch -av    檢視本地和遠端各個分支及最後一個提交物件的資訊    
git branch --merged        篩選出已經與當前分支合併的分支(也就是說哪些分支是當前分支的直接上游。)
git branch --no-merged        篩選出尚未與當前分支合併的分支(Git 1.5.6 以上版本)
建立、切換分支

預設基於當前分支

git branch <BranchName >
git checkout <BranchName >
git checkout -b <BranchName >

指定源分支,git log 與源分支保持一致。

git checkout -b branch-name <srcBranch >
git checkout -b branch-name origin/<srcBranch >
git checkout --track origin/<srcBranch >     與上一個命令作用相同,分支名與遠端一致

基於本地分支新建的分支,pull 和 push 不能成功:There is no tracking information for the current branch.
基於遠端的,預設關聯到了遠端分支。
git clone下來的倉庫,預設只有master分支,若想要新建與遠端其他分支對應的分支,使用第二/三條命令

合併分支

預設Fast forward,合併某分支到當前分支, 正常無衝突合併完成後,檢視當前分支log, 看不出來合併過,只是多了一些提交

$ git merge <BranchName>

–no-ff引數,表示禁用Fast forward,檢視當前分支log, 可以看出合併過

$ git merge --no-ff -m " " <BranchName> 

生成一條commit log, Merge branch `<BranchName>` into master

衝突情況

手動解決,然後add、commit,手動更改的檔案只體現在本分支(master),被合併分支(conflict)內容無變化。conflict merge master 不會再衝突。
本分支log中,當前分支與被合併分支的commit資訊按時間排列,最新的是both。解決過後,再去被合併分支merge,無衝突。通常,合併分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支資訊。如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支資訊。

$ git log --graph --pretty=oneline --abbrev-commit //可以看合併情況
重新命名分支

重新命名本地

git branch -m oldbranchname newbranchname

重新命名遠端分支

只能通過先刪除遠端分支,然後重新命名本地分支,再重新提交一個遠端分支
刪除分支

刪除本地

$ git branch -d <BranchName>
$ git branch -D <BranchName> 

有新產生的commit沒有在當前分支體現的時候,簡單地用 git branch -d 刪除該分支會提示錯誤,因為那樣做會丟失資料 D強制刪除,git branch –no-merged檢視未在當前分支合併的分支。親手實驗結果,branch5 有新的commit之後,合併到branch3,則在branch3下可以執行刪除branch5,而在branch2下會提示-D。

刪除遠端分支

$ git push origin --delete <BranchName>     Git v1.7.0之後
$ git push origin -d <BranchName>
$ git push origin :<BranchName>     Git v1.7.0之前,推送一個空分支到遠端分支,其實相當於刪除遠端分支
遠端協作

推送分支到遠端

$ git push origin branch-name    把本地分支推送到遠端對應分支,如果該遠端分支不存在,則會被新建
$ git push -u origin branch-name     基於以上,並且建立關聯關係
$ git push origin branch:master    非對應分支推送,本地branch分支推送到遠端master分支 <src>:<dst>

建立本地分支和遠端分支的關聯, 體現在 .git/config檔案,可以手動配置

$ git branch --set-upstream branch-name origin/branch-name;

push衝突

解決衝突,commit,push.
你的本地commit資訊和遠端庫最近更新的commit資訊都在,分別顯示基於共同節點的差異,按時間先後排序。
解決衝突後的commit資訊,也在。

詳述:

Git把每次提交串成一條時間線,這條時間線就是一個分支。HEAD指向master,master指向提交,所以,HEAD指向的就是當前分支。每次提交,master分支都會向前移動一步,這樣,隨著不斷提交,master分支的線也越來越長。當我們建立新的分支dev時,Git新建了一個指標叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上。Git建立一個分支很快,因為除了增加一個dev指標,改改HEAD的指向,工作區的檔案都沒有任何變化!

不過,從現在開始,對工作區的修改和提交就是針對dev分支了,比如新提交一次後,dev指標往前移動一步,而master指標不變。假如我們在dev上的工作完成了,就可以把dev合併到master上。Git怎麼合併呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合併,fast-forward。所以Git合併分支也很快!就改改指標,工作區內容也不變!合併完分支後,甚至可以刪除dev分支。刪除dev分支就是把dev指標給刪掉,刪掉後,我們就剩下了一條master分支。真是太神奇了,你看得出來有些提交是通過分支完成的嗎?

注意到合併成功後的Fast-forward資訊,Git告訴我們,這次合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。因為建立、合併和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。

相關文章