新入職了一家公司,發現不同項目用的使用一個 git 倉庫管理。不久之后我看到這篇文章。
Git 的設計部??分是為了支持實驗。一旦你確定你的工作被安全地跟蹤,并且存在安全的狀態,以便在出現嚴重錯誤時可以恢復,你就不會害怕嘗試新的想法。然而,創新的代價之一就是你可能會在過程中弄得一團糟。文件會被重命名、移動、刪除、更改,甚至被分割成多個文件。新的文件會被引入。你不想跟蹤的臨時文件會在你的工作目錄中駐留。
簡而言之,你的工作區變成了一座紙牌屋,在“快要正常工作了!”和“哦不,我做了什么?”之間艱難地平衡著。那么,當你需要讓倉庫在某個下午恢復到已知狀態以便完成一些實際工作時,該怎么辦呢?經典命令 git branch 和git stash?會立即浮現在你的腦海中,但它們的設計初衷并非以某種方式處理未跟蹤文件、更改的文件路徑以及其他重大變更,而存儲工作以供日后使用會讓人感到困惑。答案是 Git worktree。
什么是 Git 工作樹
Git 工作樹是 Git 倉庫的鏈接副本,允許您一次檢出多個分支。工作樹與主工作副本有獨立的路徑,但可以處于不同的狀態并位于不同的分支。Git 中新工作樹的優勢在于,您可以進行與當前任務無關的更改,提交更改,然后在稍后合并,所有這些都不會干擾您當前的工作環境。
一個典型的例子,直接來自git-worktree
手冊頁:你正在為一個項目開發一個令人興奮的新功能,這時項目經理告訴你,需要緊急修復一個問題。問題在于,由于你正在開發一個重要的新功能,你的工作倉庫(你的“工作樹”)一片混亂。你不想把修復工作“偷偷”拖進當前的沖刺階段,也不想為了修復這個功能而存儲更改,創建一個新的分支。于是,你決定創建一個新的工作樹,以便在那里進行修復:
$ git branch | tee
* dev
trunk
$ git worktree add -b hotfix ~/code/hotfix trunk
Preparing ../hotfix (identifier hotfix)
HEAD is now at 62a2daf commit
在你的目錄中code
,現在有一個名為 的新目錄hotfix
,它是一個鏈接到你主項目倉庫的 Git 工作樹,它HEAD
位于名為 的分支trunk
。現在你可以將此工作樹視為你的主工作區。你可以將目錄切換到該目錄,進行緊急修復,提交修復,并最終刪除該工作樹:
$ cd ~/code/hotfix
$ sed -i 's/teh/the/' hello.txt
$ git commit --all --message 'urgent hot fix'
完成緊急工作后,您可以返回上一個任務。您可以控制何時將修補程序集成到主項目中。例如,您可以將更改直接從其工作樹推送到項目的遠程倉庫:
$ git push origin HEAD
$ cd ~/code/myproject
或者您可以將工作樹存檔為 TAR 或 ZIP 文件:
$ cd ~/code/myproject
$ git archive --format tar --output hotfix.tar master
或者您可以從單獨的工作樹本地獲取更改:
$ git worktree list
/home/seth/code/myproject 15fca84 [dev]
/home/seth/code/hotfix 09e585d [master]
從那里,您可以使用最適合您和您的團隊的策略合并您的更改。
列出活動工作樹
您可以使用以下命令獲取工作樹列表并查看每個工作樹已檢出的分支git worktree list
:
$ git worktree list
/home/seth/code/myproject 15fca84 [dev]
/home/seth/code/hotfix 09e585d [master]
您可以在任一工作樹中使用它。工作樹始終保持鏈接(除非您手動移動它們,否則 Git 將無法定位工作樹,從而切斷鏈接)。
移動工作樹
Git 跟蹤項目.git
目錄中工作樹的位置和狀態:
$ cat ~/code/myproject/.git/worktrees/hotfix/gitdir
/home/seth/code/hotfix/.git
如果需要重新定位工作樹,則必須使用git worktree move
;否則,當 Git 嘗試更新工作樹的狀態時,將會失敗:
$ mkdir ~/Temp
$ git worktree move hotfix ~/Temp
$ git worktree list
/home/seth/code/myproject 15fca84 [dev]
/home/seth/Temp/hotfix 09e585d [master]
刪除工作樹
完成工作后,可以使用remove
子命令將其刪除:
$ git worktree remove hotfix
$ git worktree list
/home/seth/code/myproject 15fca84 [dev]
為了確保.git
目錄干凈,請prune
在刪除工作樹后使用子命令:
$ git worktree prune
何時使用工作樹
與許多選項一樣,無論是標簽頁、書簽還是自動備份,您都需要自行跟蹤生成的數據,否則可能會不堪重負。不要過于頻繁地使用工作樹,以免最終導致您的代碼庫副本多達 20 個,每個副本的狀態都略有不同。我發現最好的方法是創建一個工作樹,執行需要它的任務,提交工作,然后刪除該工作樹。保持簡潔和專注。
重要的是,工作樹為 Git 倉庫的管理提供了更高的靈活性。在需要的時候使用它們,再也不用為了檢查其他分支上的內容而費力地保存工作狀態了。