Git應用進階(二)

Git進階(二)

===============================================================================

概述:


===============================================================================

Git 分支

1.分支命名法則及常用命令

master(主幹分支) 是指向指定分支的最近一次提交;

dev 是指向dev分支的最近一次提交;

不管有多少分支,活動分支只能有一個;

head 一定是指向某個分支的,head表示  映射了當前工作目錄當中所反映的最近一次提交;即 head始終指向活動分支的最近一次提交;

分支命名法則

  • 可以使用"/",但不能使用"/"結尾;

  • 不能以 "-" 開頭;

  • 以位於 "/" 後面的組件,不能以 "." 開頭;

  • 不能使用連續的 "...";

  • 不能使用空白字符" ";

  • 不能使用"^","~","?","*","[" 等符號

必須唯一,分支的名字始終指向目標分支的最近一次提交;

git branch :列出,創建及刪除分支

  • git branch BRANCH_NAME [START_COMMIT]

  • git branch  -d  BRANCH_NAME  刪除分支

git show-branch:查看分支及其相關的提交

git  checkout 

  • git  checkout  <branch> 檢出分支

演示1:git 創建分支

[root@node1 test]# ls
first.sh  INSTALL  readmin  subdir
[root@node1 test]# git branch --list
* master   # 帶"*"表示當前分支
[root@node1 test]# git log
commit 3c0b6864718ec8f8aebb5b66fbfd65b757504169 (HEAD -> master)
Author: watao <[email protected]>
Date:   Mon Aug 19 23:06:00 2019 +0800

    v0.0.2

commit b0e9cc432d3adb683963686a2eec197129ef48b8
Author: watao <[email protected]>
Date:   Tue Jul 16 23:26:38 2019 +0800

    v0.0.1
[root@node1 test]# git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   first.sh

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	readmin

[root@node1 test]# git commit -m 'v1.0'
[master 13051f2] v1.0
 1 file changed, 4 insertions(+)
 create mode 100644 first.sh

[root@node1 test]# git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	readmin

nothing added to commit but untracked files present (use "git add" to track)

[root@node1 test]# git ls-files -s
100644 b6a56662e48ee60ef2d65fd2b00dd555e758b7fa 0	INSTALL
100644 1809e7ac283fd186a50d97b1462d2d27396f9b42 0	first.sh
100644 a4ec1ecd97368714ba8b5c8d002b1a24647bb7ec 0	subdir/1.txt

[root@node1 test]# git add readmin
[root@node1 test]# git ls-files -s
100644 b6a56662e48ee60ef2d65fd2b00dd555e758b7fa 0	INSTALL
100644 1809e7ac283fd186a50d97b1462d2d27396f9b42 0	first.sh
100644 8bf9463e75dfb20077fafb8358ee3cb471dd7900 0	readmin
100644 a4ec1ecd97368714ba8b5c8d002b1a24647bb7ec 0	subdir/1.txt

[root@node1 test]# git commit -m 'v1.1'
[master e522483] v1.1
 1 file changed, 1 insertion(+)
 create mode 100644 readmin

[root@node1 test]# git log
commit e522483313931f3dbc914ff6e132f5cd205f7d62 (HEAD -> master)
Author: watao <[email protected]>
Date:   Wed Aug 21 22:48:52 2019 +0800

    v1.1

commit 13051f2788b17981a72f641e6b30bc8bea0f2e38
Author: watao <[email protected]>
Date:   Wed Aug 21 22:46:23 2019 +0800

    v1.0

commit 3c0b6864718ec8f8aebb5b66fbfd65b757504169
Author: watao <[email protected]>
Date:   Mon Aug 19 23:06:00 2019 +0800

    v0.0.2

commit b0e9cc432d3adb683963686a2eec197129ef48b8
Author: watao <[email protected]>
Date:   Tue Jul 16 23:26:38 2019 +0800

    v0.0.1
[root@node1 test]# git branch
* master

# 指明1.0版本創建分支
[root@node1 test]# git branch dev 13051f
[root@node1 test]# git branch
  dev
* master

[root@node1 test]# git branch bug/first
[root@node1 test]# git branch
  bug/first
  dev
* master

演示2:git show-branch  查看分支

#  git show-branch 查看具體的分支信息
[root@node1 test]# git show-branch
! [bug/first] v1.1
 ! [dev] v1.0
  * [master] v1.1
---
+ * [bug/first] v1.1
++* [dev] v1.0


[root@node1 test]# git show-branch dev
[dev] v1.0
[root@node1 test]# 
[root@node1 test]# git show-branch bug/first
[bug/first] v1.1

演示3:git checkout BRANCH_NAME  切換分支

[root@node1 taotao]# git checkout dev  #切換分支
Switched to branch 'dev'
[root@node1 taotao]# 
[root@node1 taotao]# git branch --list 
  bug/first
* dev
  master
[root@node1 taotao]# 
[root@node1 taotao]# git show-branch
! [bug/first] v1.1
 * [dev] v1.0
  ! [master] v1.1
---
+ + [bug/first] v1.1
+*+ [dev] v1.0
[root@node1 taotao]# 
[root@node1 taotao]# 
[root@node1 taotao]# git log
commit 5d4298d6fdcbb6276e69f002e7148210124e52d9 (HEAD -> dev)
Author: watao <[email protected]>
Date:   Wed Oct 9 22:04:34 2019 +0800

    v1.0

commit b9182448b3e9503ce5fd09edb5b378f612209d01
Author: watao <[email protected]>
Date:   Wed Oct 9 21:05:05 2019 +0800

    v0.0.2

commit 1b5d8e0fea57e85045c8d98f12e379fdc73138bc
Author: watao <[email protected]>
Date:   Tue Oct 8 21:24:06 2019 +0800

    v0.0.1
    
#############################
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
[root@node1 taotao]# 
[root@node1 taotao]# git status
On branch dev
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   first.sh

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

[root@node1 taotao]# git add first.sh
[root@node1 taotao]# git commit -m "v1.1-dev"  
[dev 587719d] v1.1-dev
 1 file changed, 1 insertion(+)
 
[root@node1 taotao]# git log
commit 587719dd3920429904c2b2a24637f20ecd20c4e0 (HEAD -> dev)
Author: watao <[email protected]>
Date:   Fri Oct 11 22:34:41 2019 +0800

    v1.1-dev

commit 5d4298d6fdcbb6276e69f002e7148210124e52d9
Author: watao <[email protected]>
Date:   Wed Oct 9 22:04:34 2019 +0800

    v1.0

commit b9182448b3e9503ce5fd09edb5b378f612209d01
Author: watao <[email protected]>
Date:   Wed Oct 9 21:05:05 2019 +0800

    v0.0.2

commit 1b5d8e0fea57e85045c8d98f12e379fdc73138bc
Author: watao <[email protected]>
Date:   Tue Oct 8 21:24:06 2019 +0800

    v0.0.1
    
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"

# 切回主分支,再次查看first.sh,發現還是原來的,因爲master分支並沒有提交新的操作
[root@node1 taotao]# git checkout master
Switched to branch 'master'
[root@node1 taotao]# 
[root@node1 taotao]# cat first.sh 
#!/bin/bash
echo "hello world"

# 不被追蹤的文件在所有分支上都可以看見
[root@node1 taotao]# git checkout dev
Switched to branch 'dev'
[root@node1 taotao]# cat first.sh 
#!/bin/bash
echo "hello world"
echo "new date"
[root@node1 taotao]# 
[root@node1 taotao]# vim second.sh
[root@node1 taotao]# cat second.sh 
#!/bin/bash
echo "second.sh"
[root@node1 taotao]# ls
first.sh  INSTALL  second.sh  subdir
[root@node1 taotao]# 
[root@node1 taotao]# git checkout master
Switched to branch 'master'
[root@node1 taotao]# 
[root@node1 taotao]# ls
first.sh  INSTALL  readmin  second.sh  subdir
[root@node1 taotao]# cat second.sh 
#!/bin/bash
echo "second.sh"

# 添加到索引發現在所有分支上依然可以看見
[root@node1 taotao]# git add second.sh
[root@node1 taotao]# git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   second.sh

[root@node1 taotao]# git checkout dev
A	second.sh
Switched to branch 'dev'
[root@node1 taotao]# git status
On branch dev
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   second.sh
	
#在dev分支上提交
[root@node1 taotao]# git commit -m "v1.1.1-dev"
[dev 21a0411] v1.1.1-dev
 1 file changed, 2 insertions(+)
 create mode 100644 second.sh
[root@node1 taotao]# git status
On branch dev
nothing to commit, working tree clean

#再次切回master分支,發現second.sh 已經沒有了
[root@node1 taotao]# git checkout master
Switched to branch 'master'
[root@node1 taotao]# ls
first.sh  INSTALL  readmin  subdir
[root@node1 taotao]# git status
On branch master
nothing to commit, working tree clean

#在主分支創建一個second文件,然後切回dev分支報錯,因爲和dev分支中已提交的second 發生衝突
[root@node1 taotao]# echo "#XIUXIU" > second.sh
[root@node1 taotao]# git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	second.sh

nothing added to commit but untracked files present (use "git add" to track)
[root@node1 taotao]# git checkout dev
error: The following untracked working tree files would be overwritten by checkout:
second.sh
Please move or remove them before you switch branches.
Aborting
[root@node1 taotao]# git add second.sh
[root@node1 taotao]# git checkout dev
error: Your local changes to the following files would be overwritten by checkout:
second.sh
Please commit your changes or stash them before you switch branches.
Aborting
#刪除master主分支的second後,順利切換到dev分支
[root@node1 taotao]# git rm -f second.sh
rm 'second.sh'
[root@node1 taotao]# git checkout dev
Switched to branch 'dev'
[root@node1 taotao]# git status
On branch dev
nothing to commit, working tree clean
[root@node1 taotao]# git show-branch
! [bug/first] v1.1
 * [dev] v1.1.1-dev
  ! [master] v1.1
---
 *  [dev] v1.1.1-dev
 *  [dev^] v1.1-dev
+ + [bug/first] v1.1
+*+ [dev~2] v1.0
[root@node1 taotao]# git show-branch --more=10
! [bug/first] v1.1
 * [dev] v1.1.1-dev
  ! [master] v1.1
---
 *  [dev] v1.1.1-dev
 *  [dev^] v1.1-dev
+ + [bug/first] v1.1
+*+ [dev~2] v1.0
+*+ [dev~3] v0.0.2
+*+ [dev~4] v0.0.1
演示4:git checkout -d BRANCH_NAME 刪除分支
[root@node1 taotao]# git branch -d bug/first 
Deleted branch bug/first (was 5685269).
[root@node1 taotao]# git branch --list
  dev
* master

1.合併分支


★相關概念


合併基礎:要合併的分支的最近一次的共同提交;


我們的版本:當前分支的最近一次提交;


他們的版本:要合並進來的分支的最近一次提交;


☉無衝突合併:


git checkout master;   檢出到主分支


git status   檢查是否有未提交的信息


git merge BRANCH_NAME   從他們的版本合併到我們的版本


git log --graph --pretty=oneline --abbrev-commit   以圖形的方式查看


演示1:無衝突的合併

[root@node1 taotao]# git branch --list
  dev
* master
[root@node1 taotao]# 
[root@node1 taotao]# 
[root@node1 taotao]# git merge dev
Merge made by the 'recursive' strategy.
 first.sh  | 1 +
 second.sh | 2 ++
 2 files changed, 3 insertions(+)
 create mode 100644 second.sh
[root@node1 taotao]# 
[root@node1 taotao]# git status
On branch master
nothing to commit, working tree clean
[root@node1 taotao]# git show-branch
! [dev] v1.1.1-dev
 * [master] Merge branch 'dev'
--
 - [master] Merge branch 'dev'
+* [dev] v1.1.1-dev
[root@node1 taotao]# git log --graph --pretty=oneline --abbrev-commit
*   43d8e9a (HEAD -> master) Merge branch 'dev'
|\  
| * 21a0411 (dev) v1.1.1-dev
| * 587719d v1.1-dev
* | 5685269 v1.1
|/  
* 5d4298d v1.0
* b918244 v0.0.2
* 1b5d8e0 v0.0.1

演示2:有衝突的合併

[root@node1 taotao]# echo "taotaohuihui" > my.txt
[root@node1 taotao]# git add my.txt
[root@node1 taotao]# git commit -m "v2.0"
[master 1df3da7] v2.0
 1 file changed, 1 insertion(+)
 create mode 100644 my.txt
 
 [root@node1 taotao]# git log --graph --pretty=oneline --abbrev-commit
* 1df3da7 (HEAD -> master) v2.0   # 新創建的提交
*   43d8e9a Merge branch 'dev'
|\  
| * 21a0411 (dev) v1.1.1-dev
| * 587719d v1.1-dev
* | 5685269 v1.1
|/  
* 5d4298d v1.0
* b918244 v0.0.2
* 1b5d8e0 v0.0.1
[root@node1 taotao]# git branch dev
fatal: A branch named 'dev' already exists.   #dev分支存在不能創建相同的,實際上可以刪除了,因爲已經合併到master分支上去了
[root@node1 taotao]# 
[root@node1 taotao]# 
[root@node1 taotao]# git branch fotfix   # 在master 2.0 的基礎上常見fotfix分支
[root@node1 taotao]# git show-branch
! [dev] v1.1.1-dev
 ! [fotfix] v2.0
  * [master] v2.0
---
 +* [fotfix] v2.0
 -- [fotfix^] Merge branch 'dev'
++* [dev] v1.1.1-dev
[root@node1 taotao]# echo "third line" >> first.sh   # 修改master分支的內容
[root@node1 taotao]# cat first.sh 
#!/bin/bash
echo "hello world"
echo "new date"
third line
[root@node1 taotao]# git add first.sh
[root@node1 taotao]# git commit -m "v2.1"
[master 697a6c5] v2.1
 1 file changed, 1 insertion(+)
[root@node1 taotao]# git show-branch
! [dev] v1.1.1-dev
 ! [fotfix] v2.0
  * [master] v2.1
---
  * [master] v2.1
 +* [fotfix] v2.0
 -- [fotfix^] Merge branch 'dev'
++* [dev] v1.1.1-dev
[root@node1 taotao]# git checkout fotfix  #切換到fotfix分支
Switched to branch 'fotfix'
[root@node1 taotao]# ls
first.sh  INSTALL  my.txt  readmin  second.sh  subdir
[root@node1 taotao]# 
[root@node1 taotao]# echo "new line" >> first.sh   # 編輯first文件並提交
[root@node1 taotao]# cat first.sh
#!/bin/bash
echo "hello world"
echo "new date"
new line
[root@node1 taotao]# git add first.sh
[root@node1 taotao]# git commit -m "v2.0-1"
[fotfix 26b42ef] v2.0-1
 1 file changed, 1 insertion(+)
 
 [root@node1 taotao]# git show-branch
! [dev] v1.1.1-dev
 * [fotfix] v2.0-1
  ! [master] v2.1
---
 *  [fotfix] v2.0-1
  + [master] v2.1
 *+ [fotfix^] v2.0
 -- [fotfix~2] Merge branch 'dev'
+*+ [dev] v1.1.1-dev
# 切回主分支,然後合併 fotfix分支,發現報錯,即內容發生衝突。需手動修復衝突後再合併
[root@node1 taotao]# git checkout master
Switched to branch 'master'
[root@node1 taotao]# 
[root@node1 taotao]# 
[root@node1 taotao]# git merge fotfix 
Auto-merging first.sh
CONFLICT (content): Merge conflict in first.sh
Automatic merge failed; fix conflicts and then commit the result.
不能合併成功的文件,發現三個版本中 first.sh 內容各不相同
[root@node1 taotao]# git ls-files
INSTALL
first.sh
first.sh
first.sh
my.txt
readmin
second.sh
subdir/1.txt
[root@node1 taotao]# 
[root@node1 taotao]# git ls-files --unmerged
100644 816a1b1e686cf6adb716b10e1a9eed870b2f18fa 1first.sh   # "1" 表示合併基礎
100644 3adec3b3bf2616c52eaba36bd8af2e79e9ef6495 2first.sh   # "2" 表示我們的版本
100644 e45ccd5a231f9debdd84ffd621cdc3acfc8d15f1 3first.sh   # "3" 表示他們的版本
[root@node1 taotao]# cat first.sh 
#!/bin/bash
echo "hello world"
echo "new date"
<<<<<<< HEAD
third line
=======
new line
>>>>>>> fotfix
[root@node1 taotao]# git diff
diff --cc first.sh
index 3adec3b,e45ccd5..0000000
--- a/first.sh
+++ b/first.sh
@@@ -1,4 -1,4 +1,8 @@@
  #!/bin/bash
  echo "hello world"
  echo "new date"
++<<<<<<< HEAD     "<<<<"或">>>>>"爲三方提交符號
 +third line  #爲主分支最近一次提交的內容
++=======
+ new line
++>>>>>>> fotfix  #爲其他版本最近一次提交的內容
#直接在衝突文件的基礎上修改即可,如想要都保留的話就把"三方提交符號"給刪除
[root@node1 taotao]# vim first.sh 
[root@node1 taotao]# git diff
diff --cc first.sh
index 3adec3b,e45ccd5..0000000
--- a/first.sh
+++ b/first.sh
@@@ -1,4 -1,4 +1,5 @@@
  #!/bin/bash
  echo "hello world"
  echo "new date"
 +third line
+ new line
[root@node1 taotao]# cat first.sh 
#!/bin/bash
echo "hello world"
echo "new date"
third line
new line
#修改好之後重新添加到索引並提交
[root@node1 taotao]# git add first.sh
[root@node1 taotao]# git commit  #出現內容提示,保存即可
[master dd73764] Merge branch 'fotfix'
[root@node1 taotao]# git log --graph --pretty=oneline --abbrev-commit
*   dd73764 (HEAD -> master) Merge branch 'fotfix'
|\  
| * 26b42ef (fotfix) v2.0-1
* | 697a6c5 v2.1
|/  
* 1df3da7 v2.0
*   43d8e9a Merge branch 'dev'
|\  
| * 21a0411 (dev) v1.1.1-dev
| * 587719d v1.1-dev
* | 5685269 v1.1
|/  
* 5d4298d v1.0
* b918244 v0.0.2
* 1b5d8e0 v0.0.1


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章