GitHub-分支管理01


 

參考博文:廖雪峰Git教程

 

1. 分支說明

       分支在實際中有什么用呢?假設你准備開發一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由於代碼還沒寫完,不完整的代碼庫會導致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險。

 

       現在有了分支,就不用怕了。你創建了一個屬於你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發完畢后,再一次性合並到原來的分支上,這樣,既安全,又不影響別人工作。

 

 

2. 創建與合並分支

2.1. 創建且使用分支

1 [root@mini05 zhangtest]# pwd
2 /opt/git_repository/zhangtest
3 [root@mini05 zhangtest]# git checkout -b dev
4 Switched to a new branch 'dev'

 

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

1 $ git branch dev  # 創建分支
2 $ git checkout dev  # 使用分支
3 Switched to branch 'dev'

 

查看當前分支

1 [root@mini05 zhangtest]# git branch  # 當前分支前面會標一個*2 * dev
3   master

 

在當前分支提交信息

1 [root@mini05 zhangtest]# cat test.info 
2 111
3 222
4 333
5 where are you from?  # 增加的內容
6 [root@mini05 zhangtest]# git add test.info
7 [root@mini05 zhangtest]# git commit -m "add test.info"
8 [dev 068d030] add test.info
9  1 file changed, 1 insertion(+)

 

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

 

2.2. 切回到master並合並分支

切回master分支

1 [root@mini05 zhangtest]# git checkout master
2 Switched to branch 'master'
3 [root@mini05 zhangtest]# git branch 
4   dev
5 * master
6 [root@mini05 zhangtest]# cat test.info 
7 111
8 222
9 333

 

       切換回master分支后,再查看一個test.info文件,剛才添加的內容不見了!因為那個提交是在dev分支上,而master分支此刻的提交點並沒有變

 

合並dev分支

       把dev分支的工作成果合並到master分支上

 1 [root@mini05 zhangtest]# git merge dev
 2 Updating c752e64..068d030
 3 Fast-forward
 4  test.info | 1 +
 5  1 file changed, 1 insertion(+)
 6 [root@mini05 zhangtest]# cat test.info 
 7 111
 8 222
 9 333
10 where are you from?

       合並后,再查看test.info的內容,就可以看到,和dev分支的最新提交是完全一樣的。

 

2.3. 刪除dev分支

1 [root@mini05 zhangtest]# git branch -d dev  # 刪除分支 
2 Deleted branch dev (was 068d030).
3 [root@mini05 zhangtest]# git branch
4 * master

 

2.4. 分支說明【重點】

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

 

 

3. 解決分支沖突

3.1. 創建且使用分支

1 [root@mini05 zhangtest]# git checkout -b feature1
2 Switched to a new branch 'feature1'
3 [root@mini05 zhangtest]# tail -n3 README.md  # 最后一行為新加的
4 ccc
5 ddd
6 Creating a new branch is quick AND simple.

 

添加並提交到本地倉庫

1 [root@mini05 zhangtest]# git add README.md
2 [root@mini05 zhangtest]# git commit -m "RE new line"
3 [feature1 75b1490] RE new line
4  1 file changed, 1 insertion(+)

 

3.2. 切回到master且新增提交

切換到master分支

1 [root@mini05 zhangtest]# git checkout master
2 Switched to branch 'master'
3 Your branch is ahead of 'origin/master' by 1 commit.
4   (use "git push" to publish your local commits)

 

       在master分支上把readme.txt文件的最后添加一行並提交

1 [root@mini05 zhangtest]# tail -n3 README.md  # 最后一行為添加
2 ccc
3 ddd
4 Creating a new branch is quick & simple.
5 [root@mini05 zhangtest]# git add README.md
6 [root@mini05 zhangtest]# git commit -m "ma commit"
7 [master 41de15c] ma commit
8  1 file changed, 1 insertion(+)

 

       現在,master分支和feature1分支各自都分別有新的提交,變成了這樣

  

 

3.3. 合並分支處理

嘗試合並feature1

1 [root@mini05 zhangtest]# git merge feature1
2 Auto-merging README.md
3 CONFLICT (content): Merge conflict in README.md
4 Automatic merge failed; fix conflicts and then commit the result.

 

查看沖突的文件

 1 [root@mini05 zhangtest]# git status
 2 # On branch master
 3 # Your branch is ahead of 'origin/master' by 2 commits.
 4 #   (use "git push" to publish your local commits)
 5 #
 6 # You have unmerged paths.
 7 #   (fix conflicts and run "git commit")
 8 #
 9 # Unmerged paths:
10 #   (use "git add <file>..." to mark resolution)
11 #
12 #    both modified:      README.md
13 #
14 no changes added to commit (use "git add" and/or "git commit -a")

 

直接查看沖突內容並修改

 1 [root@mini05 zhangtest]# cat README.md # 查看沖突內容
 2 # zhangtest
 3 zhangtest
 4 張三
 5 Git is a distributed version control system.
 6 Git is free software.
 7 111
 8 222
 9 Git tracks changes.
10 aaa
11 bbb
12 ccc
13 ddd
14 <<<<<<< HEAD
15 Creating a new branch is quick & simple.
16 =======
17 Creating a new branch is quick AND simple.
18 >>>>>>> feature1

 

 

修改后保留的內容並再次提交

 1 [root@mini05 zhangtest]# cat README.md 
 2 # zhangtest
 3 zhangtest
 4 張三
 5 Git is a distributed version control system.
 6 Git is free software.
 7 111
 8 222
 9 Git tracks changes.
10 aaa
11 bbb
12 ccc
13 ddd
14 Creating a new branch is quick AND simple.
15 [root@mini05 zhangtest]# git add README.md
16 [root@mini05 zhangtest]# git commit -m "conflict fixed"
17 [master 56c6e0c] conflict fixed

 

       現在,master分支和feature1分支變成了下圖所示:

 

       用帶參數的git log也可以看到分支的合並情況

 1 [root@mini05 zhangtest]# git log --graph --pretty=oneline --abbrev-commit
 2 *   56c6e0c conflict fixed
 3 |\  
 4 | * 75b1490 RE new line
 5 * | 41de15c ma commit
 6 |/  
 7 * 068d030 add test.info
 8 * c752e64 add info
 9 * 3b7db1c add aaa.txt
10 * c795cfc del aaa.txt
11 * 6d0226b add aaa.txt
12 * b293c46 git tracks changes
13 * 53f0f2e understand how stage works
14 * 65a58f2 add info
15 * d4fb57e Update README.md
16 * e730676 Initial commit

 

3.4. 刪除之前創建的分支

1 [root@mini05 zhangtest]# git branch -d feature1
2 Deleted branch feature1 (was 75b1490).

 

 

4. 分支管理策略【推薦】

       通常,合並分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支后,會丟掉分支信息。

       如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。

       下面我們實戰一下 --no-ff 方式的git merge

 

4.1. 創建並使用分支

1 [root@mini05 zhangtest]# git checkout -b dev
2 Switched to a new branch 'dev'

 

修改readme.txt文件,並提交.

1 [root@mini05 zhangtest]# tail -n3 README.md  # 最后一行為新增行
2 Creating a new branch is quick AND simple.
3 feature2
4 dev brach new
5 [root@mini05 zhangtest]# git add README.md
6 [root@mini05 zhangtest]# git commit -m "dev brach new" 
7 [dev ef9042a] dev brach new
8  1 file changed, 1 insertion(+)

 

4.2. 切回到master並合並分支

切回到master分支

1 [root@mini05 zhangtest]# git checkout master
2 Switched to branch 'master'
3 Your branch is ahead of 'origin/master' by 5 commits.
4   (use "git push" to publish your local commits)
5 [root@mini05 zhangtest]# git branch 
6   dev
7 * master

 

       准備合並dev分支,請注意 --no-ff參數,表示禁用Fast forward

1 [root@mini05 zhangtest]# git merge --no-ff -m "merge with no-ff" dev
2 Merge made by the 'recursive' strategy.
3  README.md | 1 +
4  1 file changed, 1 insertion(+)

       因為本次合並要創建一個新的commit,所以加上-m參數,把commit描述寫進去。

 

4.3. 用git log看看分支歷史

       合並后,我們用git log看看分支歷史:

 1 [root@mini05 zhangtest]# git log --graph --pretty=oneline --abbrev-commit
 2 *   aadf8b4 merge with no-ff
 3 |\  
 4 | * ef9042a dev brach new
 5 |/  
 6 * 31230a8 feature2
 7 *   56c6e0c conflict fixed
 8 |\  
 9 | * 75b1490 RE new line
10 * | 41de15c ma commit
11 |/  
12 * 068d030 add test.info
13 * c752e64 add info
14 * 3b7db1c add aaa.txt
15 ………………

 

       可以看到,不使用Fast forward模式,merge后就像這樣:

 

4.4. 分支策略【重點】

       在實際開發中,我們應該按照幾個基本原則進行分支管理:

       首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;

       那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合並到master上,在master分支發布1.0版本;

       你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合並就可以了。

 

       所以,團隊合作的分支看起來就像這樣:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM