GIT使用—分支與合併

1、分支名

  • 分支名不能以斜線結尾
  • 分支名不能以減號開頭
  • 以斜槓分割的組件不能以點開頭(feature/.new)
  • 分支名的任何地方都不能包含連個連續的點
  • 分支名不能包含空格或空白符
  • 分支名不能包含波浪線~、插入符^、冒號:、問號?、星號*、左括號[,以及ASCII碼控制字符

2、建立分支

[root@localhost public_html]# git branch pu-1138

爲了在軟件2.3發佈版本上修復一個BUG,能夠指定rel-2.3的分支爲開始提交
[root@localhost public_html]# git branch pu-1138 rel-2.3

[root@localhost public_html]# git branch
* master
  pu-1138

[root@localhost public_html]# git show-branch
* [master] mv bar to foo
 ! [pu-1138] mv bar to foo
--
*+ [master] mv bar to foo
[root@localhost public_html]# git show-branch pu-1138
[pu-1138] mv bar to foo

例子:html

[root@localhost public_html]# git branch testing
[root@localhost public_html]# git branch
* master
  testing
[root@localhost public_html]# ls
foo.html  index.html
[root@localhost public_html]# echo 'testing' > test.txt
[root@localhost public_html]# ls
foo.html  index.html  test.txt
[root@localhost public_html]# git add .
[root@localhost 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
[root@localhost public_html]# ls
foo.html  index.html  test.txt
[root@localhost public_html]# git checkout testing
Switched to branch 'testing'
[root@localhost public_html]# ls
foo.html  index.html
[root@localhost public_html]# git checkout master
Switched to branch 'master'
[root@localhost public_html]# ls
foo.html  index.html  test.txt

[root@localhost public_html]# git checkout -b newtest
Switched to a new branch 'newtest'
[root@localhost public_html]# ls
foo.html  index.html  test.txt
[root@localhost public_html]# git rm test.txt
rm 'test.txt'
[root@localhost public_html]# ls
foo.html  index.html
[root@localhost 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
[root@localhost public_html]# git checkout master
Switched to branch 'master'
[root@localhost public_html]# ls
foo.html  index.html  test.txt

3、檢出分支

[root@localhost public_html]# git branch
* master
  pu-1138
[root@localhost public_html]# git checkout pu-1138
Switched to branch 'pu-1138'
[root@localhost public_html]# ls
foo.html  index.html
[root@localhost public_html]# git branch
  master
* pu-1138

4、刪除分支

[root@localhost public_html]# git branch -d pu-1138
Deleted branch pu-1138 (was aa431d9).
[root@localhost public_html]# git branch
* master

5、合併分支

(1)合併一個分支git

[root@localhost public_html]# git branch
* master
  newtest
  testing
[root@localhost public_html]# git checkout testing
Switched to branch 'testing'
[root@localhost public_html]# ls
foo.html  index.html
[root@localhost 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
[root@localhost public_html]# ls
foo.html  index.html  yes.html

(2)合併兩個分支vim

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

(3)有衝突的分支app

[root@localhost fenzhi_total]# git branch
  alternate
* master
[root@localhost fenzhi_total]# 
[root@localhost fenzhi_total]# 
[root@localhost fenzhi_total]# git checkout master
Already on 'master'
[root@localhost fenzhi_total]# cat >> file
Line 5 stuff
Line 6 stuff
[root@localhost fenzhi_total]# git commit -am "Add line 5 and 6"
[master 6e1cf57] Add line 5 and 6
 1 files changed, 2 insertions(+), 0 deletions(-)
[root@localhost fenzhi_total]# git checkout alternate
Switched to branch 'alternate'
[root@localhost 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
[root@localhost fenzhi_total]# cat >> file
Line 5 alternate stuff
Line 6 alternate stuff
[root@localhost 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
[root@localhost 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
[root@localhost 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(-)
[root@localhost 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
[root@localhost fenzhi_total]# git checkout master
Switched to branch 'master'
[root@localhost fenzhi_total]# git merge alternate
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

此時出現合併衝突
[root@localhost 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
[root@localhost 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

此時能夠選擇只取一邊的版本或兩邊混合(須要手動修改)
[root@localhost fenzhi_total]# vim file
[root@localhost fenzhi_total]# cat file 
Line 1 stuff
Line 2 stuff
Line 3 stuff
Line 4 alternate stuff
Line 5 alternate stuff
Line 6 stuff
[root@localhost fenzhi_total]# git add file
[root@localhost fenzhi_total]# git commit
[master 5a8e0fa] Merge branch 'alternate'
[root@localhost 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
[root@localhost fenzhi_total]# git log
commit 5a8e0fa2318cc9d9aa4171d8aaff0105c4a06331
Merge: 6e1cf57 4596a0d
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 16:24:48 2018 +0800

    Merge branch 'alternate'
    
    Conflicts:
        file
    
    change file

commit 4596a0d219ceb1ac33214a8b2f891d7788ea80e5
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 16:18:11 2018 +0800

    Add alternate line 5 and 6

commit 6e1cf5717cd1012f527262d3108c8fad22dc4dde
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 16:16:26 2018 +0800

    Add line 5 and 6

commit bdb04eec38411ea7d490054f4d236af783debb3c
Merge: 9f175ec c004281
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 16:13:20 2018 +0800

    Merge branch 'alternate'

commit c0042812ba692e1a16c0a5e0d9c9dc5e9b1f7a7e
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 16:12:39 2018 +0800

    Add alternate's line 4

commit 9f175ec6e0e9b85de029969bb1da897a84abc4f5
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 16:11:03 2018 +0800

    Another file

commit 2f793c27b2bc1ab5b046eec2790e88e751727566
Author: tong <tongxiaoda@anzhi.com>
Date:   Tue Feb 27 16:10:12 2018 +0800

    Initial 3 line file

(4)處理合並衝突3d

[root@localhost fz_t]# git init
Initialized empty Git repository in /root/fz_t/.git/
[root@localhost fz_t]# echo hello > hello
[root@localhost fz_t]# git add hello
[root@localhost 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
[root@localhost fz_t]# git checkout -b alt
Switched to a new branch 'alt'
[root@localhost fz_t]# echo world >> hello
[root@localhost fz_t]# echo 'Yay!' >> hello
[root@localhost fz_t]# git commit -am "One world"
[alt ea3c204] One world
 1 files changed, 2 insertions(+), 0 deletions(-)
[root@localhost fz_t]# git checkout master
Switched to branch 'master'
[root@localhost fz_t]# echo worlds >> hello
[root@localhost fz_t]# echo 'Yay!' >> hello
[root@localhost fz_t]# git commit -am "All worlds"
[master 8f316ee] All worlds
 1 files changed, 2 insertions(+), 0 deletions(-)
[root@localhost fz_t]# git merge alt
Auto-merging hello
CONFLICT (content): Merge conflict in hello
Automatic merge failed; fix conflicts and then commit the result.

定位衝突文件
[root@localhost 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")
[root@localhost fz_t]# git ls-files -u
100644 ce013625030ba8dba906f756967f9e9ca394464a 1   hello
100644 e63164d9518b1e6caf28f455ac86c8246f78ab70 2   hello
100644 562080a4c6518e1bf67a9f58a32a67bff72d4f00 3   hello

檢查衝突
[root@localhost 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!
[root@localhost 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!

或使用如下命令檢查
[root@localhost fz_t]# git log --merge --left-right -p hello
commit <8f316ee211109affd61eb89c001ac139f7274406
Author: tong <tongxiaoda@anzhi.com>
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 <tongxiaoda@anzhi.com>
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
[root@localhost fz_t]# cat hello 
hello
worldly ones
Yay!
[root@localhost 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!

結束解決衝突
[root@localhost fz_t]# git add hello
[root@localhost fz_t]# git ls-files -s
100644 01e406a245782525e6b02cadf6df25e212563967 0   hello
[root@localhost fz_t]# cat .git/MERGE_MSG 
Merge branch 'alt'

Conflicts:
    hello
[root@localhost fz_t]# git commit
[master af5cf67] Merge branch 'alt'
[root@localhost fz_t]# git show
commit af5cf675e311952e5377e5942dd1d7689427eec8
Merge: 8f316ee ea3c204
Author: tong <tongxiaoda@anzhi.com>
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)停止或從新啓動合併code

git reset --hard HEAD
把工做目錄和索引都還原到git merge命令以前

git reset --hard ORIG_HEAD
停止或在它已經結束後放棄
相關文章
相關標籤/搜索