1. 程式人生 > >git分支、標簽管理與別名

git分支、標簽管理與別名

編輯 發布 ... /dev/null date his 影響 遠程 unset

筆記內容:git分支、標簽管理與別名
筆記日期:2018-01-15

  • 22.9 分支管理
  • 22.10 遠程分支管理
  • 22.11 標簽管理
  • 22.12 git別名

22.9 分支管理

分支管理是git比較重要的一個概念,平時用的也比較多。我們先來在本地的倉庫裏操作一下分支:

[root@localhost ~]# cd /data/gitroot/
[root@localhost /data/gitroot]# git branch   # 查看當前倉庫的分支,*表示當前的分支是哪一個
* master
[root@localhost /data/gitroot]# ls
Hello.java
[root@localhost /data/gitroot]#

創建分支:

[root@localhost /data/gitroot]# git branch example  # 創建分支
[root@localhost /data/gitroot]# git branch 
  example
* master
[root@localhost /data/gitroot]# ls
Hello.java
[root@localhost /data/gitroot]#

切換分支:

[root@localhost /data/gitroot]# git checkout example  # 切換分支
切換到分支 ‘example‘
[root@localhost /data/gitroot]# git branch 
* example
  master
[root@localhost /data/gitroot]# ls
Hello.java
[root@localhost /data/gitroot]#

在example分支下創建一個新文件;

[root@localhost /data/gitroot]# echo "123456abcdefg" > test.txt
[root@localhost /data/gitroot]# git add test.txt
[root@localhost /data/gitroot]# git commit -m "add test.txt"
[example c83af5a] add test.txt
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
[root@localhost /data/gitroot]# ls
Hello.java  test.txt
[root@localhost /data/gitroot]#

切換到master分支後,可以發現該分支下沒有我們剛剛創建的文件:

[root@localhost /data/gitroot]# git checkout master 
切換到分支 ‘master‘
[root@localhost /data/gitroot]# ls
Hello.java
[root@localhost /data/gitroot]#

這說明分支跟分支之間是相互隔離開的,在當前分支下進行的操作不會影響到其他分支。

分支的合並:

如果想要別的分支也同步當前分支的操作,可以對分支進行合並,合並分支之前,需要先切換到目標分支:

[root@localhost /data/gitroot]# git checkout master 
切換到分支 ‘master‘
[root@localhost /data/gitroot]# git branch 
  example
* master
[root@localhost /data/gitroot]# ls
Hello.java
[root@localhost /data/gitroot]# git merge example  # 合並example分支
更新 5341f93..c83af5a
Fast-forward
 test.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
[root@localhost /data/gitroot]# ls
Hello.java  test.txt
[root@localhost /data/gitroot]#

關於合並可能會發生沖突的問題:

如果master分支和example分支都對text.txt進行了編輯,當合並時會提示沖突,需要先解決沖突才可以繼續合並。

解決沖突的方法是在master分支下,編輯test.txt,改為example分支裏面test.txt的內容。 然後提交test.txt,再合並example分支。

但是這樣有一個問題,萬一master分支更改的內容是我們想要的呢? 可以編輯test.txt內容,改為想要的,然後提交。切換到example分支,然後合並master分支到example分支即可(倒著合並)。合並分支有一個原則,那就是要把最新的分支合並到舊的分支。也就是說merge後面跟的分支名字一定是最新的分支。

沖突情況示例:
1.在master分支下對文件進行更改:

[root@localhost /data/gitroot]# git branch 
  example
* master
[root@localhost /data/gitroot]# ls
Hello.java  test.txt
[root@localhost /data/gitroot]# echo "ABCDEFG" >> test.txt  # 在master下對test.txt進行了更改
[root@localhost /data/gitroot]# git add test.txt
[root@localhost /data/gitroot]# git commit -m "ch test.txt"
[master f18dbd4] ch test.txt
 1 file changed, 1 insertion(+)
[root@localhost /data/gitroot]#

2.切換到example分支,也對相同的文件進行更改:

[root@localhost /data/gitroot]# git checkout example 
切換到分支 ‘example‘
[root@localhost /data/gitroot]# git branch 
* example
  master
[root@localhost /data/gitroot]# ls
Hello.java  test.txt
[root@localhost /data/gitroot]# echo "HIJKLMN" >> test.txt  # 在example下對test.txt進行了更改
[root@localhost /data/gitroot]# git add test.txt
[root@localhost /data/gitroot]# git commit -m "ch test.txt"
[example 462c72c] ch test.txt
 1 file changed, 1 insertion(+)
[root@localhost /data/gitroot]#

3.這時把example與master進行合並就會出問題了:

[root@localhost /data/gitroot]# git checkout master 
切換到分支 ‘master‘
[root@localhost /data/gitroot]# git merge example 
自動合並 test.txt
沖突(內容):合並沖突於 test.txt
自動合並失敗,修正沖突然後提交修正的結果。
[root@localhost /data/gitroot]#

4.需要把master分支下的文件內容改成與example下的文件內容一致後才能解決沖突的問題。但是如果master分支下的文件內容是你想要的,那麽就把example下的文件內容修改成master分支下的文件內容,然後合並master到example下即可:

[root@localhost /data/gitroot]# git branch 
  example
* master
[root@localhost /data/gitroot]# vim test.txt  # 把沖突時生成的標記信息給去掉
123456abcdefg
ABCDEFG
HIJKLMN
[root@localhost /data/gitroot]# git add test.txt
[root@localhost /data/gitroot]# git commit -m "ch test.txt"
[root@localhost /data/gitroot]# cat test.txt 
123456abcdefg
ABCDEFG
HIJKLMN
[root@localhost /data/gitroot]# git checkout example
切換到分支 ‘example‘
[root@localhost /data/gitroot]# cat test.txt 
123456abcdefg
HIJKLMN
[root@localhost /data/gitroot]# git merge master 
更新 462c72c..7bc085d
Fast-forward
 test.txt | 1 +
 1 file changed, 1 insertion(+)
[root@localhost /data/gitroot]# cat test.txt 
123456abcdefg
ABCDEFG
HIJKLMN
[root@localhost /data/gitroot]#

解決分支沖突問題挺繞的,所以平時使用分支合並時要註意避免發生合並沖突的問題。

刪除分支的命令:

[root@localhost /data/gitroot]# git checkout master  # 由於不能刪除當前所在分支,所以需要切換一下
切換到分支 ‘master‘
[root@localhost /data/gitroot]# git  branch -d example 
已刪除分支 example(曾為 7bc085d)。
[root@localhost /data/gitroot]# 

如果分支沒有合並,刪除之前會提示,那就不合並,可以使用以下命令進行強制刪除:

git branch -D example

使用分支的原則:
對於分支的應用,建議大家以這樣的原則來:

  • master分支是非常重要的,線上發布代碼用這個分支,平時我們開發代碼不要在這個分支上。
  • 創建一個dev分支,專門用作開發,只有當發布到線上之前,才會把dev分支合並到master
  • 開發人員應該在dev的基礎上再分支成個人分支,個人分支(在自己pc上)裏面開發代碼,然後合並到dev分支

技術分享圖片

dev分支合並bob分支的命令是:

git checkout dev //先切換到dev分支,然後
git merge bob


22.10 遠程分支管理

在GitHub上創建一個dev分支:
技術分享圖片

創建完成:
技術分享圖片

克隆遠程的倉庫:

[root@localhost ~]# cd /tmp/
[root@localhost /tmp]# git clone https://github.com/Binary-ZeroOne/example.git
正克隆到 ‘example‘...
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 12 (delta 0), reused 9 (delta 0), pack-reused 0
Unpacking objects: 100% (12/12), done.
[root@localhost /tmp]# cd example
[root@localhost /tmp/example]# git branch 
* master
[root@localhost /tmp/example]#

如上可以看到,當我們使用git clone命令克隆遠程倉庫的時候默認只會把master分支克隆下來,而不會克隆其他的分支。

查看遠程倉庫所有分支的命令:

[root@localhost /tmp/example]# git ls-remote origin
b71be6bf1ab975692356683a327079c4f04180f5    HEAD
b71be6bf1ab975692356683a327079c4f04180f5    refs/heads/dev
b71be6bf1ab975692356683a327079c4f04180f5    refs/heads/master
[root@localhost /tmp/example]#

現在我們需要把dev分支給克隆下來,需要自己先手動創建,在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱要一致:

# -b指定本地分支名稱,origin後面跟的是遠程分支的名稱
[root@localhost /tmp/example]# git checkout -b dev origin/dev 
分支 dev 設置為跟蹤來自 origin 的遠程分支 dev。
切換到一個新分支 ‘dev‘
[root@localhost /tmp/example]# git branch 
* dev
  master
[root@localhost /tmp/example]# ls
example.txt  README.md
[root@localhost /tmp/example]# echo "123456abc" > test.txt  # 添加一個新文件
[root@localhost /tmp/example]# ls
example.txt  README.md  test.txt
[root@localhost /tmp/example]# git add test.txt
[root@localhost /tmp/example]# git commit -m "add test.txt"
[dev 3dded3a] add test.txt
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
[root@localhost /tmp/example]# git push  # 推送到遠程倉庫上
Username for ‘https://github.com‘: Binary-ZeroOne
Password for ‘https://[email protected]‘: 
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 308 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/Binary-ZeroOne/example.git
   b71be6b..3dded3a  dev -> dev  # 可以看到推送到了遠程倉庫的dev分支上了
[root@localhost /tmp/example]#

關於git push分支的兩種情況:

1.當本地分支和遠程分支一致時,git push默認會把所有本地分支的變更一同推送到遠程(matching模式下),如果想只推送某一個分支,可以使用git push origin branch-name命令:

[root@localhost /tmp/example]# git push origin dev
Username for ‘https://github.com‘: Binary-ZeroOne
Password for ‘https://[email protected]‘: 
Everything up-to-date
[root@localhost /tmp/example]#

2.當本地分支比遠程分支多,默認git push 只推送本地和遠程一致的分支,想要把多出來的本地分支推送到遠程時,使用git push origin branch-name 命令, 如果推送失敗,先用git pull抓取遠程的新提交:

[root@localhost /tmp/example]# git branch dev2  # 創建一個新的本地分支
[root@localhost /tmp/example]# git branch 
* dev
  dev2
  master
[root@localhost /tmp/example]# git checkout dev2
切換到分支 ‘dev2‘
[root@localhost /tmp/example]# ls
example.txt  README.md  test.txt
[root@localhost /tmp/example]# echo "123" > newFile.txt
[root@localhost /tmp/example]# git add newFile.txt
[root@localhost /tmp/example]# git commit -m "add newFile.txt"
[dev2 b1dc04e] add newFile.txt
 1 file changed, 1 insertion(+)
 create mode 100644 newFile.txt
[root@localhost /tmp/example]# git push origin dev2  # 這時候就需要指定分支名稱推送到遠程上
Username for ‘https://github.com‘: Binary-ZeroOne
Password for ‘https://[email protected]‘: 
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 335 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/Binary-ZeroOne/example.git
 * [new branch]      dev2 -> dev2
[root@localhost /tmp/example]#

現在查看遠程倉庫的分支,可以看到多了一個dev2分支:
技術分享圖片


22.11 標簽管理