搜尋
首頁開發工具Git教你怎樣不切換Git分支,同時在多個分支上工作(實例詳解)

這篇文章為大家帶來了關於Git分支的相關知識,主要介紹了在不切換分支時怎麼在多個分支上工作的相關問題,希望對大家有幫助。

教你怎樣不切換Git分支,同時在多個分支上工作(實例詳解)

正在開發某個feature,老闆突然跳出來說讓你做生產上的hotfix 更是家常便飯,面對這種情況,使用Git 的我們通常有兩種解決方案:

  1. 草草提交未完成的feature,然後切換分支到hotfix

  2. git stash | git stash pop 暫存工作內容,然後再切換到hotfix

#第二種方式較第一種還好很多,可是面對下面這些場景,stash 依舊不是很好的解決方案

我們面對的場景

  1. 在main 分支上跑長時間的測試,切換到hotfix 或feature, 測試就會中斷

  2. 專案非常大,頻繁的切換索引,成本非常高

  3. 有幾年前release 的舊版本,設定和目前不一樣,IDE restructure 適配切換也會帶來很大的開銷

  4. #切換分支,需要重新設定對應的環境變量,例如dev/qa/prod

  5. 需要切換到同事的程式碼,幫助調試程式碼復現問題

#有的同學想到,git clone 多個repo 不就可以了嗎?這是解決上述問題的一個方法,但背後同樣隱藏很多問題:

  1. 多個repo 的狀態是不好同步的,例如沒辦法快速cherry-pick, 一個repo checkout的分支,另外一個repo 需要重新checkout

  2. git history/log 是重複的,當專案歷史非常長,.git 資料夾下的內容是非常佔用磁碟空間的

  3. 同一個項目,多個repo,不容易管理

那如何做才能滿足這些特殊場景,又不出現這些上述這些問題呢?

git-worktree

其實,這是Git 2015 年就開始支援的功能,卻很少人知道它,git-worktree 的使用非常方便,在終端機輸入:

git worktree --help

就可以快速看到幫助文件說明:

教你怎樣不切換Git分支,同時在多個分支上工作(實例詳解)

#用簡單的話來解釋git-worktree 的作用就是:

只需維護一個repo,又可以同時在多個branch 上工作,互不影響

上面紅色框線指令有很多,我們常用的其實只有下面這四個:

git worktree add [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<commit-ish>]
 git worktree list [--porcelain]
 git worktree remove [-f] <worktree>
 git worktree prune [-n] [-v] [--expire <expire>]

在展開說明之前,需要和大家普及兩個你可能忽略的Git 知識點:

  1. 預設情況下, git init 或 git clone 初始化的repo,只有一個 worktree,叫做 main worktree

  2. 在某一目錄下使用Git 指令,目前目錄下要嘛有 .git 資料夾;要嘛有 .git 文件,如果只有 .git 文件,裡面的內容必須是指向.git 資料夾的

第二句話感覺挺繞的,下面用例子說明,就很容易明白了

#如果您正在學習Spring Cloud,推薦一個連載多年還在繼續更新的免費教學:https://blog.didispace.com/spring-cloud-learning/

git worktree add

目前專案目錄結構是這樣的(amend-crash-demo 是repo 的root):

.
└── amend-crash-demo

1 directory
cd amend-crash-demo` 运行命令 `git worktree add ../feature/feature2
➜  amend-crash-demo git:(main) git worktree add ../feature/feature2
Preparing worktree (new branch &#39;feature2&#39;)
HEAD is now at 82b8711 add main file

重新看目錄結構

.
├── amend-crash-demo
└── feature
    └── feature2

3 directories

該指令預設會根據HEAD 所在的commit-ish (當然也可以指定git log 中的任意一個commit-ish) 建立一個名為feature2 的分支,分支磁碟位置如上面結構所示

#cd ../feature/feature2/ 會發現,這個分支下並不存在 .git 資料夾,卻存在一個 .git 文件,開啟文件,內容如下:

gitdir: /Users/rgyb/Documents/projects/amend-crash-demo/.git/worktrees/feature2

到這裡,你再理解一下上面的知識點2,是不是就清晰許多了呢?

接下來,你就可以在 feature2 分支上做一切你想做的內容了(add/commit/pull/push),和 main worktree 互不干擾

一般情况下,项目组都有一定的分支命名规范,比如 feature/JIRAID-Titlehotfix/JIRAID-Title, 如果仅仅按照上面命令新建 worktree,分支名称中的 / 会被当成文件目录来处理

git worktree add ../hotfix/hotfix/JIRA234-fix-naming

运行完该命令,文件目录结构是这样的

.
├── amend-crash-demo
├── feature
│   └── feature2
└── hotfix
    └── hotfix
        └── JIRA234-fix-naming

6 directories

很显然这不是我们想要的,这时我们就需要 -b 参数的支持了,就像 git checkout -b 一样

执行命令:

git worktree add -b "hotfix/JIRA234-fix-naming" ../hotfix/JIRA234-fix-naming

再来看一下目录结构

.
├── amend-crash-demo
├── feature
│   └── feature2
└── hotfix
    ├── JIRA234-fix-naming
    └── hotfix
        └── JIRA234-fix-naming

7 directories

进入 JIRA234-fix-naming 目录,默认是在 hotfix/JIRA234-fix-naming 分支上

教你怎樣不切換Git分支,同時在多個分支上工作(實例詳解)

worktree 建立起来很容易,不加管理,项目目录结构肯定乱糟糟,这是我们不想看到的,所以我们需要清晰的知道某个 repo 都建立了哪些 worktree

git worktree list

所有的worktree 都在共用一个 repo,所以在任意一个 worktree 目录下,都可以执行如下命令来查看 worktree 列表

git worktree list

执行完命令后,可以查看到我们上面创建的所有 worktree 信息, main worktree 也会显示在此处

/Users/rgyb/Documents/projects/amend-crash-demo                        82b8711 [main]
/Users/rgyb/Documents/projects/chore/chore                                   8782898 (detached HEAD)
/Users/rgyb/Documents/projects/feature/feature2                             82b8711 [feature2]
/Users/rgyb/Documents/projects/hotfix/hotfix/JIRA234-fix-naming     82b8711 [JIRA234-fix-naming]
/Users/rgyb/Documents/projects/hotfix/JIRA234-fix-naming              82b8711 [hotfix/JIRA234-fix-naming]

worktree 的工作做完了,也是要及时删除的,否则也会浪费很多磁盘空间

另外,如果您正在学习Spring Cloud,推荐一个连载多年还在继续更新的免费教程:https://blog.didispace.com/spring-cloud-learning/

git worktree remove

这个命令很简单了,worktree 的名字叫什么,直接就 remove 什么就好了

git worktree remove hotfix/hotfix/JIRA234-fix-naming

此时,分支名弄错的那个 hotfix 就被删掉了

/Users/rgyb/Documents/projects/amend-crash-demo                        82b8711 [main]
/Users/rgyb/Documents/projects/chore/chore                                   8782898 (detached HEAD)
/Users/rgyb/Documents/projects/feature/feature2                             82b8711 [feature2]
/Users/rgyb/Documents/projects/hotfix/JIRA234-fix-naming              82b8711 [hotfix/JIRA234-fix-naming]

假设你创建一个 worktree,并在里面有改动,突然间这个worktree 又不需要了,此刻你按照上述命令是不能删掉了,此时就需要 -f 参数来帮忙了

git worktree remove -f hotfix/JIRA234-fix-naming

删除了 worktree,其实在 Git 的文件中,还有很多 administrative 文件是没有用的,为了保持清洁,我们还需要进一步清理

git worktree prune

这个命令就是清洁的兜底操作,可以让我们的工作始终保持整洁

总结

到这里,你应该理解,整个 git-worktree 的使用流程就是下面这四个命令:

git worktree add
git worktree list
git worktree remove
git worktree prune

你也应该明白 git worktree 和 git clone 多个 repo 的区别了。只维护一个 repo,创建多个 worktree,操作间行云流水

我的实践:通常使用 git worktree,我会统一目录结构,比如 feature 目录下存放所有 feature 的worktree,hotfix 目录下存放所有 hotfix 的 worktree,这样整个磁盘目录结构不至于因为创建多个 worktree 而变得混乱

在磁盘管理上我有些强迫症,理想情况下,某个 repo 的 worktree 最好放在这个 repo 的文件目录里面,但这就会导致 Git track 新创建的 worktree 下的所有文件,为了避免 Git track worktree 的内容,来来回回修改 gitignore 文件肯定是不合适的!

那么如何解决呢?点击下方卡片,关注“日拱一兵”,正在连载Git的高级技巧!

灵魂追问

  1. 可以删除 main worktree 吗?为什么

  2. 反复创建和删除worktree, repo/.git/wortree 目录的变化你能理解吗?

推荐学习:《Git教程

以上是教你怎樣不切換Git分支,同時在多個分支上工作(實例詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
git和github:探索他們的角色和功能git和github:探索他們的角色和功能May 09, 2025 am 12:25 AM

Git和GitHub在軟件開發中的角色和功能是管理代碼和協作開發。 Git通過commit、branch和merge等功能高效管理代碼版本,而GitHub則提供代碼託管和協作工具,如PullRequest和Issues,提升團隊協作效率。

GitHub:發現,共享和為代碼做出貢獻GitHub:發現,共享和為代碼做出貢獻May 08, 2025 am 12:26 AM

GitHub是開發者發現、分享和貢獻代碼的首選平台。 1)通過搜索功能查找特定代碼庫,如Python項目。 2)創建倉庫並推送代碼分享給全球開發者。 3)通過Fork和PullRequest參與開源項目並貢獻代碼。

將git與github使用:實用指南將git與github使用:實用指南May 07, 2025 am 12:11 AM

Git是一種版本控制系統,GitHub是基於Git的在線平台。使用Git和GitHub進行代碼管理和團隊協作的步驟包括:1.初始化Git倉庫:gitinit。 2.添加文件到暫存區:gitadd.。 3.提交更改:gitcommit-m"Initialcommit"。 4.關聯GitHub倉庫:gitremoteaddoriginhttps://github.com/username/repository.git。 5.推送代碼到GitHub:gitpush-uoriginmaste

GitHub的影響:軟件開發與協作GitHub的影響:軟件開發與協作May 06, 2025 am 12:09 AM

GitHub對軟件開發和協作的影響深遠:1.它基於Git的分佈式版本控制系統,提高了代碼安全性和開發靈活性;2.通過PullRequest等功能,提升了團隊協作效率和知識共享;3.GitHubActions等工具幫助優化開發流程,提高代碼質量。

使用GitHub:共享,管理和為代碼做出貢獻使用GitHub:共享,管理和為代碼做出貢獻May 05, 2025 am 12:12 AM

在GitHub上分享、管理和貢獻代碼的方法包括:1.創建倉庫並推送代碼,編寫README和LICENSE文件;2.使用分支、標籤和合併請求管理代碼;3.Fork倉庫、修改並提交PullRequest貢獻代碼。通過這些步驟,開發者可以有效利用GitHub提升開發效率和協作能力。

git vs. github:比較分析git vs. github:比較分析May 04, 2025 am 12:07 AM

Git是一個分佈式版本控制系統,GitHub是一個基於Git的協作平台。 Git用於版本控制和代碼管理,GitHub則提供額外的協作功能,如代碼審查和項目管理。

git vs. github:了解差異git vs. github:了解差異May 03, 2025 am 12:08 AM

Git是分佈式版本控制系統,GitHub是基於Git的在線平台。 Git用於版本控制、分支管理和合併,GitHub提供代碼託管、協作工具和社交網絡功能。

github:前端,git:後端github:前端,git:後端May 02, 2025 am 12:16 AM

Git是後端版本控制系統,GitHub是基於Git的前端協作平台。 Git管理代碼版本,GitHub提供用戶界面和協作工具,兩者協同工作提升開發效率。

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

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

熱門文章

北端:融合系統,解釋
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
4 週前By尊渡假赌尊渡假赌尊渡假赌
<🎜>掩蓋:探險33-如何獲得完美的色度催化劑
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SecLists

SecLists

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

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。