使用 Git 工作樹對你的代碼進行自由實驗
Git 的設計部分是為了進行實驗。如果你知道你的工作會被安全地跟蹤,並且在出現嚴重錯誤時有安全狀態存在,你就不會害怕嘗試新的想法。不過,創新的部分代價是,你很可能會在這個過程中弄得一團糟。文件會被重新命名、移動、刪除、更改、切割成碎片;新的文件被引入;你不打算跟蹤的臨時文件會在你的工作目錄中佔據一席之地等等。
簡而言之,你的工作空間變成了紙牌屋,在「快好了!」和「哦,不,我做了什麼?」之間岌岌可危地平衡著。那麼,當你需要把倉庫恢復到下午的一個已知狀態,以便完成一些真正的工作時,該怎麼辦?我立刻想到了 git branch
和 git stash 這兩個經典命令,但這兩個命令都不是用來處理未被跟蹤的文件的,而且文件路徑的改變和其他重大的轉變也會讓人困惑,它們只能把工作暫存(stash
)起來以備後用。解決這個需求的答案是 Git 工作樹。
什麼是 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 remove prune
何時使用工作樹
與許多選項一樣,無論是標籤還是書籤還是自動備份,都要靠你來跟蹤你產生的數據,否則可能會變得不堪重負。不要經常使用工作樹,要不你最終會有 20 份存儲庫的副本,每份副本的狀態都略有不同。我發現最好是創建一個工作樹,做需要它的任務,提交工作,然後刪除樹。保持簡單和專註。
重要的是,工作樹為你管理 Git 存儲庫的方式提供了更好的靈活性。在需要的時候使用它們,再也不用為了檢查另一個分支上的內容而爭先恐後地保存工作狀態了。
via: https://opensource.com/article/21/4/git-worktree
作者:Seth Kenlon 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive