這篇文章為大家帶來了關於Git分支的相關知識,主要介紹了在不切換分支時怎麼在多個分支上工作的相關問題,希望對大家有幫助。
正在開發某個feature,老闆突然跳出來說讓你做生產上的hotfix 更是家常便飯,面對這種情況,使用Git 的我們通常有兩種解決方案:
草草提交未完成的feature,然後切換分支到hotfix
git stash | git stash pop
暫存工作內容,然後再切換到hotfix
#第二種方式較第一種還好很多,可是面對下面這些場景,stash 依舊不是很好的解決方案
我們面對的場景
在main 分支上跑長時間的測試,切換到hotfix 或feature, 測試就會中斷
專案非常大,頻繁的切換索引,成本非常高
有幾年前release 的舊版本,設定和目前不一樣,IDE restructure 適配切換也會帶來很大的開銷
#切換分支,需要重新設定對應的環境變量,例如dev/qa/prod
需要切換到同事的程式碼,幫助調試程式碼復現問題
#有的同學想到,git clone 多個repo 不就可以了嗎?這是解決上述問題的一個方法,但背後同樣隱藏很多問題:
多個repo 的狀態是不好同步的,例如沒辦法快速cherry-pick, 一個repo checkout的分支,另外一個repo 需要重新checkout
git history/log 是重複的,當專案歷史非常長,
.git
資料夾下的內容是非常佔用磁碟空間的同一個項目,多個repo,不容易管理
那如何做才能滿足這些特殊場景,又不出現這些上述這些問題呢?
git-worktree
其實,這是Git 2015 年就開始支援的功能,卻很少人知道它,git-worktree 的使用非常方便,在終端機輸入:
git worktree --help
就可以快速看到幫助文件說明:
#用簡單的話來解釋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 知識點:
預設情況下,
git init
或git clone
初始化的repo,只有一個worktree
,叫做main worktree
在某一目錄下使用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 'feature2') 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-Title
, hotfix/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
分支上
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的高级技巧!
灵魂追问
可以删除 main worktree 吗?为什么
反复创建和删除worktree, repo/.git/wortree 目录的变化你能理解吗?
推荐学习:《Git教程》
以上是教你怎樣不切換Git分支,同時在多個分支上工作(實例詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

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

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

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

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

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

解決 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)。檢查防火


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

Dreamweaver CS6
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

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

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!