git 工具使用–分支管理
理解分支
分支管理是Git的殺手級(jí)功能之一。分支:就是科幻中的平行宇宙,當(dāng)你正在電腦面前學(xué)習(xí)C++的時(shí)候,另一個(gè)你正在另外一個(gè)平行宇宙里面學(xué)習(xí)Java。如果兩個(gè)平行宇宙互不干擾,那對(duì)現(xiàn)在的你也沒啥影響。不過,在某個(gè)時(shí)間點(diǎn),兩個(gè)平時(shí)宇宙合并了,結(jié)果,你既學(xué)習(xí)了C++,也學(xué)習(xí)了Java.
在版本回退里,你已經(jīng)知道,每次提交,Git都把他們串成一條時(shí)間線,這條時(shí)間線就可以理解是一個(gè)分支。截止到目前,在Git里,這個(gè)分支叫主分支,即 master
分支。
再來理解一下HEAD,HEAD嚴(yán)格來說不是指向提交,而是指向master,master
才是指向提交的,所以,HEAD指向的就是當(dāng)前分支。
每次提交,master
分支都會(huì)向前移動(dòng)一次,這樣隨著你不斷的提交,master
分支的線也越來越長,而HEAD只要一直指向master
分支即可指向當(dāng)前分支。
我們可以使用git log來驗(yàn)證:
[Lxy@aliyun gitcode]$ cat .git/HEAD
ref: refs/heads/master
[Lxy@aliyun gitcode]$ cat .git/refs/heads/master
7804665c14faf8e894e023f04576ba6b17632f85
[Lxy@aliyun gitcode]$ git log
commit 7804665c14faf8e894e023f04576ba6b17632f85
Author: Lxy <2357246060@qq.com>
Date: Mon Jun 26 13:48:27 2023 +0800
delete file1
創(chuàng)建分支
Git支持我們查看或創(chuàng)建其他分支,在這里我們來創(chuàng)建第一個(gè)自己的分支dev
,對(duì)應(yīng)的命令為:
查看當(dāng)前本地所有分支
git branch
*表示當(dāng)前HEAD
指向的分支是master
分支。
[Lxy@aliyun gitcode]$ git branch
* master
創(chuàng)建新的分支
git branch dev # 新建分支dev
[Lxy@aliyun gitcode]$ git branch dev
[Lxy@aliyun gitcode]$ git branch
dev
* master
當(dāng)我們創(chuàng)建新的分支后,Git新建了一個(gè)指針叫dev
,創(chuàng)建完成后,我們使用git branch
來查看當(dāng)前有的分支。
另外,也可以通過目錄結(jié)構(gòu)看到新的分支:
[Lxy@aliyun gitcode]$ tree .git/refs/heads/
.git/refs/heads/
├── dev
└── master
0 directories, 2 files
[Lxy@aliyun gitcode]$ ls .git/refs/heads/
dev master
[Lxy@aliyun gitc
發(fā)現(xiàn)目前dev和master
指向同一個(gè)修改。并且也可以驗(yàn)證下HEAD目前是指向master
的。
切換分支
現(xiàn)在已經(jīng)成功創(chuàng)建了新的dev
分支,那么如何切換到dev
分支下進(jìn)行開發(fā)呢?使用git checkout
命令即可完成切換:
[Lxy@aliyun gitcode]$ git checkout dev
Switched to branch 'dev'
[Lxy@aliyun gitcode]$ git branch
* dev
master
[Lxy@aliyun gitcode]$ cat .git/HEAD
ref: refs/heads/dev
此時(shí),HEAD
已經(jīng)指向了dev
,就表示我們已經(jīng)成功的切換到了dev
上!接下來,在dev
分支上修改ReadMe
文件,新增一行內(nèi)容,并進(jìn)行一次提交操作。
[Lxy@aliyun gitcode]$ vim ReadMe
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
I am Coding in dev!
[Lxy@aliyun gitcode]$ git add .
[Lxy@aliyun gitcode]$ git commit -m "modify ReadMe"
[dev 2690f7f] modify ReadMe
1 file changed, 2 insertions(+)
[Lxy@aliyun gitcode]$ git status
# On branch dev
nothing to commit, working directory clean
現(xiàn)在,dev
分支的工作完成,我們就可以切回master
分支:
[Lxy@aliyun gitcode]$ git checkout master
Switched to branch 'master'
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
切換回master
分支后,發(fā)現(xiàn)ReadMe
文件中新增的內(nèi)容不見了?。∥覀?cè)偾谢?code>dev看看
[Lxy@aliyun gitcode]$ git checkout dev
Switched to branch 'dev'
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
I am Coding in dev!
在dev
分支上,內(nèi)容還在,為什么會(huì)出現(xiàn)這個(gè)現(xiàn)象呢?我們?cè)賮砜纯?code>dev分支和master
分支指向,發(fā)現(xiàn)兩個(gè)指向的提交是不一樣的:
[Lxy@aliyun gitcode]$ cat .git/refs/heads/dev
2690f7fcf1ccc686ffd88d2780140d4cc1cd493f
[Lxy@aliyun gitcode]$ cat .git/refs/heads/master
7804665c14faf8e894e023f04576ba6b17632f85
[Lxy@aliyun gitcode]$ git cat-file -p 2690f7fcf1ccc686ffd88d2780140d4cc1cd493f
tree 68c0c174cb2cbb0258f1979bfa92ff0fe06ec5d6
parent 7804665c14faf8e894e023f04576ba6b17632f85
author Lxy <2357246060@qq.com> 1689396001 +0800
committer Lxy <2357246060@qq.com> 1689396001 +0800
modify ReadMe
看到這里我們就能明白了,因?yàn)槲覀兪窃?code>dev分支上提交的,而master分支此刻的提交點(diǎn)并沒有變,此時(shí)的狀態(tài)如圖所示:
切換到 master
分支時(shí),HEAD就指向了master
,當(dāng)然看不到提交了。
合并分支
為了在master
主分支上能看到新的提交,就需要將dev
分支合并到master
分支,示例如下:
[Lxy@aliyun gitcode]$ git checkout master #切換到master上進(jìn)行合并
Switched to branch 'master'
[Lxy@aliyun gitcode]$ git merge dev # 合并dev分支
Updating 7804665..2690f7f
Fast-forward
ReadMe | 2 ++
1 file changed, 2 insertions(+)
[Lxy@aliyun gitcode]$ cat ReadMe # 發(fā)現(xiàn)已經(jīng)成功了
hello git
hello world
hello ReadMe
git --version
I am Coding in dev!
git merge
命令用于合并指定分支到當(dāng)前分支。合并后,master
就能夠看到dev
分支提交的內(nèi)容。
[Lxy@aliyun gitcode]$ cat .git/refs/heads/master
2690f7fcf1ccc686ffd88d2780140d4cc1cd493f
[Lxy@aliyun gitcode]$ cat .git/refs/heads/dev
2690f7fcf1ccc686ffd88d2780140d4cc1cd493f
[Lxy@aliyun gitcode]$ cat .git/HEAD
ref: refs/heads/master
此時(shí)的狀態(tài)圖如下所示:
Fast-forward
代表"快進(jìn)模式",也就是直接把master
指向dev的當(dāng)前提交,所以合并速度非常快,當(dāng)然,也不是每次合并都能Fast-forward
。
刪除分支
合并完成后,dev
分支對(duì)于我們來說就沒用了,那么dev
分支就可以被刪除掉,注意如果當(dāng)前正處于某分支下,就不能刪除當(dāng)前分支,如:
[Lxy@aliyun gitcode]$ git branch -d dev
Deleted branch dev (was 2690f7f).
[Lxy@aliyun gitcode]$ tree .git/refs/heads/
.git/refs/heads/
└── master
0 directories, 1 file
此時(shí)的狀態(tài)如下圖所示:
因?yàn)閯?chuàng)建、合并、刪除分支非??欤訥it鼓勵(lì)我們使用分支完成某個(gè)任務(wù),合并后再刪除分支,這和直接在master
分支上工作效果是一樣的,但過程更安全。
合并沖突
可是,在實(shí)際分支合并的時(shí)候,并不是想合并就能合并成功的,有時(shí)我們可能遇到代碼沖突的問題。為了演示這個(gè)問題,我們創(chuàng)建一個(gè)新的分支dev1
,并切換到目標(biāo)分支,我們可以使用git checkout -b dev1
一步完成創(chuàng)建并切換的動(dòng)作。
[Lxy@aliyun gitcode]$ git checkout -b dev1
Switched to a new branch 'dev1'
[Lxy@aliyun gitcode]$ git branch
* dev1
master
在dev1
分支下修改ReadMe
文件,更改文件內(nèi)容如下,并進(jìn)行一次提交:
[Lxy@aliyun gitcode]$ vim ReadMe
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
I am Coding in dev!
I am Coding in dev1...... #新增內(nèi)容
[Lxy@aliyun gitcode]$ git add . #提交修改
[Lxy@aliyun gitcode]$ git commit -m "md ReadMe"
[dev1 50ba571] md ReadMe
1 file changed, 2 insertions(+)
切換至master
,觀察ReadMe
文件內(nèi)容:
[Lxy@aliyun gitcode]$ git checkout master #切換至master分支
Switched to branch 'master'
[Lxy@aliyun gitcode]$ git branch #查看當(dāng)前所有分支
dev1
* master
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
I am Coding in dev!
我們發(fā)現(xiàn),切回來之后,文件內(nèi)容又變成了老的版本,這和我們預(yù)期一致,我們現(xiàn)在也能夠理解。此時(shí)在master
分支上,我們對(duì)ReadMe
文件再進(jìn)行一次修改,并進(jìn)行提交,如下:
[Lxy@aliyun gitcode]$ vim ReadMe
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
I am Coding in dev!
i am Coding in master ......
[Lxy@aliyun gitcode]$ git add .
[Lxy@aliyun gitcode]$ git commit -m "md ReadMe"
[master a8d6985] md ReadMe
1 file changed, 3 insertions(+)
現(xiàn)在,master
分支和dev1
分支都有各自的新的提交變成了這樣:
這種情況下,Git只能試圖把各自的修改合并起來,但這種合并就可能會(huì)有沖突,如下所示:
[Lxy@aliyun gitcode]$ git merge dev1 #合并dev1到master
Auto-merging ReadMe
CONFLICT (content): Merge conflict in ReadMe
Automatic merge failed; fix conflicts and then commit the result.
[Lxy@aliyun gitcode]$ git status #查看當(dāng)前狀態(tài)
# On branch master
# You have unmerged paths.
# (fix conflicts and run "git commit")
#
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
#
# both modified: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
發(fā)現(xiàn)ReadMe
文件有沖突后,可以直接查看文件內(nèi)容,要說的是Git會(huì)用<<<<<<<,============,>>>>>>>>>>>>>來標(biāo)記出不同的分支的沖突內(nèi)容,如下圖所示:
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
I am Coding in dev!
<<<<<<< HEAD
i am Coding in master ......
=======
I am Coding in dev1......
>>>>>>> dev1
此時(shí)我們必須要手動(dòng)調(diào)整沖突代碼,并且需要再次提交修改后的結(jié)果(再次提交很重要,切勿忘記)
[Lxy@aliyun gitcode]$ vim ReadMe
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
I am Coding in dev!
i am Coding in master ......
I am Coding in dev1.....
[Lxy@aliyun gitcode]$ git add .
[Lxy@aliyun gitcode]$ git commit -m "md ReadMe"
[master 832d4a2] md ReadMe
到這里沖突就解決了,此時(shí)的狀態(tài)變成了
用帶參數(shù)的git log也可以看到分支的合并過程
[Lxy@aliyun gitcode]$ git log --graph --pretty=oneline --abbrev-commit
* 832d4a2 md ReadMe
|\
| * 50ba571 md ReadMe
* | a8d6985 md ReadMe
|/
* 2690f7f modify ReadMe
* 7804665 delete file1
* 2f86525 第三次修改ReadMe
* 02716a9 修改ReadMe
* 0c3e2b8 add file2
* cfd11ac add file
* 3b64204 add first file
最后不要忘記dev1
分支使用完畢后就可以刪除了:
[Lxy@aliyun gitcode]$ git branch
dev1
* master
[Lxy@aliyun gitcode]$ git branch -d dev1
Deleted branch dev1 (was 50ba571).
[Lxy@aliyun gitcode]$ git branch
* master
分支管理策略
通常合并分支時(shí),如果可能,Git會(huì)采用Fast forward
模式。在這種Fast forward
模式下,刪除分支后,查看分支歷史時(shí),會(huì)丟掉分支信息,看不出來最新提交到底是 merge
進(jìn)來的還是正常提交的。
但是合并沖突部分,我們也看到通過解決沖突問題,會(huì)再進(jìn)行一次新的提交,得到的最終狀態(tài)為:
那么這種就不是Fast forward
模式了,這樣的好處是,從分支歷史上就可以看出分支信息。例如我們現(xiàn)在已經(jīng)刪除了在合并沖突部分創(chuàng)建的dev1
分支,但依舊能看到 master
其實(shí)是由其他分支合并得到:
[Lxy@aliyun gitcode]$ git branch #查看當(dāng)前分支
* master
[Lxy@aliyun gitcode]$ git branch dev1 #創(chuàng)建dev1分支
[Lxy@aliyun gitcode]$ git checkout dev1 #切換到dev1分支
Switched to branch 'dev1'
[Lxy@aliyun gitcode]$ git branch
* dev1
master
[Lxy@aliyun gitcode]$ vim ReadMe #修改ReadMe文件
[Lxy@aliyun gitcode]$ git add . #提交修改
[Lxy@aliyun gitcode]$ git commit -m "md ReadMe"
[dev1 f41d236] md ReadMe
1 file changed, 3 insertions(+)
[Lxy@aliyun gitcode]$ git checkout master #切換到master分支
Switched to branch 'master'
[Lxy@aliyun gitcode]$ git merge --no-ff -m "merge dev1" dev1 #將dev1分支使用no-ff方式合并到master分支
Merge made by the 'recursive' strategy.
ReadMe | 3 +++
1 file changed, 3 insertions(+)
[Lxy@aliyun gitcode]$ cat ReadMe #查看ReadMe文件內(nèi)容
hello git
hello world
hello ReadMe
git --version
I am Coding in dev!
i am Coding in master ......
I am Coding in dev1.....
I am Coding in dev1..................
[Lxy@aliyun gitcode]$ git log --graph --abbrev-commit #查看日志信息
* commit 9c17f2d
|\ Merge: 832d4a2 f41d236
| | Author: Lxy <2357246060@qq.com>
| | Date: Sun Jul 16 18:21:49 2023 +0800
| |
| | merge dev1 #這里能夠看到合并的信息
| |
| * commit f41d236
|/ Author: Lxy <2357246060@qq.com>
| Date: Sun Jul 16 18:20:46 2023 +0800
|
| md ReadMe
|
* commit 832d4a2
|\ Merge: a8d6985 50ba571
| | Author: Lxy <2357246060@qq.com>
| | Date: Sat Jul 15 13:10:06 2023 +0800
| |
| | md ReadMe
| |
| * commit 50ba571
| | Author: Lxy <2357246060@qq.com>
| | Date: Sat Jul 15 12:59:18 2023 +0800
| |
| | md ReadMe
| |
* | commit a8d6985
|/ Author: Lxy <2357246060@qq.com>
| Date: Sat Jul 15 13:05:11 2023 +0800
|
| md ReadMe
|
* commit 2690f7f
| Author: Lxy <2357246060@qq.com>
| Date: Sat Jul 15 12:40:01 2023 +0800
Git支持我們強(qiáng)制禁用Fast forword
模式,那么就會(huì)在merge
時(shí)生成一個(gè)新的commit
,這樣,從分支歷史上就可以看到分支信息。
說明一下:
--no--ff
參數(shù),表示禁用Fast forward
模式,禁用Fast forward
模式后會(huì)合并會(huì)創(chuàng)建一個(gè)新的commit
,所以加上-m
參數(shù),把描述寫進(jìn)去。合并后可以查看歷史分支:
git log --graph --pretty=oneline --abbrev-commit
不使用Fast forward
模式,merge
后就像這樣:
所以在合并分支時(shí),加上--no-ff
參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來曾經(jīng)做過合并,而fast forward
合并就看不出來曾經(jīng)做過合并。
分支策略
在實(shí)際開發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
首先,master
分支應(yīng)該是 非常穩(wěn)定的,也就是僅用發(fā)布新版本,平時(shí)不能在上面干活:因此,我們平時(shí)開發(fā)都是在dev
分支上面的,也就是說,dev
分支是不穩(wěn)定的,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí),再把dev
分支合并到master
上,在master
分支發(fā)布1.0版本.
所以,每個(gè)人都有自己的分支,時(shí)不時(shí)地往dev分支上合并就可以了。所以團(tuán)隊(duì)合作的分支看起來就像這樣:
bug分支
假如我們現(xiàn)在正在dev2
分支上進(jìn)行開發(fā),開發(fā)到一半,突然發(fā)現(xiàn)master
分支上有bug,需要解決。在Git中,每個(gè)bug
都可以通過一個(gè)新的臨時(shí)分支來修復(fù),修復(fù)后,合并分支,然后將臨時(shí)分支刪除??涩F(xiàn)在dev2
的代碼在工作區(qū)中開發(fā)了一般,還無法提交,Git提供了git stash
命令,可以將當(dāng)前的工作區(qū)信息進(jìn)行儲(chǔ)藏,被儲(chǔ)藏的內(nèi)容可以在將來某個(gè)時(shí)間恢復(fù)出來。
[Lxy@aliyun gitcode]$ git branch dev2 #創(chuàng)建dev2分支
[Lxy@aliyun gitcode]$ git checkout dev2 #切換至dev2分支
Switched to branch 'dev2'
[Lxy@aliyun gitcode]$ vim ReadMe #修改ReadMe文件
[Lxy@aliyun gitcode]$ cat ReadMe #查看ReadMe文件
hello git
hello world
hello ReadMe
I am Codeing in dev2............
[Lxy@aliyun gitcode]$ git checkout master #切換至master
M ReadMe
Switched to branch 'master'
[Lxy@aliyun gitcode]$ cat ReadMe #查看ReadMe文件
hello git
hello world
hello ReadMe
I am Codeing in dev2............
[Lxy@aliyun gitcode]$ git status #查看狀態(tài)
# On branch master
# 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: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
[Lxy@aliyun gitcode]$ git checkout dev2
M ReadMe
Switched to branch 'dev2'
[Lxy@aliyun gitcode]$ git stash #儲(chǔ)存文件
Saved working directory and index state WIP on dev2: 9c17f2d merge dev1
HEAD is now at 9c17f2d merge dev1
[Lxy@aliyun gitcode]$ git status #再查看狀態(tài)
# On branch dev2
nothing to commit, working directory clean
[Lxy@aliyun gitcode]$ cat ReadMe #再次查看master的ReadMe文件內(nèi)容發(fā)現(xiàn)恢復(fù)到之前
hello git
hello world
hello ReadMe
git --version
I am Coding in dev!
i am Coding in master ......
I am Coding in dev1.....
I am Coding in dev1..................
用git status
查看工作區(qū),就是干凈的(除非擁有 - 沒有被Git管理的文件),因此可以放心地創(chuàng)建分支來修復(fù)bug。
儲(chǔ)藏dev2工作區(qū)之后,由于我們要基于master
分支,在創(chuàng)建臨時(shí)分支來修復(fù)bug。
[Lxy@aliyun gitcode]$ git checkout master #切回master
Switched to branch 'master'
[Lxy@aliyun gitcode]$ git checkout -b fix_bug #新建并切換到fix_bug分支
Switched to a new branch 'fix_bug'
[Lxy@aliyun gitcode]$ vim ReadMe
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
I am fixing bug ......... #修復(fù)bug
[Lxy@aliyun gitcode]$ git add . #重新add commit
[Lxy@aliyun gitcode]$ git commit -m "fix bug"
[fix_bug 76fef0d] fix bug
1 file changed, 1 insertion(+), 7 deletions(-)
修復(fù)完畢后,切換到master
分支,并完成合并,最后刪除fix_bug
分支:
[Lxy@aliyun gitcode]$ git merge --no-ff -m "merge fix_bug" fix_bug
Merge made by the 'recursive' strategy.
ReadMe | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
I am fixing bug .........
至此,bug地修復(fù)工作已經(jīng)做完了,我們還要繼續(xù)回到dev2
分支進(jìn)行開發(fā),切換回dev2
分支:
[Lxy@aliyun gitcode]$ git checkout dev2
Switched to branch 'dev2'
[Lxy@aliyun gitcode]$ git status
# On branch dev2
nothing to commit, working directory clean
工作區(qū)是干凈的???剛才我們的工作現(xiàn)場(chǎng)存到哪兒去了?可以使用git stash list
命令查看
[Lxy@aliyun gitcode]$ git stash list
stash@{0}: WIP on dev2: 9c17f2d merge dev1
工作現(xiàn)場(chǎng)還在,Git把stash
內(nèi)容存在某個(gè)地方了,但是需要恢復(fù)一下,如何恢復(fù)現(xiàn)場(chǎng)呢?我們可以使用git stash pop
命令,恢復(fù)的同時(shí)會(huì)把stash
也刪了:
[Lxy@aliyun gitcode]$ git stash pop
# On branch dev2
# 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: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (c6b7e92f49a38afc1461bcedbaa558aa7ecd0500)
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
I am Codeing in dev2............
再次查看的時(shí)候,我們已經(jīng)發(fā)現(xiàn)沒有現(xiàn)場(chǎng)可以恢復(fù)了
[Lxy@aliyun gitcode]$ git stash list
[Lxy@aliyun gitcode]$
另外,恢復(fù)現(xiàn)場(chǎng)也可以采用git stash apply
恢復(fù),但是恢復(fù)后,stash
內(nèi)容并不刪除,你需要用git stash drop
來刪除。你可以多次stash,恢復(fù)的時(shí)候,先用``git stash list查看,然后恢復(fù)指定的
stash,用命令
git stash apply stash@{0}`恢復(fù)完代碼之后我們便可以繼續(xù)完成開發(fā),開發(fā)完成后便可以進(jìn)行提交。例如:
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
I am Codeing in dev2............
[Lxy@aliyun gitcode]$ git add .
[Lxy@aliyun gitcode]$ git commit -m "md ReadMe"
[dev2 477994a] md ReadMe
1 file changed, 1 insertion(+), 9 deletions(-)
但我們注意到了,修復(fù)bug的內(nèi)容,并沒有在dev2
上顯示,此時(shí)的狀態(tài)圖為:
master
分支目前最新的提交,是要領(lǐng)先于新建dev2
時(shí)基于的master
分支的提交的。所以我們?cè)?code>dev2中當(dāng)然看不見修復(fù)bug的相關(guān)代碼。我們的最終目的時(shí)讓master
合并dev2
分支的,那么正常情況下我們切回master
分支直接合并即可,但這樣其實(shí)是有一定風(fēng)險(xiǎn)的。是因?yàn)楹喜⒎种r(shí)可能會(huì)有沖突,而代碼沖突需要我們手動(dòng)解決(在master
上解決)我們無法保證對(duì)于沖突問題可以正確的一次性解決掉,因?yàn)樵趯?shí)習(xí)的項(xiàng)目中,代碼沖突不只一兩行那么簡(jiǎn)單,有可能幾十上百行,甚至更多,解決的過程中難免手誤出錯(cuò),導(dǎo)致錯(cuò)誤的代碼被合并到master
上,此時(shí)的狀態(tài)為:
解決這個(gè)問題有一個(gè)好的建議是,最好現(xiàn)在自己的分支上合并下master,再讓master去合并dev,這樣做的目的是有沖突可以再本地分支解決并進(jìn)行測(cè)試,而不影響master
此時(shí)的狀態(tài)為:
對(duì)應(yīng)的實(shí)操顯示為:(要說明的是,以下演示的merge操作,沒有使用--no-ff
,但上述的圖示是禁用Fast forward
了模式后得出的,主要是為了方便解釋問題。)
[Lxy@aliyun gitcode]$ git branch #查看當(dāng)前分支
dev1
* dev2
fix_bug
master
[Lxy@aliyun gitcode]$ git merge master #合并master分支到dev2
Auto-merging ReadMe
CONFLICT (content): Merge conflict in ReadMe
Automatic merge failed; fix conflicts and then commit the result.
[Lxy@aliyun gitcode]$ cat ReadMe #查看代碼
hello git
hello world
hello ReadMe
<<<<<<< HEAD
I am Codeing in dev2............
=======
git --version
I am fixing bug .........
>>>>>>> master
[Lxy@aliyun gitcode]$ vim ReadMe #修改代碼
[Lxy@aliyun gitcode]$ cat ReadMe #再次查看
hello git
hello world
hello ReadMe
I am Codeing in dev2.........
git --version
bug is fixed .........
[Lxy@aliyun gitcode]$ git add . #add 并且 commit
[Lxy@aliyun gitcode]$ git commit -m "md ReadMe"
[dev2 8bdc3c9] md ReadMe
至此dev2
上面的代碼無需沖突解決,我們?cè)偾谢豰aster合并dev2
即可
[Lxy@aliyun gitcode]$ git checkout master #切換回master
Switched to branch 'master'
[Lxy@aliyun gitcode]$ git merge dev2 #合并dev2
Updating ac63583..8bdc3c9
Fast-forward
ReadMe | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
[Lxy@aliyun gitcode]$ cat ReadMe #查看ReadME代碼
hello git
hello world
hello ReadMe
I am Codeing in dev2.........
git --version
bug is fixed .........
[Lxy@aliyun gitcode]$ git branch -d dev2 #刪除dev2
Deleted branch dev2 (was 8bdc3c9).
[Lxy@aliyun gitcode]$ git branch -d fix_bug #刪除fix_bug
Deleted branch fix_bug (was 76fef0d).
[Lxy@aliyun gitcode]$ git branch -d dev1 #刪除dev1
Deleted branch dev1 (was f41d236).
[Lxy@aliyun gitcode]$ git branch
* master
刪除臨時(shí)分支
軟件開發(fā)中,總有?窮?盡的新的功能要不斷添加進(jìn)來。 添加?個(gè)新功能時(shí),你肯定不希望因?yàn)?些實(shí)驗(yàn)性質(zhì)的代碼,把主分?搞亂了,所以,每添加?個(gè)新功能,最好新建?個(gè)分?,我們可以將其稱之為 feature
分?,在上?開發(fā),完成后,合并,最 后,刪除該feature
分?。 可是,如果我們今天正在某個(gè)feature
分?上開發(fā)了?半,被產(chǎn)品經(jīng)理突然叫停,說是要停?新功能的開發(fā)。雖然??了,但是這個(gè)feature
分?還是必須就地銷毀,留著??了。這時(shí)使?傳統(tǒng) 的git branch -d
命令刪除分?的?法是不?的。演?如下:
#新建并且切換到dev3分支
[Lxy@aliyun gitcode]$ git checkout -b dev3
M ReadMe
Switched to a new branch 'dev3'
#開始開發(fā)新功能并提交
[Lxy@aliyun gitcode]$ vim ReadMe
[Lxy@aliyun gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
I am Codeing in dev2.........
git --version
bug is fixed .........
hello dev3
[Lxy@aliyun gitcode]$ git add .
[Lxy@aliyun gitcode]$ git commit -m "md ReadMe"
[dev3 00a37ca] md ReadMe
1 file changed, 2 insertions(+)
#此時(shí)新功能叫停
#切回master準(zhǔn)備刪除dev3
[Lxy@aliyun gitcode]$ git checkout master
Switched to branch 'master'
#常規(guī)刪除dev3分支時(shí)失敗
[Lxy@aliyun gitcode]$ git branch -d dev3
error: The branch 'dev3' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev3'.
直接使用傳統(tǒng)的刪除分支的方法不行,按照提示,有了如下方式:
[Lxy@aliyun gitcode]$ git branch -D dev3
Deleted branch dev3 (was 00a37ca).
[Lxy@aliyun gitcode]$ git branch
* master
總結(jié)
分?在實(shí)際中有什么?呢?假設(shè)你準(zhǔn)備開發(fā)?個(gè)新功能,但是需要兩周才能完成,第?周你寫了50% 的代碼,如果?刻提交,由于代碼還沒寫完,不完整的代碼庫會(huì)導(dǎo)致別?不能?活了。如果等代碼全 部寫完再?次提交,?存在丟失每天進(jìn)度的巨??險(xiǎn)。
現(xiàn)在有了分?,就不?怕了。你創(chuàng)建了?個(gè)屬于你??的分?,別?看不到,還繼續(xù)在原來的分?上 正常?作,?你在??的分?上?活,想提交就提交,直到開發(fā)完畢后,再?次性合并到原來的分? 上,這樣,既安全,?不影響別??作。
并且Git?論創(chuàng)建、切換和刪除分?,Git在1秒鐘之內(nèi)就能完成!?論你的版本庫是1個(gè)?件還是1萬個(gè)?件。文章來源:http://www.zghlxwxcb.cn/news/detail-599262.html
(本篇完)文章來源地址http://www.zghlxwxcb.cn/news/detail-599262.html
到了這里,關(guān)于git 工具使用--分支管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!