GIT使用—分支与合并

Posted 边学边做

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GIT使用—分支与合并相关的知识,希望对你有一定的参考价值。

一、分支名

  • 分支名不能以斜线结尾
  • 分支名不能以减号开头
  • 以斜杠分割的组件不能以点开头(feature/.new)
  • 分支名的任何地方都不能包含连个连续的点
  • 分支名不能包含空格或空白符
  • 分支名不能包含波浪线~、插入符^、冒号:、问号?、星号*、左括号[,以及ASCII码控制字符

二、创建分支

[[email protected] public_html]# git branch pu-1138

为了在软件2.3发布版本上修复一个BUG,可以指定rel-2.3的分支为开始提交
[[email protected] public_html]# git branch pu-1138 rel-2.3

[[email protected] public_html]# git branch
* master
  pu-1138

[[email protected] public_html]# git show-branch
* [master] mv bar to foo
 ! [pu-1138] mv bar to foo
--
*+ [master] mv bar to foo
[[email protected] public_html]# git show-branch pu-1138
[pu-1138] mv bar to foo

例子:

[[email protected] public_html]# git branch testing
[[email protected] public_html]# git branch
* master
  testing
[[email protected] public_html]# ls
foo.html  index.html
[[email protected] public_html]# echo ‘testing‘ > test.txt
[[email protected] public_html]# ls
foo.html  index.html  test.txt
[[email protected] public_html]# git add .
[[email protected] public_html]# git commit -m "add test.txt"
[master b0b257c] add test.txt
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 test.txt
[[email protected] public_html]# ls
foo.html  index.html  test.txt
[[email protected] public_html]# git checkout testing
Switched to branch ‘testing‘
[[email protected] public_html]# ls
foo.html  index.html
[[email protected] public_html]# git checkout master
Switched to branch ‘master‘
[[email protected] public_html]# ls
foo.html  index.html  test.txt

[[email protected] public_html]# git checkout -b newtest
Switched to a new branch ‘newtest‘
[[email protected] public_html]# ls
foo.html  index.html  test.txt
[[email protected] public_html]# git rm test.txt
rm ‘test.txt‘
[[email protected] public_html]# ls
foo.html  index.html
[roo[email protected] public_html]# git commit -am "removed test.txt"
[newtest 480b789] removed test.txt
 1 files changed, 0 insertions(+), 1 deletions(-)
 delete mode 100644 test.txt
[[email protected] public_html]# git checkout master
Switched to branch ‘master‘
[[email protected] public_html]# ls
foo.html  index.html  test.txt

三、检出分支

[[email protected] public_html]# git branch
* master
  pu-1138
[[email protected] public_html]# git checkout pu-1138
Switched to branch ‘pu-1138‘
[[email protected] public_html]# ls
foo.html  index.html
[[email protected] public_html]# git branch
  master
* pu-1138

四、删除分支

[[email protected] public_html]# git branch -d pu-1138
Deleted branch pu-1138 (was aa431d9).
[[email protected] public_html]# git branch
* master

五、合并分支

(1)合并一个分支

[[email protected] public_html]# git branch
* master
  newtest
  testing
[[email protected] public_html]# git checkout testing
Switched to branch ‘testing‘
[[email protected] public_html]# ls
foo.html  index.html
[[email protected] public_html]# git merge newtest
Updating aa431d9..b488b19
Fast-forward
 yes.html |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 yes.html
[[email protected] public_html]# ls
foo.html  index.html  yes.html

(2)合并两个分支

[[email protected] ~]# mkdir fenzhi_total
[[email protected] ~]# cd fenzhi_total/
[[email protected] fenzhi_total]# ls
[[email protected] fenzhi_total]# git init
Initialized empty Git repository in /root/fenzhi_total/.git/
[[email protected] fenzhi_total]# cat > file
Line 1 stuff
Line 2 stuff
Line 3 stuff
[[email protected] fenzhi_total]# ls
file
[[email protected] fenzhi_total]# git add file
[[email protected] fenzhi_total]# git commit -m "Initial 3 line file"
[master (root-commit) 2f793c2] Initial 3 line file
 1 files changed, 3 insertions(+), 0 deletions(-)
 create mode 100644 file
[[email protected] fenzhi_total]# cat > other_file
Here is stuff on another file!
[[email protected] fenzhi_total]# git add other_file 
[[email protected] fenzhi_total]# git commit -m "Another file"
[master 9f175ec] Another file
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 other_file
[[email protected] fenzhi_total]# git checkout -b alternate master^
Switched to a new branch ‘alternate‘
[[email protected] fenzhi_total]# git show-branch
* [alternate] Initial 3 line file
 ! [master] Another file
--
 + [master] Another file
*+ [alternate] Initial 3 line file
[[email protected] fenzhi_total]# cat >> file
Line 4 alternate stuff
[[email protected] fenzhi_total]# git commit -am "Add alternate‘s line 4"
[alternate c004281] Add alternate‘s line 4
 1 files changed, 1 insertions(+), 0 deletions(-)
[[email protected] fenzhi_total]# git checkout master
Switched to branch ‘master‘
[[email protected] fenzhi_total]# git status
# On branch master
nothing to commit (working directory clean)
[[email protected] fenzhi_total]# ls
file  other_file
[[email protected] fenzhi_total]# git merge alternate
Merge made by recursive.
 file |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
[[email protected] fenzhi_total]# git log --graph --pretty=oneline --abbrev-commit
*   bdb04ee Merge branch ‘alternate‘
|\  
| * c004281 Add alternate‘s line 4
* | 9f175ec Another file
|/  
* 2f793c2 Initial 3 line file
[[email protected] fenzhi_total]# cat file 
Line 1 stuff
Line 2 stuff
Line 3 stuff
Line 4 alternate stuff

(3)有冲突的分支

[[email protected] fenzhi_total]# git branch
  alternate
* master
[[email protected] fenzhi_total]# 
[[email protected] fenzhi_total]# 
[[email protected] fenzhi_total]# git checkout master
Already on ‘master‘
[[email protected] fenzhi_total]# cat >> file
Line 5 stuff
Line 6 stuff
[[email protected] fenzhi_total]# git commit -am "Add line 5 and 6"
[master 6e1cf57] Add line 5 and 6
 1 files changed, 2 insertions(+), 0 deletions(-)
[[email protected] fenzhi_total]# git checkout alternate
Switched to branch ‘alternate‘
[[email protected] fenzhi_total]# git show-branch
* [alternate] Add alternate‘s line 4
 ! [master] Add line 5 and 6
--
 + [master] Add line 5 and 6
*+ [alternate] Add alternate‘s line 4
[[email protected] fenzhi_total]# cat >> file
Line 5 alternate stuff
Line 6 alternate stuff
[[email protected] fenzhi_total]# cat file
Line 1 stuff
Line 2 stuff
Line 3 stuff
Line 4 alternate stuff
Line 5 alternate stuff
Line 6 alternate stuff
[[email protected] fenzhi_total]# git diff
diff --git a/file b/file
index a29c52b..802acf8 100644
--- a/file
+++ b/file
@@ -2,3 +2,5 @@ Line 1 stuff
 Line 2 stuff
 Line 3 stuff
 Line 4 alternate stuff
+Line 5 alternate stuff
+Line 6 alternate stuff
[[email protected] fenzhi_total]# git commit -am "Add alternate line 5 and 6"
[alternate 4596a0d] Add alternate line 5 and 6
 1 files changed, 2 insertions(+), 0 deletions(-)
[[email protected] fenzhi_total]# git show-branch
* [alternate] Add alternate line 5 and 6
 ! [master] Add line 5 and 6
--
*  [alternate] Add alternate line 5 and 6
 + [master] Add line 5 and 6
*+ [alternate^] Add alternate‘s line 4
[[email protected] fenzhi_total]# git checkout master
Switched to branch ‘master‘
[[email protected] fenzhi_total]# git merge alternate
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

此时出现合并冲突
[[email protected] fenzhi_total]# git diff
diff --cc file
index 4d77dd1,802acf8..0000000
--- a/file
+++ b/file
@@@ -2,5 -2,5 +2,10 @@@ Line 1 stuf
  Line 2 stuff
  Line 3 stuff
  Line 4 alternate stuff
++<<<<<<< HEAD
 +Line 5 stuff
 +Line 6 stuff
++=======
+ Line 5 alternate stuff
+ Line 6 alternate stuff
++>>>>>>> alternate
[[email protected] fenzhi_total]# cat file
Line 1 stuff
Line 2 stuff
Line 3 stuff
Line 4 alternate stuff
<<<<<<< HEAD
Line 5 stuff
Line 6 stuff
=======
Line 5 alternate stuff
Line 6 alternate stuff
>>>>>>> alternate

此时可以选择只取一边的版本或两边混合(需要手动修改)
[[email protected] fenzhi_total]# vim file
[[email protected] fenzhi_total]# cat file 
Line 1 stuff
Line 2 stuff
Line 3 stuff
Line 4 alternate stuff
Line 5 alternate stuff
Line 6 stuff
[[email protected] fenzhi_total]# git add file
[[email protected] fenzhi_total]# git commit
[master 5a8e0fa] Merge branch ‘alternate‘
[[email protected] fenzhi_total]# git show-branch
! [alternate] Add alternate line 5 and 6
 * [master] Merge branch ‘alternate‘
--
 - [master] Merge branch ‘alternate‘
+* [alternate] Add alternate line 5 and 6
[[email protected] fenzhi_total]# git log
commit 5a8e0fa2318cc9d9aa4171d8aaff0105c4a06331
Merge: 6e1cf57 4596a0d
Author: tong <[email protected]>
Date:   Tue Feb 27 16:24:48 2018 +0800

    Merge branch ‘alternate‘
    
    Conflicts:
        file
    
    change file

commit 4596a0d219ceb1ac33214a8b2f891d7788ea80e5
Author: tong <[email protected]>
Date:   Tue Feb 27 16:18:11 2018 +0800

    Add alternate line 5 and 6

commit 6e1cf5717cd1012f527262d3108c8fad22dc4dde
Author: tong <[email protected]>
Date:   Tue Feb 27 16:16:26 2018 +0800

    Add line 5 and 6

commit bdb04eec38411ea7d490054f4d236af783debb3c
Merge: 9f175ec c004281
Author: tong <[email protected]>
Date:   Tue Feb 27 16:13:20 2018 +0800

    Merge branch ‘alternate‘

commit c0042812ba692e1a16c0a5e0d9c9dc5e9b1f7a7e
Author: tong <[email protected]>
Date:   Tue Feb 27 16:12:39 2018 +0800

    Add alternate‘s line 4

commit 9f175ec6e0e9b85de029969bb1da897a84abc4f5
Author: tong <[email protected]>
Date:   Tue Feb 27 16:11:03 2018 +0800

    Another file

commit 2f793c27b2bc1ab5b046eec2790e88e751727566
Author: tong <[email protected]>
Date:   Tue Feb 27 16:10:12 2018 +0800

    Initial 3 line file

(4)处理合并冲突

[[email protected] fz_t]# git init
Initialized empty Git repository in /root/fz_t/.git/
[[email protected] fz_t]# echo hello > hello
[[email protected] fz_t]# git add hello
[[email protected] fz_t]# git commit -m "Initial hello file"
[master (root-commit) 296dfa0] Initial hello file
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 hello
[[email protected] fz_t]# git checkout -b alt
Switched to a new branch ‘alt‘
[[email protected] fz_t]# echo world >> hello
[[email protected] fz_t]# echo ‘Yay!‘ >> hello
[[email protected] fz_t]# git commit -am "One world"
[alt ea3c204] One world
 1 files changed, 2 insertions(+), 0 deletions(-)
[[email protected] fz_t]# git checkout master
Switched to branch ‘master‘
[[email protected] fz_t]# echo worlds >> hello
[[email protected] fz_t]# echo ‘Yay!‘ >> hello
[[email protected] fz_t]# git commit -am "All worlds"
[master 8f316ee] All worlds
 1 files changed, 2 insertions(+), 0 deletions(-)
[[email protected] fz_t]# git merge alt
Auto-merging hello
CONFLICT (content): Merge conflict in hello
Automatic merge failed; fix conflicts and then commit the result.

定位冲突文件
[[email protected] fz_t]# git status
# On branch master
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      hello
#
no changes added to commit (use "git add" and/or "git commit -a")
[[email protected] fz_t]# git ls-files -u
100644 ce013625030ba8dba906f756967f9e9ca394464a 1   hello
100644 e63164d9518b1e6caf28f455ac86c8246f78ab70 2   hello
100644 562080a4c6518e1bf67a9f58a32a67bff72d4f00 3   hello

检查冲突
[[email protected] fz_t]# git diff HEAD
diff --git a/hello b/hello
index e63164d..1f2f61c 100644
--- a/hello
+++ b/hello
@@ -1,3 +1,7 @@
 hello
+<<<<<<< HEAD
 worlds
+=======
+world
+>>>>>>> alt
 Yay!
[[email protected] fz_t]# git diff MERGE_HEAD
diff --git a/hello b/hello
index 562080a..1f2f61c 100644
--- a/hello
+++ b/hello
@@ -1,3 +1,7 @@
 hello
+<<<<<<< HEAD
+worlds
+=======
 world
+>>>>>>> alt
 Yay!

或使用以下命令检查
[[email protected] fz_t]# git log --merge --left-right -p hello
commit <8f316ee211109affd61eb89c001ac139f7274406
Author: tong <[email protected]>
Date:   Tue Feb 27 16:28:35 2018 +0800

    All worlds

diff --git a/hello b/hello
index ce01362..e63164d 100644
--- a/hello
+++ b/hello
@@ -1 +1,3 @@
 hello
+worlds
+Yay!

commit >ea3c2044aae6b375d3cba2fa0ac9ff1d78dd6779
Author: tong <[email protected]>
Date:   Tue Feb 27 16:27:53 2018 +0800

    One world

diff --git a/hello b/hello
index ce01362..562080a 100644
--- a/hello
+++ b/hello
@@ -1 +1,3 @@
 hello
+world
+Yay!

不使用任何版本,继续修改file
[[email protected] fz_t]# cat hello 
hello
worldly ones
Yay!
[[email protected] fz_t]# git diff
diff --cc hello
index e63164d,562080a..0000000
--- a/hello
+++ b/hello
@@@ -1,3 -1,3 +1,3 @@@
  hello
- worlds
 -world
++worldly ones
  Yay!

结束解决冲突
[[email protected] fz_t]# git add hello
[[email protected] fz_t]# git ls-files -s
100644 01e406a245782525e6b02cadf6df25e212563967 0   hello
[[email protected] fz_t]# cat .git/MERGE_MSG 
Merge branch ‘alt‘

Conflicts:
    hello
[[email protected] fz_t]# git commit
[master af5cf67] Merge branch ‘alt‘
[[email protected] fz_t]# git show
commit af5cf675e311952e5377e5942dd1d7689427eec8
Merge: 8f316ee ea3c204
Author: tong <[email protected]>
Date:   Tue Feb 27 16:38:29 2018 +0800

    Merge branch ‘alt‘
    
    Conflicts:
        hello

diff --cc hello
index e63164d,562080a..01e406a
--- a/hello
+++ b/hello
@@@ -1,3 -1,3 +1,3 @@@
  hello
- worlds
 -world
++worldly ones
  Yay!

(5)中止或重新启动合并

git reset --hard HEAD
把工作目录和索引都还原到git merge命令之前

git reset --hard ORIG_HEAD
中止或在它已经结束后放弃

以上是关于GIT使用—分支与合并的主要内容,如果未能解决你的问题,请参考以下文章

git如何合并两个分支代码

Git 合并远程分支

Git 分支管理 创建与合并分支

git分支创建与合并

git 怎么提交合并分支的部分代码

Git 分支代码合并到主干的命令