搜尋
首頁開發工具Git歸納整理git版本管理之分支操作

本篇文章為大家帶來了關於Git的相關知識,其中主要介紹了版本管理中創建、刪除、查看以及合併分支的相關問題,希望對大家有幫助。

歸納整理git版本管理之分支操作

推薦學習:《Git學習教學

1 分支基本概念

單一分支:

一開始的時候,master分支是一條線,Git 用master#指向最新的提交,再用HEAD指向master,就能確定目前分支,以及目前分支的提交點:

歸納整理git版本管理之分支操作

每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長。

多分支:

當我們建立新的分支,例如dev時,Git 新建了一個指標叫做dev,指向 master相同的提交,再把HEAD指向dev,就表示當前分支在dev

你看,Git 創建一個分支很快,因為除了增加一個dev指針,改改HEAD的指向,工作區的檔案都沒有任何變化!

歸納整理git版本管理之分支操作

不過,從現在開始,工作區的修改和提交就是針對dev分支了,例如新提交一次後,dev 指標往前移動一步,而master指標不變:

歸納整理git版本管理之分支操作
多重分支合併:

把master指向dev的目前提交,就完成了合併, Git 合併分支也很快!就改改指針,工作區內容也不變!

歸納整理git版本管理之分支操作

合併完分支後,甚至可以刪除dev分支。刪除dev分支就是把dev指標給刪掉,刪掉後,我們就剩下了一條master分支:

歸納整理git版本管理之分支操作

#2 分支管理

2.1 創建分支

  • 使用git checkout:
$ git checkout -b dev
Switched to a new branch 'dev'

git checkout指令加上-b參數表示建立並切換,相當於以下兩個指令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'
  • 使用git switch:

#建立並切換到新的dev分支,可以使用:

$ git switch -c dev

#注意:
git switchgit checkout在分支操作方面的用處完全一樣。那麼可以在分支操作上盡量光用git branchgit switch
因為git checkout除了可以操作分支,它還可以操作檔案(可以重寫工作區)。

2.2 檢視分支

$ git branch
* dev
  master

2.3 合併分支

git merge指令:用於合併指定分支到目前分支。

# 切换回当前的分支:$ git checkout master
Switched to branch 'master'# 合并到指定分支:$ git merge dev
Updating 599dbdb..4aac6c7
Fast-forward
 readme.txt | 1 + 1 file changed, 1 insertion(+)

上面使用的是Fast forward模式(「快轉模式」),但在這個模式下,刪除分支後,就會丟掉分支資訊。

如果要強制停用Fast forward模式,Git 就會在merge時產生一個新的commit,這樣,從分支歷史上就可以看出分支資訊。

$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
 readme.txt | 1 + 1 file changed, 1 insertion(+)

合併後的結果如下:
歸納整理git版本管理之分支操作

2.4 刪除分支

$ git branch -d dev
Deleted branch dev (was 4aac6c7).

3 解決合併衝突

衝突情況發生的情況如下圖所示,Git 無法執行“快速合併”,必須手動解決衝突後再提交。
歸納整理git版本管理之分支操作
合併衝突後的結果:

歸納整理git版本管理之分支操作

#3.1 在git官網上解決

點選合併請求,選擇我們需要的分支內容,然後選擇合併。
歸納整理git版本管理之分支操作

3.2 本機解決

  • 步驟一. 拉取並檢查用於合併的分支
git fetch origingit checkout -b "feature1" "origin/feature1"
  • 步驟二. 在本地查看並做更改

Git 用>&gt ;>>>>標記出不同分支的內容,例如下面的內容:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.>>>>>> feature1
  • 步骤三. 合并分支并解决冲突
git fetch origingit checkout "master"git merge --no-ff "feature1"
  • 步骤四. 推送代码并合并
git push origin "master"

其他方法为:

  • 法1:

保留本地最新修改,并拉取仓库中 的代码到本地

git stash  
git pull origin master  
git stash pop
  • 法2:
    放弃本地代码,新修改的都不要了,退回上一版本,再拉取代码到本地
git reset --hard  
git pull origin master  

# 或git fetch --allgit reset --hard origin/master 
git pull

4 分支转移

git cherry-pick命令的作用,就是将指定的提交commit应用于其他分支。

$ git cherry-pick \<commithash></commithash>

上面命令就会将指定的提交commitHash,应用于当前分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。

举例来说,代码仓库有masterfeature两个分支。

 a - b - c - d Master \\
 e - f - g Feature

现在将提交f应用到master分支。

\# 切换到 master 分支
$ git checkout master\# Cherry pick 操作
$ git cherry-pick f

上面的操作完成以后,代码库就变成了下面的样子。

 a - b - c - d - f Master \\
 e - f - g Feature

从上面可以看到,master分支的末尾增加了一个提交f。

git cherry-pick命令的参数,不一定是提交的哈希值,分支名也是可以的,表示转移该分支的最新提交。

$ git cherry-pick feature

上面代码表示将feature分支的最近一次提交,转移到当前分支。

Cherry pick 支持一次转移多个提交。

$ git cherry-pick \<hasha> \<hashb></hashb></hasha>

上面的命令将 AB 两个提交应用到当前分支。这会在当前分支生成两个对应的新提交。

如果想要转移一系列的连续提交,可以使用下面的简便语法。

$ git cherry-pick A..B

上面的命令可以转移从 AB 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。

注意,使用上面的命令,提交 A 将不会包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的语法。

$ git cherry-pick A^..B
`git cherry-pick`命令的常用配置项如下。

#### -e,--edit

打开外部编辑器,编辑提交信息。

#### -n,--no-commit

只更新工作区和暂存区,不产生新的提交。

#### -x

在提交信息的末尾追加一行`cherry picked from commit ...`,方便以后查到这个提交是如何产生的。

#### -s,--signoff

在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。

#### -m parent-number,--mainline parent-number

如果原始提交是一个合并节点,来自于两个分支的合并,那么 `Cherry pick` 默认将失败,因为它不知道应该采用哪个分支的代码变动。

`-m`配置项告诉 Git,应该采用哪个分支的变动。它的参数`parent-number`是一个从1开始的整数,代表原始提交的父分支编号。

```bash
$ git cherry-pick -m 1 \<commithash></commithash>

上面命令表示,Cherry pick 采用提交commitHash来自编号1的父分支的变动。

一般来说,1号父分支是接受变动的分支,2号父分支是作为变动来源的分支。

如果操作过程中发生代码冲突,Cherry pick会停下来,让用户决定如何继续操作。

(1)–continue

用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行。

$ git cherry-pick --continue

(2)–abort

发生代码冲突后,放弃合并,回到操作前的样子。

(3)–quit

发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。

Cherry pick 也支持转移另一个代码库的提交,方法是先将该库加为远程仓库。

转移另一个代码库的提交

$ git remote add target git://gitUrl

上面命令添加了一个远程仓库target

然后,将远程代码抓取到本地。

$ git fetch target

上面命令将远程代码仓库抓取到本地。

接着,检查一下要从远程仓库转移的提交,获取它的哈希值。

$ git log target/master

最后,使用git cherry-pick命令转移提交。

$ git cherry-pick \<commithash></commithash>

5 常用的分支

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

其次,干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,并在master分支发布1.0版本;

小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

歸納整理git版本管理之分支操作

5.1 bug分支

在开发过程中,bug 就像家常便饭一样。有了 bug 就需要修复,在 Git 中,由于分支是如此的强大,所以,每个 bug 都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号101的 bug 的任务时,很自然地,你想创建一个分支 issue-101 来修复它,但是,等等,当前正在dev上进行的工作还没有提交:

$ git status
On branch dev
Changes to be committed: (use "git reset HEAD \<file>..." to unstage)

 new file: hello.py

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.txt</file></file></file>

并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该 bug,怎么办?

幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge

现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复 bug。

首先确定要在哪个分支上修复 bug,假定需要在master分支上修复,就从master创建临时分支:

$ git checkout master
Switched to branch 'master'Your branch is ahead of 'origin/master' by 6 commits. (use "git push" to publish your local commits)$ git checkout -b issue-101
Switched to a new branch 'issue-101'

现在修复bug,需要把“Git is free software …”改为“Git is a free software …”,然后提交:

$ git add readme.txt 
$ git commit -m "fix bug 101"[issue-101 8842ff5] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支:

$ git switch master
Switched to branch 'master'Your branch is ahead of 'origin/master' by 6 commits. (use "git push" to publish your local commits)$ git merge --no-ff -m "merged bug fix 101" issue-101
Merge made by the 'recursive' strategy.
 readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)

太棒了,原计划两个小时的 bug 修复只花了5分钟!现在,是时候接着回到dev分支干活了!

$ git switch dev
Switched to branch 'dev'$ git status
On branch dev
nothing to commit, working tree clean

工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge

工作现场还在,Git 把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

另一种方式是用git stash pop,恢复的同时把stash内容也删了:

$ git stash pop
On branch dev
Changes to be committed: (use "git reset HEAD \<file>..." to unstage)

 new file: hello.py

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.txt

Dropped refs/stash@{0} (5d677e2ee266f39ea296182fb2354265b91b3b2a)</file></file></file>

再用git stash list查看,就看不到任何stash内容了:

$ git stash list

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

$ git stash apply stash@{0}

master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。

那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?在 Git 中还有比这更简单的方法可以实现。

同样的 bug,要在dev上修复,我们只需要把8842ff5 fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只想复制8842ff5 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。

为了方便操作,Git 专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:

$ git branch\* dev
 master
$ git cherry-pick 8842ff5[dev 0944c8c] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)

Git 自动给dev分支做了一次提交,注意这次提交的commit0944c8c,它并不同于master8842ff5,因为这两个commit只是改动相同,但确实是两个不同的commit。用git cherry-pick,我们就不需要在dev分支上手动再把修 bug 的过程重复一遍。

有些聪明的童鞋会想了,既然可以在master分支上修复bug后,在dev分支上可以“重放”这个修复过程,那么直接在dev分支上修复 bug,然后在master分支上“重放”行不行?当然可以,不过你仍然需要git stash命令保存现场,才能从dev分支切换到master分支。

5.2 feature分支

在开发过程中,除了 bug 外,也还会有无穷无尽的新的功能要不断添加进来。

添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。

现在,你终于接到了一个新任务:开发代号为Vulcan的新功能,该功能计划用于下一代星际飞船。

于是准备开发:

$ git switch -c feature-vulcan
Switched to a new branch 'feature-vulcan'

5分钟后,开发完毕:

$ git add vulcan.md

$ git status
On branch feature-vulcan
Changes to be committed: (use "git reset HEAD \<file>..." to unstage)

 new file: vulcan.md

$ git commit -m "add feature vulcan"[feature-vulcan d12cf23] add feature vulcan 1 file changed, 3 insertions(+)
 create mode 100644 vulcan.md</file>

切回dev,准备合并:

$ git switch dev

一切顺利的话,feature分支和bug分支是类似的,合并,然后删除。

但是!就在此时,接到上级命令,因经费不足,新功能必须取消!虽然白干了,但是这个包含机密资料的分支还是必须就地销毁:

$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.

销毁失败。Git 友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。。

现在我们强行删除:

$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was d12cf23).

终于删除成功!

推荐学习:《Git教程

以上是歸納整理git版本管理之分支操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
git:版本控制的核心,github:社交編碼git:版本控制的核心,github:社交編碼Apr 23, 2025 am 12:04 AM

Git和GitHub是现代软件开发的关键工具。Git提供版本控制功能,通过仓库、分支、提交和合并管理代码。GitHub则提供代码托管和协作功能,如Issues和PullRequests。使用Git和GitHub可以显著提升开发效率和团队协作能力。

git:版本控制系統,github:託管平台git:版本控制系統,github:託管平台Apr 22, 2025 am 12:02 AM

Git是林納斯·托瓦茲在2005年開發的分佈式版本控制系統,GitHub則是2008年創立的基於Git的代碼託管平台。 Git通過快照管理文件,支持分支和合併,GitHub提供拉取請求、問題跟踪和代碼審查功能,促進團隊協作。

git和github:比較分析git和github:比較分析Apr 21, 2025 am 12:10 AM

Git和GitHub是現代軟件開發中的關鍵工具。 Git是分佈式版本控制系統,GitHub是基於Git的代碼託管平台。 Git的核心功能包括版本控制和分支管理,GitHub則提供協作和項目管理工具。使用Git時,開發者可以跟踪文件變化並協同工作;使用GitHub時,團隊可以通過PullRequests和Issues進行協作。

GitHub:代碼託管平台的簡介GitHub:代碼託管平台的簡介Apr 20, 2025 am 12:10 AM

githubiscrucialforsoftwaredevelopmentduetoitscompheasisecosystemforcodemagementagnagnagnagnagnagn和collaboration.itoffersversioncontrol,communitySupport,andtoolslikegithubictionsandpages.startbymasteringbasicslikemasteringbasicsleatbasicsleatingbasicsleatingareatingareatingarepository,and andranbranches,and andautomatimation,and automatingwo

git和github:開發人員的基本工具git和github:開發人員的基本工具Apr 19, 2025 am 12:17 AM

Git和GitHub是現代開發者的必備工具。 1.使用Git進行版本控制:創建分支進行並行開發,合併分支,回滾錯誤。 2.利用GitHub進行團隊協作:通過PullRequest進行代碼審查,解決合併衝突。 3.實用技巧和最佳實踐:定期提交,清晰的提交消息,使用.gitignore,定期備份代碼庫。

git和github:他們的關係解釋了git和github:他們的關係解釋了Apr 18, 2025 am 12:03 AM

Git和GitHub不是同一個東西:Git是一個分佈式版本控制系統,而GitHub是一個基於Git的在線平台。 Git幫助開發者管理代碼版本,通過分支、合併等功能實現協作;GitHub則提供代碼託管、審查、問題管理和社交互動功能,增強了Git的協作能力。

Git下載後需要設置什麼嗎Git下載後需要設置什麼嗎Apr 17, 2025 pm 04:57 PM

安裝 Git 後,為了更有效地使用,需要進行以下設置:設置用戶信息(姓名和郵箱)選擇文本編輯器設置外部合併工俱生成 SSH 秘鑰設置忽略文件模式

git下載不動怎麼辦git下載不動怎麼辦Apr 17, 2025 pm 04:54 PM

解決 Git 下載速度慢時可採取以下步驟:檢查網絡連接,嘗試切換連接方式。優化 Git 配置:增加 POST 緩衝區大小(git config --global http.postBuffer 524288000)、降低低速限制(git config --global http.lowSpeedLimit 1000)。使用 Git 代理(如 git-proxy 或 git-lfs-proxy)。嘗試使用不同的 Git 客戶端(如 Sourcetree 或 Github Desktop)。檢查防火

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)