1. 程式人生 > >GIT 分支管理:建立與合併分支、解決合併衝突

GIT 分支管理:建立與合併分支、解決合併衝突

建立與合併分支 首先,我們建立dev分支,然後切換到dev分支:

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

git checkout命令加上-b引數表示建立並切換,相當於以下兩條命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然後,用git branch命令檢視當前分支:

$ git branch
* dev
  master

git branch命令會列出所有分支,當前分支前面會標一個*號。 然後,我們就可以在dev分支上正常提交,比如對readme.txt做個修改,加上一行:

create new branch dev..

然後提交:

$ git add readme.txt
$ git commit -m "create new branch...."
[dev 45ae9a9] create new branch....
 1 file changed, 1 insertion(+)

現在,dev分支的工作完成,我們就可以切換回master分支:

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

現在,我們把dev分支的工作成果合併到master分支上:

$ git merge dev
Updating 90bc1f7..45ae9a9
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

git merge命令用於合併指定分支到當前分支。合併後,再檢視readme.txt的內容,就可以看到,和dev分支的最新提交是完全一樣的。 注意到上面的Fast-forward資訊,Git告訴我們,這次合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。 當然,也不是每次合併都能Fast-forward,我們後面會講其他方式的合併。 合併完成後,就可以放心地刪除dev分支了:

$ git branch -d dev
Deleted branch dev (was 45ae9a9).

刪除後,檢視branch,就只剩下master分支了:

$ git branch
* master

因為建立、合併和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。

小結 Git鼓勵大量使用分支:

檢視分支:git branch

建立分支:git branch

切換分支:git checkout

建立+切換分支:git checkout -b

合併某分支到當前分支:git merge

刪除分支:git branch -d

解決衝突 人生不如意之事十之八九,合併分支往往也不是一帆風順的。

準備新的feature1分支,繼續我們的新分支開發:

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

修改readme.txt最後一行,改為:

create new branch feature1..

在feature1分支上提交:

$ git add readme.txt
$ git commit -m "create new branch feature1 first modify"
[feature1 b4309b0] create new branch feature1 first modify
 1 file changed, 1 insertion(+)

切換到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)

Git還會自動提示我們當前master分支比遠端的master分支要超前1個提交。

在master分支上把readme.txt檔案的最後一行改為:

goback master....

提交:

$ git add readme.txt
$ git commit -m "goback master first modify"
[master 0b56936] goback master first modify
 1 file changed, 1 insertion(+)

這種情況下,Git無法執行“快速合併”,只能試圖把各自的修改合併起來,但這種合併就可能會有衝突,我們試試看:

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

果然衝突了!Git告訴我們,readme.txt檔案存在衝突,必須手動解決衝突後再提交。git status也可以告訴我們衝突的檔案:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

我們可以直接檢視readme.txt的內容:

test git modify second
study git
three add
four add modify
five add modify
six add modify
seven add modify
eight add modify ...
create new branch dev..
<<<<<<< HEAD
goback master....
=======
create new branch feature1..
>>>>>>> feature1

Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,我們修改如下後儲存:

test git modify second
study git
three add
four add modify
five add modify
six add modify
seven add modify
eight add modify ...
create new branch dev..
create new branch feature1..
goback master....

再提交:

$ git add readme.txt
$ git commit -m "fixed conflicts"
[master 0f3d64a] fixed conflicts

用帶引數的git log也可以看到分支的合併情況:


$ git log --graph --pretty=oneline --abbrev-commit
*   0f3d64a fixed conflicts
|\
| * b4309b0 create new branch feature1 first modify
* | 0b56936 goback master first modify
|/
* 45ae9a9 create new branch....
* 90bc1f7 test name
* c1bdf43 test commit
* dd34c9a no add but commit,because use other parameter
* 4ed30d1 eight modify dify
* b45ca96 eight modify
* 9332d40 seven modify
* 72c6f9b six modify
* f64b5a0 five modify
* de8fd65 four modify
* 83a4b1e three modify
* 01c05cf two modify
* 1acafa7 first modify
* 09c1bba first git

最後,刪除feature1分支:

$ git branch -d feature1
Deleted branch feature1 (was b4309b0).

小結 當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。

用git log --graph命令可以看到分支合併圖。