Git交互式變基:提升開發效率的利器
在現代開發者的工具箱中,Git版本控制已成為標配。 commit
、push
和pull
等命令早已成為肌肉記憶。然而,相對而言,很少有開發者了解Git中“更高級”的功能,以及這些功能的巨大價值!本文將探討Git中最強大的工具之一——“交互式變基”。
核心要點
- 交互式變基是一個強大的Git工具,允許開發者創建結構良好的提交歷史,使項目的代碼庫更易讀,更容易理解。
- 交互式變基可用於編輯舊的提交信息、刪除提交、合併多個提交、重新排序提交、修復舊的提交以及拆分/重新打開舊的提交以進行編輯。
- 重要的是,不要在已與遠程倉庫中的同事共享的提交上使用交互式變基,因為它會重寫歷史。相反,應該在將本地提交合併到團隊分支之前使用它來清理本地提交。
- 交互式變基操作的基本機制包括:識別要操作的提交歷史部分,使用
git rebase -i
命令啟動會話,然後在打開的編輯器窗口中指定所需的操作。 - 交互式變基可以用來編輯舊的提交信息,刪除不需要的提交,並將多個提交合併成一個,從而優化和清理提交歷史。
為什麼交互式變基應該成為每個開發者工具箱的一部分
簡而言之,毫不誇張地說,交互式變基可以通過允許您在項目中創建乾淨且結構良好的提交歷史來幫助您成為更好的開發者。
為什麼結構良好的提交歷史很重要?想像一下相反的情況:難以閱讀的提交歷史,您不知道您的同事最近的更改實際上做了什麼。這樣的項目中會開始出現越來越多的“黑暗角落”,您只了解自己參與的那一小部分。
將其與乾淨且結構良好的提交歷史進行對比:它有助於使項目的代碼庫更易讀和更容易理解。這是健康、持久項目的必要組成部分!
交互式變基能為您做什麼
交互式變基可幫助您優化和清理提交歷史。它涵蓋許多不同的用例,其中一些允許您執行以下操作:
- 編輯舊的提交信息
- 刪除提交
- 合併/組合多個提交
- 重新排序提交
- 修復舊的提交
- 拆分/重新打開舊的提交以進行編輯
何時使用交互式變基(以及何時不使用!)
與其他一些Git工具一樣,交互式變基“重寫歷史”。這意味著,當您使用交互式變基操作一系列提交時,提交歷史的這部分將被重寫:提交的SHA-1哈希將發生更改。可以這樣說,它們是全新的提交對象。
這一事實需要遵守一個簡單但重要的規則:不要在您已與遠程存儲庫中的同事共享的提交上使用交互式變基(或其他重寫歷史的工具)。相反,請使用它來清理您自己的本地提交——例如,在您自己的某個功能分支中——然後再將它們合併到團隊分支中。
交互式變基操作的基本機制
儘管交互式變基可以用於許多不同的事情,但其基本工作流程始終相同。一旦您牢固地理解了這個基本機制,交互式變基就會失去其“複雜神秘”的氛圍,並成為您工具箱中一個有價值且易於使用的工具。
步驟 1:您應該在哪裡啟動會話?
您需要回答的第一個問題是:“我想操作提交歷史的哪一部分?”這告訴您應該在哪裡啟動交互式變基會話。讓我們舉一個實際的例子,假設我們要編輯舊的提交信息(這正是我們稍後在實踐中要做的)。
我們的起始情況如下圖所示,我們通過交互式變基編輯舊的提交信息。
為了能夠更改C2中的提交信息,我們必須在其父提交處(或者更早,如果您願意)啟動交互式變基會話。在這個例子中,我們將使用C1作為交互式變基會話的起點。
步驟 2:啟動實際會話!
啟動實際會話非常簡單:
<code>$ git rebase -i HEAD~3</code>
我們使用帶有-i
標誌的git rebase
命令(表示我們確實希望它是“交互式的”),並提供基本提交(我們在上面的第一步中想出的)。在這個例子中,我使用了HEAD~3
來指定“落後於HEAD提交3個提交”的提交。或者,我也可以提供一個特定的SHA-1哈希。
步驟 3:告訴Git您想做什麼
啟動交互式變基會話後,您將看到一個編輯器窗口,其中Git列出一系列提交——從最新的提交一直到(但不包括)您在步驟1中選擇的作為基本提交的提交。
在此步驟中,需要注意兩點:
- 提交按反向順序列出!我們期望出現在頂部的最新提交將出現在列表的底部。別擔心:您的Git存儲庫完好無損! ? 請記住,我們正在執行交互式變基操作,這需要Git在操作結束時從舊到新重新應用提交。
- 不要在此編輯器窗口中進行實際更改!儘管您可能很想直接在此編輯器窗口中更改提交信息(畢竟,這正是我們想要做的……),但您必須耐心等待。在這裡,我們只是告訴Git我們想做什麼——而不是進行實際更改。我將很快在實踐中演示這一點!
有了這個理論概述,讓我們一起深入研究一些實際案例!
編輯舊的提交信息
交互式變基最流行的用例之一是,您可以在事後編輯舊的提交信息。您可能知道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交互式變基常見問題解答 (FAQ)
Git變基和Git合併有什麼區別?
Git變基和Git合併是將一個分支的更改集成到另一個分支的兩種不同方法。 Git合併是一種直接組合來自兩個不同分支的代碼的方法。它在歷史記錄中創建一個新的提交,保留提交的時間順序。另一方面,Git變基是一種將一系列提交移動或組合到新的基本提交的方法。這就像說“我想在我的更改的基礎上添加其他人的工作”。換句話說,它允許您將當前分支的更改放置在另一個分支的頂部。
如何撤消Git變基?
如果您想撤消Git變基,可以使用命令git reflog
來查找要返回到的提交,然後使用命令git reset --hard HEAD@{number}
。 git reflog
命令顯示對HEAD所做的每個更改的列表,git reset
命令允許您將當前HEAD設置為指定狀態。
Git交互式變基的目的是什麼?
Git交互式變基允許您以多種方式更改提交,例如編輯、刪除和壓縮。您不僅可以更改提交信息,還可以更改實際代碼(如果您犯了錯誤)。這是一個強大的工具,可以讓您完全控制項目的提交歷史。
如何使用Git交互式變基壓縮提交?
壓縮是將多個提交合併為一個提交的行為。在Git中,您可以使用git rebase -i
命令後跟要壓縮的提交哈希來壓縮提交。在打開的文本編輯器中,您可以通過將pick
替換為squash
或s
來標記要壓縮的提交。
使用Git交互式變基的風險是什麼?
雖然Git交互式變基是一個強大的工具,但如果使用不當,它可能是危險的。它會重寫提交歷史,如果您正在處理其他人也在處理的公共分支,這可能會造成問題。建議在尚未推送的本地分支上使用它。
如何在Git變基期間解決衝突?
在變基過程中,可能會發生衝突。 Git將暫停並允許您在繼續之前解決這些衝突。您可以通過編輯文件來修復衝突的更改,然後使用git add
添加已解決的文件來解決衝突。解決所有衝突後,您可以使用git rebase --continue
繼續變基。
我可以使用Git交互式變基來拆分提交嗎?
是的,您可以使用Git交互式變基將一個提交拆分為較小的提交。如果您在一個提交中進行了多次更改,但後來決定它們應該成為單獨的提交,這將非常有用。
如何使用Git交互式變基編輯提交信息?
您可以在交互式變基期間編輯提交信息。在提交列表中,將pick
替換為reword
或r
,以標記要編輯的提交。繼續時,Git將為每個標記為reword
的提交打開一個文本編輯器,允許您更改提交信息。
Git變基和Git拉取有什麼區別?
Git pull
是一個從遠程存儲庫獲取更改並將它們合併到當前分支的命令。另一方面,Git rebase
是一個將一系列提交移動或組合到新的基本提交的命令。雖然這兩個命令都用於集成更改,但它們以不同的方式進行。
我可以使用Git交互式變基來更改提交的順序嗎?
是的,您可以使用Git交互式變基來更改提交的順序。在提交列表中,您可以簡單地更改行的順序來更改提交的順序。如果您想使您的提交歷史更合乎邏輯或更清晰,這將非常有用。
以上是git互動式恢復指南,並有實踐示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

與這些頂級開發人員新聞通訊有關最新技術趨勢的了解! 這個精選的清單為每個人提供了一些東西,從AI愛好者到經驗豐富的後端和前端開發人員。 選擇您的收藏夾並節省時間搜索REL

該教程通過使用AWS服務來指導您通過構建無服務器圖像處理管道。 我們將創建一個部署在ECS Fargate群集上的next.js前端,與API網關,Lambda函數,S3桶和DynamoDB進行交互。 Th

該試點程序是CNCF(雲本機計算基礎),安培計算,Equinix金屬和驅動的合作,簡化了CNCF GitHub項目的ARM64 CI/CD。 該計劃解決了安全問題和績效


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

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

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。