我閱讀了 Ian Whitlock 關於他為何無法捨棄 Magit 的文章,這篇文章啟發了我從我的角度分享更多關於 Magit 的資訊。本文將聚焦於 rebase。
這裡我開啟了 git log 1 1 抱歉,滑鼠游標是截圖時選取區域的痕跡。,首先開啟 Magit(我將其綁定到 F3 鍵),然後按下 lL 。第一個 l 是處理 git log 的前綴鍵,第二個 L 是查看所有本地分支(以及它們追蹤的遠端分支)的日誌。
假設我們想執行一個更複雜的 log 命令,在 Magit 中非常容易做到。當我們按下第一個 l 並稍作停頓,Magit 會顯示所有可用選項的不顯眼提示:
這意味著我們不必確切記住所有選項,因為如果我們需要它們,Magit 會提醒我們。例如:
透過此配置,我們想查看所有分支,包括遠端分支。我們透過最終按下 b 來獲得該視圖。
這是極高的 Git 可發現性!我一直是 git.txt 中列出的那個人,但 Magit 的可發現性仍然教會了我許多使用 Git 的新方法。但它不僅可發現,而且快速。這是完整的按鍵序列,其中 ␍ 代表用 return 確認:
這看起來很複雜,但請記住我們是如何建立它的:我們查看了提示並一次選擇了一個選項。現在,如果這是我們經常使用的日誌類型,我們將能夠在不看提示的情況下寫出那個咒語。它既可發現又高效。
在 shell 中對應的 git 命令會是
我怎麼知道?因為它就在 Magit log 提示中!如果 Magit 沒有告訴我,我將不得不花費大量時間在 man 手冊頁和命令列之間來回切換。
人們擔心,如果你使用更多互動式的 Git 介面,你將在管理 Git 命令列方面變得更糟。Magit 並非如此。Magit 完全透明,並鼓勵你理解它在後台執行哪些 Git 命令。
提醒一下,這就是我們正在處理的。
我們想將 profiling-of-test-suite 分支 rebase 到 optimise-company-name-generation 之上。我們可以從優化公司名稱生成中得知當前分支是優化,因為它被藍色框包圍。
我們將文字游標移到 profiling 分支上(它以灰色高亮顯示),所以我們可以透過按下 bb␍ 來切換到該分支。第一個 b 是用於 checkout,第二個 b 是用於 branch,模糊匹配列表將預設為日誌視圖下的分支。完成後,框將跳到 profiling 分支,表示我們已切換到它。
然後我們將游標向上移動到 optimise 分支,並按下 re␍ 。r 是 rebase,e 是「elsewhere」(即不在 upstream 之上),模糊匹配列表再次預設為日誌視圖下的提交,所以我們可以透過 return 確認。2 2 提醒一下,如果我們不確定,我們可以只輸入第一個字母,Magit 會顯示提示。(例如,添加 -i 將使 rebase 互動式。)
就是這樣!日誌更新以顯示 profiling 分支在 optimise 之上。
如果我們有一個更複雜的互動式 rebase,我們會得到一個可編輯的提交列表,其中包含用於執行 rebase 操作的便捷熱鍵,例如 k 捨棄、f fixup、w reword、s squash 等。提交列表下方還有一個支援的操作列表,以防我們忘記可用的操作。3 3 例如,我幾乎從不創建新的提交進行 rebase,也不創建合併提交。但你可以做到。
如果我們想知道 Magit 執行了哪個命令,我們可以按下 $ 並獲得 Magit 命令日誌,其中 Magit 列出了它執行的每個 git 命令。在本例中,它將顯示
… 呃,--autostash 是什麼,為什麼 Magit 預設使用它?讓我們在 man git-rebase 中查找一下:
在操作開始前自動創建一個臨時的 stash 條目,並在操作結束後應用它。這意味著你可以在一個髒的工作樹上執行 rebase。但是,請謹慎使用:成功的 rebase 後最終的 stash 應用可能會導致衝突。
好的,是的,這作為預設值是有道理的。我經常在髒的工作樹上進行 rebase,很高興不必手動 stash。
這是 Magit 也能教我們更好地使用 Git 的另一種方式。如果 Magit 沒有預設使用 --autostash,我也不會知道它。這也是我學到 --force-with-lease 比 --force 嚴格來說更好,但很少有人知道它。
這不是一個複雜的操作。我們可以透過 Git 命令列來完成。事實上,這將是微不足道的——我們剛剛看到了 Magit 在後台執行的兩個命令。但透過互動式的 Magit 日誌視圖來完成,我們可以對命令的效果獲得更好的直覺和理解。當我們習慣了 Magit 後,我們將開始執行更複雜的命令,而這些命令我們可能沒有信心在沒有互動式 Magit 日誌清晰呈現的情況下執行。
當然,還有其他圖形化的 Git 介面,我們可以透過其中任何一個來完成這個 rebase。但那樣我們就不會像現在這樣學到這麼多關於 Git 的知識了。
Magit 處於解決方案空間的一個完美點,它基本上只是 Git 命令列的一個薄包裝器,並且對此毫不諱言。然而,它用難以在其他地方找到的互動性、可發現性和效率來增強 Git 命令列。
我們在這裡只看到了一瞥——等到你聽到 Magit 如何輕鬆地讓我們對檔案、hunks,甚至 hunks 的部分進行互動式 staging、unstaging、revert、reset。