Git交互式變基:提升開發效率的利器
在現代開發者的工具箱中,Git版本控制已成為標配。 commit
、push
和pull
等命令早已成為肌肉記憶。然而,相對而言,很少有開發者了解Git中“更高級”的功能,以及這些功能的巨大價值!本文將探討Git中最強大的工具之一——“交互式變基”。
git rebase -i
命令啟動會話,然後在打開的編輯器窗口中指定所需的操作。 簡而言之,毫不誇張地說,交互式變基可以通過允許您在項目中創建乾淨且結構良好的提交歷史來幫助您成為更好的開發者。
為什麼結構良好的提交歷史很重要?想像一下相反的情況:難以閱讀的提交歷史,您不知道您的同事最近的更改實際上做了什麼。這樣的項目中會開始出現越來越多的“黑暗角落”,您只了解自己參與的那一小部分。
將其與乾淨且結構良好的提交歷史進行對比:它有助於使項目的代碼庫更易讀和更容易理解。這是健康、持久項目的必要組成部分!
交互式變基可幫助您優化和清理提交歷史。它涵蓋許多不同的用例,其中一些允許您執行以下操作:
與其他一些Git工具一樣,交互式變基“重寫歷史”。這意味著,當您使用交互式變基操作一系列提交時,提交歷史的這部分將被重寫:提交的SHA-1哈希將發生更改。可以這樣說,它們是全新的提交對象。
這一事實需要遵守一個簡單但重要的規則:不要在您已與遠程存儲庫中的同事共享的提交上使用交互式變基(或其他重寫歷史的工具)。相反,請使用它來清理您自己的本地提交——例如,在您自己的某個功能分支中——然後再將它們合併到團隊分支中。
儘管交互式變基可以用於許多不同的事情,但其基本工作流程始終相同。一旦您牢固地理解了這個基本機制,交互式變基就會失去其“複雜神秘”的氛圍,並成為您工具箱中一個有價值且易於使用的工具。
您需要回答的第一個問題是:“我想操作提交歷史的哪一部分?”這告訴您應該在哪裡啟動交互式變基會話。讓我們舉一個實際的例子,假設我們要編輯舊的提交信息(這正是我們稍後在實踐中要做的)。
我們的起始情況如下圖所示,我們通過交互式變基編輯舊的提交信息。
為了能夠更改C2中的提交信息,我們必須在其父提交處(或者更早,如果您願意)啟動交互式變基會話。在這個例子中,我們將使用C1作為交互式變基會話的起點。
啟動實際會話非常簡單:
<code>$ git rebase -i HEAD~3</code>
我們使用帶有-i
標誌的git rebase
命令(表示我們確實希望它是“交互式的”),並提供基本提交(我們在上面的第一步中想出的)。在這個例子中,我使用了HEAD~3
來指定“落後於HEAD提交3個提交”的提交。或者,我也可以提供一個特定的SHA-1哈希。
啟動交互式變基會話後,您將看到一個編輯器窗口,其中Git列出一系列提交——從最新的提交一直到(但不包括)您在步驟1中選擇的作為基本提交的提交。
在此步驟中,需要注意兩點:
有了這個理論概述,讓我們一起深入研究一些實際案例!
交互式變基最流行的用例之一是,您可以在事後編輯舊的提交信息。您可能知道git commit --amend
也允許您更改提交的信息——但這僅適用於最新的提交。對於任何比這更舊的提交,我們都必須使用交互式變基!
讓我們來看一個具體的場景。下面是需要更正的錯誤提交信息的圖像。
注意:為了更好地概述和更清晰的可視化,我在一些屏幕截圖中使用了Tower Git桌面客戶端。您不需要Tower就可以按照本教程進行操作。
對於我們的示例,假設我們要編輯當前標題為“Optimize markup structure in index…”的提交的消息。
我們的第一步是確定此交互式變基會話的基本提交。由於我們必須(至少)返回到我們的“壞蘋果”提交的父提交,因此我們以HEAD~3
(落後於HEAD提交三個提交,即標題為“Change headlines …”的提交)作為會話的起點:
<code>$ git rebase -i HEAD~3</code>
執行此命令後,您最喜歡的編輯器將打開並顯示您剛剛選擇的提交列表(通過提供基本提交)。
提醒一下:雖然您可能很想這樣做,但我們在這裡不會更改提交信息。我們只用“操作關鍵字”標記相應的行。在我們的例子中,我們要改寫提交(這意味著我們想更改提交信息,但保留提交的其餘部分)。
實際上,所有可用的操作關鍵字都在此窗口的底部有說明——因此無需記住任何內容!
一旦您用首選操作關鍵字替換了標準的pick
關鍵字(這意味著“按原樣接受提交”),您只需保存並關閉窗口即可。
這樣做之後,將打開一個新的編輯器窗口,其中包含當前的提交信息。最後,我們可以做我們一開始就打算做的事情:編輯這個舊提交的消息!
在我們進行更改並保存並關閉編輯器窗口後,交互式變基會話就完成了——我們的提交信息已更新! ?
交互式變基還允許您從不需要(或不想要)的歷史記錄中刪除舊的提交。想像一下,您不小心在最近的提交中包含了個人密碼:在大多數情況下,此類敏感信息不應包含在代碼庫中。
還要記住,簡單地刪除信息並再次提交並不能真正解決您的問題:這意味著密碼仍然以舊提交的形式保存在存儲庫中。您真正想要的是從存儲庫中完全乾淨地刪除此數據!
讓我們首先確定交互式變基會話的基本提交。由於我們需要至少從錯誤提交的父提交開始,因此我們使用“Optimize markup structure…”提交作為我們的基礎:
<code>$ git rebase -i HEAD~3</code>
請注意,這次我在git rebase -i
命令中使用了具體的SHA-1哈希。當然,除了提交哈希之外,我還可以使用HEAD~2
來處理該提交。
執行此命令後,我們將再次看到一個提交列表。
這次,我們使用drop
操作關鍵字來擺脫不需要的提交。或者,在這種特殊情況下,我們也可以簡單地從編輯器中刪除整行。如果在保存和關閉窗口時不再存在一行(代表一個提交),Git將刪除相應的提交。
無論您選擇哪種方式,在保存並關閉編輯器窗口後,提交將從您的存儲庫歷史記錄中刪除!
交互式變基的另一個用例是當您想將多個單獨的提交合併為一個時。在我們深入探討如何工作之前,讓我們花幾分鐘時間討論何時或為什麼這可能很有價值。
一般來說,使提交“更大”(通過將多個提交合併為一個)在大多數情況下不是一個好策略。一般的經驗法則是盡可能使提交保持較小,因為“較小”意味著“更容易閱讀和理解”。但是,在某些情況下,這仍然是有意義的。以下列舉兩個例子:
在這兩個例子中的基本原理都是相同的:通過組合本來應該是一個提交的兩個(或多個)提交,您正在創建更乾淨、更易讀的提交歷史!
讓我們一起完成一個實際示例,並以以下圖片所示的情況作為我們的起始情況。
假設從語義上講,將這兩個提交合併為一個提交更有意義。使用交互式變基的squash
工具,我們可以做到這一點:
<code>$ git rebase -i HEAD~3</code>
到目前為止,您已經習慣了接下來會發生什麼:一個編輯器窗口將打開,其中包含提交列表。
我已經提到過,在這種情況下我們將使用squash
操作關鍵字。關於squash
如何工作,有一件重要的事情要知道:您用關鍵字標記的行將與正上方的行合併! 這解釋了為什麼我在我們的示例中用squash
關鍵字標記了第2行。
保存並關閉此窗口後,將打開一個新窗口。這是因為,通過組合多個提交,我們當然會創建一個新的提交。而這個提交也需要提交信息,就像任何其他提交一樣!
您在上面的屏幕截圖中看到的是Git為我們準備的內容:它將相應原始提交的提交信息與一些註釋組合在一起。您可以隨意刪除舊消息並重新開始——或者保留它們並添加更多信息。
保存並關閉此編輯器窗口後,我們可以自豪地說:以前是兩個單獨的提交,現在是一個提交了!
我希望您同意Git的交互式變基工具非常有價值!作為開發者,我們必須努力爭取乾淨清晰的提交歷史。這是保持代碼庫健康且易於理解(對於您的隊友和您自己,在一段時間過去之後)的關鍵因素。
如果您想了解更多信息,我強烈推薦“Git急救包”。這是一個(免費的)簡短視頻合集,向您展示如何清理和撤消Git中的錯誤。
玩得開心!
Git變基和Git合併是將一個分支的更改集成到另一個分支的兩種不同方法。 Git合併是一種直接組合來自兩個不同分支的代碼的方法。它在歷史記錄中創建一個新的提交,保留提交的時間順序。另一方面,Git變基是一種將一系列提交移動或組合到新的基本提交的方法。這就像說“我想在我的更改的基礎上添加其他人的工作”。換句話說,它允許您將當前分支的更改放置在另一個分支的頂部。
如果您想撤消Git變基,可以使用命令git reflog
來查找要返回到的提交,然後使用命令git reset --hard HEAD@{number}
。 git reflog
命令顯示對HEAD所做的每個更改的列表,git reset
命令允許您將當前HEAD設置為指定狀態。
Git交互式變基允許您以多種方式更改提交,例如編輯、刪除和壓縮。您不僅可以更改提交信息,還可以更改實際代碼(如果您犯了錯誤)。這是一個強大的工具,可以讓您完全控制項目的提交歷史。
壓縮是將多個提交合併為一個提交的行為。在Git中,您可以使用git rebase -i
命令後跟要壓縮的提交哈希來壓縮提交。在打開的文本編輯器中,您可以通過將pick
替換為squash
或s
來標記要壓縮的提交。
雖然Git交互式變基是一個強大的工具,但如果使用不當,它可能是危險的。它會重寫提交歷史,如果您正在處理其他人也在處理的公共分支,這可能會造成問題。建議在尚未推送的本地分支上使用它。
在變基過程中,可能會發生衝突。 Git將暫停並允許您在繼續之前解決這些衝突。您可以通過編輯文件來修復衝突的更改,然後使用git add
添加已解決的文件來解決衝突。解決所有衝突後,您可以使用git rebase --continue
繼續變基。
是的,您可以使用Git交互式變基將一個提交拆分為較小的提交。如果您在一個提交中進行了多次更改,但後來決定它們應該成為單獨的提交,這將非常有用。
您可以在交互式變基期間編輯提交信息。在提交列表中,將pick
替換為reword
或r
,以標記要編輯的提交。繼續時,Git將為每個標記為reword
的提交打開一個文本編輯器,允許您更改提交信息。
Git pull
是一個從遠程存儲庫獲取更改並將它們合併到當前分支的命令。另一方面,Git rebase
是一個將一系列提交移動或組合到新的基本提交的命令。雖然這兩個命令都用於集成更改,但它們以不同的方式進行。
是的,您可以使用Git交互式變基來更改提交的順序。在提交列表中,您可以簡單地更改行的順序來更改提交的順序。如果您想使您的提交歷史更合乎邏輯或更清晰,這將非常有用。
以上是git互動式恢復指南,並有實踐示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!