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分支: