Git 時光機:修改Commit信息

前言

列位看官都知道,Git 的每一次 git commit,其中會包含作者(Author)和提交者(Committer)的姓名與郵箱。有時可能會因為配置錯誤、切換了開發環境,或者只是單純的手滑,導致 commit 的作者信息不正確。

別擔心,Git 提供了強大的工具來修正這些“歷史遺留問題”。不過,請記住:修改 Git 歷史是一項具有潛在風險的操作,尤其是當這些 commit 已經被推送到共享倉庫時。 它會改變 commit 的 SHA-1 哈希值,可能影響團隊協作。在操作前,請務必了解風險并做好備份。

修改場景與對應方案

根據不同場景修改的 commit 范圍和位置,有不同的策略:

場景一:只修改最新的那一個 Commit

這是最簡單的情況。如果剛剛提交,發現作者信息錯了:

  1. 確保 Git 配置正確:

    # 針對當前倉庫設置
    git config user.name "Your Correct Name"
    git config user.email "your.correct.email@example.com"
    # 或全局設置
    # git config --global user.name "Your Correct Name"
    # git config --global user.email "your.correct.email@example.com"
    
  2. 使用 git commit --amend

    git commit --amend --reset-author --no-edit
    
    • --amend:修改上一個 commit。
    • --reset-author:使用當前 Git 配置中的 user 和 email 更新 Author 和 Committer 信息。
    • --no-edit:保持原有的 commit message 不變。

    如果想直接指定作者信息,而不是依賴配置:

    git commit --amend --author="Your Correct Name <your.correct.email@example.com>" --no-edit
    

場景二:修改最近的幾個連續 Commit

如果需要修改最近幾個連續的 commit,交互式 Rebase (git rebase -i) 是好幫手:

  1. 啟動交互式 Rebase:
    假設要修改最近的 3 個 commit:

    git rebase -i HEAD~3
    

    Git 會打開一個編輯器,列出這 3 個 commit。

  2. 標記要編輯的 Commit:
    在編輯器中,將需要修改作者信息的每一行前面的 pick 改為 edit (或 e)。

    edit abcdef1 Commit message 1
    edit fedcba9 Commit message 2
    pick 1234567 Commit message 3  # 這個不改,保持 pick
    

    保存并關閉編輯器。

  3. 逐個修改 Commit:
    Git 會暫停在第一個標記為 edit 的 commit 上。此時,可以:

    • 確保 Git 配置正確(同場景一的步驟 1)。
    • 使用 git commit --amend --reset-author --no-edit 來更新當前 commit 的作者信息。
    • 然后執行 git rebase --continue,Git 會繼續到下一個標記為 edit 的 commit,重復此過程。
  4. 完成 Rebase:
    當所有標記為 edit 的 commit 都處理完畢后,Rebase 完成。

場景三:修改任意位置的多個或所有 Commit

對于更復雜的批量修改,例如修改歷史中特定作者的所有 commit,或者修正整個項目的作者信息,推薦使用 git filter-repo 工具。它比老舊的 git filter-branch 更快、更安全、更易用。

  1. 安裝 git filter-repo

    pip install git-filter-repo
    
  2. 備份您的倉庫! (重要!)

  3. 執行修改:
    例如,將所有 old-email@example.com 的作者信息改為 New Name <new-email@example.com>

    git filter-repo --env-callback '
    import os
    if os.environ.get("GIT_AUTHOR_EMAIL") == "old-email@example.com":os.environ["GIT_AUTHOR_NAME"] = "New Name"os.environ["GIT_AUTHOR_EMAIL"] = "new-email@example.com"
    # 如果需要,也可以類似地修改 GIT_COMMITTER_EMAIL 和 GIT_COMMITTER_NAME
    '
    

    git filter-repo 會遍歷并重寫 commit。您可以根據需要調整腳本邏輯,例如基于舊用戶名判斷等。
    如果需要修改所有分支和標簽,可以添加 --all 參數。

    注意: git filter-branch 是另一個選擇,但它更復雜且容易出錯,一般不推薦新手使用。

修改歷史后的重要一步:推送

當修改了本地的 commit 歷史后,這些 commit 的 SHA-1 哈希值會發生改變。如果之前已經將這些 commit 推送到了遠程倉庫,直接 git push 會失敗,因為本地歷史和遠程歷史產生了分歧。

需要使用強制推送 (Force Push)

git push origin your-branch-name --force

或者,一個更安全的選擇是 --force-with-lease,它會檢查遠程分支在您上次拉取后是否被其他人修改過:

git push origin your-branch-name --force-with-lease

警告:強制推送會覆蓋遠程倉庫的歷史。請確保您了解其影響,并在團隊協作中提前溝通!

小插曲:為什么 Rebase 后 push 提示 “Everything up-to-date”?

有時,在使用 git rebase -i 修改 commit(例如標記為 edit 來修改作者)的過程中,可能會嘗試 push,卻發現 Git 提示 Everything up-to-date,即使已經用 git commit --amend 修改了 commit。

這通常是因為:** Rebase 過程還沒有完全結束!**

  • 當使用 edit 時,Git 會在那個 commit 處暫停。
  • 執行 git commit --amend 只是修改了當前這個暫停的 commit。
  • 當前分支指針(例如 maindev)此時尚未移動到這個新生成的 commit 鏈上。 它仍然指向 Rebase 開始前的舊 commit。
  • 因此,Git 比較本地分支指針和遠程分支指針時,發現它們指向同一個(舊的)commit,自然認為一切都是最新的。

解決方案:

  1. 完成對當前 edit commit 的修改后,務必執行:
    git rebase --continue
    
  2. 如果還有其他 edit 的 commit,重復修改和 git rebase --continue 的過程。
  3. 直到整個 Rebase 過程成功結束(git status 不再顯示 “rebase in progress”),當前分支指針才會更新到新的 commit 歷史。
  4. 此時,再進行強制推送,就能成功將修改后的歷史推送到遠程了。

結語

修改 Git commit 的信息掌握了正確的方法,就能很方便操作。記住,在共享倉庫中操作時,溝通是關鍵!希望這篇小文能在列位看官需要時有所幫助!


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79371.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79371.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79371.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QSFP+、QSFP28、QSFP-DD接口分別實現40G、100G、200G/400G以太網接口

常用的光模塊結構形式&#xff1a; 1&#xff09;QSFP等效于4個SFP&#xff0c;支持410Gbit/s通道傳輸&#xff0c;可通過4個通道實現40Gbps傳輸速率。與SFP相比&#xff0c;QSFP光模塊的傳輸速率可達SFP光模塊的四倍&#xff0c;在部署40G網絡時可直接使用QSFP光模塊&#xf…

好用的播放器推薦

以下是一些好用的播放器推薦&#xff0c;按照不同平臺和使用場景分類&#xff1a; 電腦端 VLC Media Player 特點&#xff1a;開源、跨平臺&#xff0c;支持幾乎所有的音視頻格式&#xff0c;無需額外安裝解碼器。具備強大的功能&#xff0c;如播放列表管理、視頻和音頻濾鏡、…

Vue基礎(8)_監視屬性、深度監視、監視的簡寫形式

監視屬性(watch)&#xff1a; 1.當被監視的屬性變化時&#xff0c;回調函數(handler)自動調用&#xff0c;進行相關操作。 2.監視的屬性必須存在&#xff0c;才能進行監視&#xff01;&#xff01; 3.監視的兩種寫法&#xff1a; (1).new Vue時傳入watch配置 (2).通過vm.$watc…

AI服務器的作用都有哪些?

根據網絡環境的飛速發展&#xff0c;人工智能技術逐漸入駐到各個行業當中&#xff0c;其中AI服務器則是一種專門用來運行人工智能算法和模型的硬件設備&#xff0c;通常具備高性能計算、大容量存儲和并行計算等多種功能&#xff0c;本文就來詳細講解一下AI服務器的作用&#xf…

[250508] Linux 內核瘦身:棄用 i486 及早期 586 CPU 支持

目錄 Linux 內核計劃精簡&#xff1a;將移除對古董級 CPU 的支持 Linux 內核計劃精簡&#xff1a;將移除對古董級 CPU 的支持 核心動態&#xff1a; Linux 內核開發社區正計劃一項重要的代碼清理工作&#xff0c;目標是移除對非常古老的 i486 及早期 586 (如早期奔騰) CPU 架構…

ROM詳解

一、ROM基礎原理 定義與特性 ROM&#xff08;Read-Only Memory&#xff0c;只讀存儲器&#xff09;是一種非易失性存儲器&#xff0c;數據在制造或編程后永久保存&#xff0c;斷電后不丟失。其核心特性為數據不可修改&#xff08;或需特殊條件修改&#xff09;。 存儲原理&…

解決虛擬機掛起之后的網絡問題

相信很多人都有遇到過自己在VM上面手滑點了個掛起然后就連不了網絡的情況吧&#xff0c;我也遇到了&#xff0c;下面是我的解決辦法&#xff0c;希望對大家有所幫助&#xff01; 我運行完如下&#xff1a; 基本上出現綠色的就說明網絡連上啦&#xff01;

在Star-CCM+中實現UDF并引用場數據和網格數據

在Star-CCM中實現UDF并引用場數據和網格數據 Star-CCM中的用戶自定義函數(UDF)允許用戶通過Java或C/C編程擴展軟件功能。下面我將詳細介紹如何實現UDF并引用模擬數據。 1. UDF基礎實現方法 1.1 創建UDF的步驟 在Star-CCM中&#xff0c;右鍵點擊"工具" → “用戶函…

ConnectionResetError(10054, ‘遠程主機強迫關閉了一個現有的連接,Python爬蟲

文章目錄 ConnectionResetError(10054, 遠程主機強迫關閉了一個現有的連接1.問題描述2.嘗試的解決方法&#xff08;均未生效&#xff09;2.1 請求重試機制2.2 模擬瀏覽器請求頭2.3 關閉連接資源2.4 延遲訪問 3.解決方案&#xff1a;使用 proxy_pool IP 代理池最后參考文章 Conn…

Redis相關命令詳解與原理(一)

目錄 Redis是什么&#xff1f; Redis 的特點和功能 Redis工作模式 與MySQL的區別 安裝編譯和啟動 redis的value類型編碼 string類型 基礎命令 應用 1.對象存儲 2.累加器 3.分布式鎖 4.位運算 list類型 基礎命令 應用 1.棧&#xff08;先進后出 FILO&#xff0…

Starrocks 的 ShortCircuit短路徑

背景 本文基于 Starrocks 3.3.5 本文主要來探索一下Starrocks在FE端怎么實現 短路徑&#xff0c;從而加速點查查詢速度。 在用戶層級需要設置 enable_short_circuit 為true 分析 數據流&#xff1a; 直接到StatementPlanner.createQueryPlan方法&#xff1a; ... OptExpres…

Oracle非歸檔模式遇到文件損壞怎么辦?

昨天夜里基地夜班的兄弟&#xff0c;打電話說有個報表庫連不上了&#xff0c;趕緊起來連上VPN查看一下&#xff0c;看到實例宕機了&#xff0c;先趕緊startup起來。 1.查看報錯信息 環境介紹&#xff1a;Redhat 6.9 Oracle 11.2.0.4 No Archive Mode 查看alert log 關鍵報…

關于一些平時操作系統或者軟件的步驟轉載

關于一些平時操作系統或者軟件的步驟轉載 關于python環境搭建 關于Ubuntu 1. 雙系統之Ubuntu快速卸載 2. VMware安裝Ubuntu虛擬機實現COpenCV代碼在虛擬機下運行教程 3. ubuntu 下 opencv的安裝以及配置&#xff08;親測有效&#xff09; 4. Ubuntu將c編譯成.so文件并測試 5…

hz2新建Keyword頁面

新建一個single-keywords.php即可&#xff0c;需要篩選項再建taxonomy-knowledge-category.php 參考&#xff1a;https://www.tkwlkj.com/customize-wordpress-category-pages.html WordPress中使用了ACF創建了自定義產品分類products&#xff0c;現在想實現自定義產品分類下的…

VRRP協議-IP地址冗余配置

有兩個服務器172.16.42.1和172.16.42.121&#xff0c;通過VRRP協議使兩臺設備共用一個虛擬地址172.16.42.100&#xff0c;當 172.16.42.1 可用時&#xff0c;它會作為主路由器使用虛擬 IP 地址&#xff1b;當它不可用時&#xff0c;172.16.42.121 會接管虛擬 IP 地址&#xff0…

21、DeepSeekMath論文筆記(GRPO)

DeepSeekMath論文筆記 0、研究背景與目標1、GRPO結構GRPO結構PPO知識點**1. PPO的網絡模型結構****2. GAE&#xff08;廣義優勢估計&#xff09;原理****1. 優勢函數的定義**2.GAE&#xff08;廣義優勢估計&#xff09; 2、關鍵技術與方法3、核心實驗結果4、結論與未來方向關鍵…

卡爾曼濾波算法(C語言)

此處感謝華南虎和互聯網的眾多大佬的無償分享。 入門常識 先簡單了解以下概念&#xff1a;疊加性&#xff0c;齊次性。 用大白話講&#xff0c;疊加性&#xff1a;多個輸入對輸出有影響。齊次性&#xff1a;輸入放大多少倍&#xff0c;輸出也跟著放大多少倍 卡爾曼濾波符合這…

SolidWork-2023 鼠標工程

地址 https://github.com/MartinxMax/SW2023-Project/tree/main/mouse 鼠標

vue 組件函數式調用實戰:以身份驗證彈窗為例

通常我們在 Vue 中使用組件&#xff0c;是像這樣在模板中寫標簽&#xff1a; <MyComponent :prop"value" event"handleEvent" />而函數式調用&#xff0c;則是讓我們像調用一個普通 JavaScript 函數一樣來使用這個組件&#xff0c;例如&#xff1a;…

Vite Proxy配置詳解:從入門到實戰應用

Vite Proxy配置詳解&#xff1a;從入門到實戰應用 一、什么是Proxy代理&#xff1f; Proxy&#xff08;代理&#xff09;是開發中常用的解決跨域問題的方案。Vite內置了基于http-proxy的代理功能&#xff0c;可以輕松配置API請求轉發。 二、基礎配置 在vite.config.js中配置…