如何修改現有的未推送的提交消息?

How to modify existing, unpushed commit messages?
投票:7670回答:27

我在提交消息中寫錯了內容。

如何更改信息? 提交尚未被推送。

tags:git,git-commit,git-rewrite-history,amend
27回答
352
投票

您也可以為此使用git filter-branch

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

它不像普通的git commit --amend那樣容易,但是如果您在錯誤的提交消息之後已經進行了一些合併,則它特別有用。

請注意,這將嘗試重寫HEAD和有缺陷的提交之間的每個提交,因此您應該非常明智地選擇msg-filter命令;-)


276
投票
  1. 如果您只想修改最後的提交消息,請執行以下操作:

     git commit --amend 

這將使您進入文本編輯器,並更改最後的提交消息。

  1. 如果你想改變過去三年提交信息,或任何提交信息到這一點,供應HEAD~3git rebase -i命令:

     git rebase -i HEAD~3 

311
投票

如果使用的是Git GUI工具,則有一個名為Amend last commit的按鈕。 單擊該按鈕,然後它將顯示您的最後提交文件和消息。 只需編輯該消息,就可以使用新的提交消息來提交它。

或從控制台/終端使用此命令:

git commit -a --amend -m "My new commit message"

259
投票

如果您必須在多個分支上更改舊的提交消息(即,在多個分支中存在帶有錯誤消息的提交),則可能要使用:

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

Git將創建一個用於重寫的臨時目錄,並另外將舊引用備份到refs/original/

  • -f將強制執行該操作。 如果臨時目錄已經存在或在refs/original下已經存儲了引用,則這是必需的。 如果不是這種情況,則可以刪除此標誌。

  • --將篩選器分支選項與修訂選項分開。

  • --all將確保所有分支標籤都被重寫。

由於備份了舊的引用,因此您可以輕鬆地返回到執行命令之前的狀態。

假設您要恢復您的母版並在分支old_master訪問它:

git checkout -b old_master refs/original/refs/heads/master

183
投票

如果您使用的是Git GUI,則可以修改尚未推送的最後一次提交:

Commit/Amend Last Commit

313
投票

我更喜歡這樣:

git commit --amend -c <commit ID>

否則,將使用新的提交ID進行新的提交。


195
投票

修改

您在這裡有幾個選擇。 你可以做

git commit --amend

只要這是您的最後一次提交。

互動基礎

否則,如果這不是您的最後一次提交,則可以進行交互式變基,

git rebase -i [branched_from] [hash before commit]

然後,在交互式基礎庫中,您只需向該提交添加編輯。 當它出現時,執行git commit --amend並修改提交消息。 如果要在該提交點之前回滾,還可以使用git reflog並刪除該提交。 然後,您只需再次執行git commit


282
投票

您可以使用Git rebasing 例如,如果要修改回以提交bbc643cd,請運行

$ git rebase bbc643cd^ --interactive

在默認編輯器中,在要修改其提交的行中將“ pick”修改為“ edit”。 進行更改,然後使用

$ git add <filepattern>

現在您可以使用

$ git commit --amend

修改提交,然後

$ git rebase --continue

返回上一個頭部提交。


224
投票

採用

git commit --amend

要詳細了解它,一個出色的文章是4. Rewrite Git History 它還討論了何時不使用 git commit --amend


15589
投票

修改最新的提交消息

git commit --amend

將打開您的編輯器,使您可以更改最近一次提交的提交消息。 另外,您可以直接在命令行中使用以下命令設置提交消息:

git commit --amend -m "New commit message"

…但是,這會使輸入多行提交消息或進行小的更正變得更加麻煩。

確保你沒有任何工作副本的修改在此之前上演否則它們可能會犯了。 (未暫存的更改將不會提交。)

更改已經推送到遠程分支的提交消息

如果已經將提交推送到遠程分支,則需要使用以下命令強制推送提交

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

警告:強行推將用您本地的狀態覆蓋遠程分支 如果遠程分支上有您本地分支中沒有的提交,您丟失這些提交。

警告:對於修改您已經與其他人共享的提交要謹慎。 修改提交實質上會將它們重寫為具有不同的SHA ID,如果其他人擁有您已重寫的舊提交的副本,則會帶來問題。 擁有舊提交副本的任何人都需要將其工作與新重寫的提交同步,這有時可能很困難,因此在嘗試重寫共享提交歷史記錄時請確保與他人協調,或者只是避免重寫共享提交共。


使用交互式基礎

另一種選擇是使用交互式變基。 這樣,即使不是最新消息,您也可以編輯要更新的任何消息。

為了做一個壁球南瓜,請按照下列步驟操作:

// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

壓縮提交後,請選擇e/r來編輯消息:

在此處輸入圖片說明

有關交互式變基的重要說明

當您使用git rebase -i HEAD~X提交的次數可能超過X Git將“收集”最近X提交中的所有提交,並且如果在該範圍之間某處存在合併,您還將看到所有提交,因此結果將為X +。

好提示:

如果您需要為多個分支執行此操作,並且在修改內容時可能會遇到衝突,請設置git rerere並讓Git為您自動解決這些衝突。


文獻資料


2353
投票

如果您要修復的提交不是最新的提交:

  1. git rebase --interactive $parent_of_flawed_commit

    如果您要修復多個有缺陷的提交,請傳遞其中最早的一個的父提交。

  2. 將出現一個編輯器,並列出您提交以來的所有提交。

    1. 在您要修復的任何提交之前,將pick更改為reword (或在舊版本的Git上進行edit )。
    2. 保存後,Git將重播列出的提交。

  3. 對於您要重新編寫單詞的每次提交,Git都會將您帶回到編輯器中。 對於您要編輯的每個提交,Git會將您放入外殼。 如果您在外殼中:

    1. 以您喜歡的任何方式更改提交。
    2. git commit --amend
    3. git rebase --continue

您將通過執行各種命令的輸出向您解釋此序列的大部分內容。 這很容易; 您不需要記住它-只需記住git rebase --interactive糾正提交,無論提交多久了。


注意,您將不想更改已經推送的提交。 也許您這樣做了,但在那種情況下,您將必須格外小心,與可能撤消了您的承諾並在其上完成工作的所有人進行溝通。 在有人將基准或重置推送到已發布的分支後,如何恢復/重新同步?


165
投票

我盡可能地使用Git GUI ,這使您可以選擇修改最後一次提交:

Tick that box

另外, git rebase -i origin/master是一個不錯的口頭禪,它將始終向您展示您在master之上所做的提交,並為您提供修改,刪除,重新排序或壓縮的選項。 無需先掌握該哈希值。


135
投票

哇,所以有很多方法可以做到這一點。

執行此操作的另一種方法是刪除最後的提交,但保留其更改,以免丟失工作。 然後,您可以使用更正後的消息再次提交。 看起來像這樣:

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

如果忘記添加文件或進行更改,我總是這樣做。

請記住指定--soft而不是--hard ,否則將完全丟失該提交。


76
投票

我已經添加了別名recirecmrecommit (amend) recm recommit (amend)它。 現在我可以用git recmgit recm -m做到這git recm -m

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......

124
投票

如果只想編輯最新的提交,請使用:

git commit --amend

要么

git commit --amend -m 'one line message'

但是,如果您要連續編輯多個提交,則應改用rebasing:

git rebase -i <hash of one commit before the wrong commit>

git rebase編輯

與上面的文件一樣,在文件中編寫edit/e或其他選項之一,然後單擊保存並退出。

現在,您將處於第一個錯誤的提交。 在文件中進行更改,它們將自動為您上演。 類型

git commit --amend

保存並退出並輸入

git rebase --continue

移至下一個選擇,直到完成所有選擇。

請注意,在特定的提交之後,這些操作會更改您的所有SHA哈希。


99
投票

在一行中用新的提交消息更新您的最後一個錯誤的提交消息:

git commit --amend -m "your new commit message"

或者,嘗試按以下方式重置Git:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# It will reset you last commit. Now, you
# can re-commit it with new commit message.

使用重置將提交拆分為較小的提交

git reset也可以幫助您將一個提交分解為多個提交:

# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

在這裡,您已成功將上一個提交分為兩個提交。


2474
投票
git commit --amend -m "your new message"

123
投票

如果只想更改最後一條消息,則應使用--only標誌或其快捷方式-ocommit --amend

git commit --amend -o -m "New commit message"

這樣可以確保您不會意外地使用分階段的東西來增強您的承諾。 當然,最好具有適當的$EDITOR配置。 然後,您可以不使用-m選項,Git將用舊的預填充提交消息。 這樣,可以輕鬆地對其進行編輯。


54
投票

我意識到我已經推了一個錯字的提交。 為了撤消操作,我執行了以下操作:

git commit --amend -m "T-1000, advanced prototype"
git push --force

警告:強行推動您的更改將用您的本地分支覆蓋遠程分支。 確保您不會覆蓋要保留的任何內容。 如果其他人與您共享分支,則在強制推送經過修改(重寫)的提交時也要保持謹慎,因為如果他們擁有剛重寫的提交的舊副本,則他們需要重寫自己的歷史記錄。


82
投票

關於這個問題,有很多答案,但是都沒有一個非常詳細地說明如何使用Vim更改舊的提交消息。 我一直試圖自己做這件事,所以在這裡我將詳細記述我是如何做到的,尤其是對於那些沒有Vim經驗的人!

我想更改我已經推送到服務器的五個最新提交。 這是非常“危險的”,因為如果其他人已經從中退出,則可以通過更改提交消息來弄亂事情。 但是,當您在自己的小分支上工作並且確定沒有人拉它時,可以按以下方式更改它:

假設您要更改最近的五個提交,然後在終端中鍵入以下內容:

git rebase -i HEAD~5

* 5是要更改的提交消息數(因此,如果要將第10次更改為最後一次提交,請輸入10)。

該命令將帶您進入Vim,在這裡您可以“編輯”您的提交歷史記錄。 您將在頂部看到最後五個提交,如下所示:

pick <commit hash> commit message

除了pick您還需要編寫reword 您可以在Vim中輸入i來完成此操作。 這使您進入插入模式。 (您會看到在底部的INSERT字樣處於插入模式。)對於要更改的提交,請輸入reword而不是pick

然後,您需要保存並退出此屏幕。 您可以先按Esc按鈕進入“命令模式”(如果底部的“ 插入 ”一詞消失了,則可以檢查您是否處於命令模式)。 然後您可以通過輸入:輸入命令。 保存和退出的命令是wq 因此,如果您輸入:wq那麼您的位置正確。

然後,Vim將遍歷您要重新編寫單詞的所有提交消息,在這裡您實際上可以更改提交消息。 通過進入插入模式,更改提交消息,進入命令模式以及保存並退出來完成此操作。 這樣做五次,您就離開了Vim!

然後,如果您已經推送了錯誤的提交,則需要git push --force覆蓋它們。 請記住,執行git push --force是一件非常危險的事情,因此請確保自您推送錯誤的提交以來,沒有人從服務器中拉出!

現在,您已經更改了提交消息!

(如您所見,我對Vim經驗不足,所以如果我使用錯誤的“行話”來解釋正在發生的事情,請隨時糾正我!)


49
投票

我喜歡使用以下內容:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>

129
投票

對於正在尋找Windows / Mac GUI來幫助編輯較舊消息(即不僅僅是最新消息)的任何人,我建議您使用Sourcetree 遵循的步驟如下。

Sourcetree交互式基礎

對於尚未推送到遠程的提交:

  1. 確保已提交或保存了所有當前更改(即,因此在“文件狀態”選項卡中沒有列出文件)-否則它將無法工作。
  2. 在“日誌/歷史記錄”選項卡中,右鍵單擊圖形您要編輯的提交下方的一條相鄰行的條目,然後選擇“以交互方式重新設置<commit ref>的子級 ...”
  3. 選擇要更改的提交消息的整行( 即,單擊“消息”列 )。
  4. 單擊“編輯消息”按鈕。
  5. 在出現的對話框中根據需要編輯消息,然後單擊“ 確定”
  6. 如果還有其他提交消息要更改,請重複步驟3-4。
  7. 單擊“ 確定” :重新啟動。 如果一切順利,輸出將結束“成功完成”。 注意: 我最近看到它失敗, Unable to create 'project_path/.git/index.lock': File exists. 嘗試同時修改多個提交消息時。 不確定確切的問題是什麼,還是不確定在Sourcetree的將來版本中是否可以解決,但是如果發生這種情況,建議一次將其重新設置為基礎(速度較慢,但似乎更可靠)。

...或者...對於已經推送的提交:

遵循此答案中與上述類似的步驟,但是需要從命令行運行另一個命令( git push origin <branch> -f )以強制推送分支。 我建議您閱讀所有內容並採取必要的注意!


43
投票

如果您尚未將代碼推送到遠程分支( GitHub / Bitbucket ),則可以在命令行上更改提交消息,如下所示。

 git commit --amend -m "Your new message"

如果您在特定分支上工作,請執行以下操作:

git commit --amend -m "BRANCH-NAME: new message"

如果您已經用錯誤的消息推送了代碼,則在更改消息時需要小心。 也就是說,在更改提交消息並嘗試再次推送它之後,最終會遇到問題。 要使其平滑,請按照下列步驟操作。

請先閱讀我的完整答案,然後再做。

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

重要說明:直接使用強制推送時,可能會遇到其他開發人員在同一分支上工作的代碼問題。 因此,為了避免這些衝突,您需要在執行強制推送之前從分支中提取代碼:

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

這是更改提交消息(如果已被推送)的最佳實踐。


177
投票

如果這是您的最後一次提交,則只需修改提交:

git commit --amend -o -m "New commit message"

(使用-o (-- --only )標誌以確保僅更改提交消息)


如果是掩埋的提交,請使用超讚的交互式rebase

git rebase -i @~9   # Show the last 9 commits in a text editor

找到所需的提交,將pick更改為rreword ),然後保存並關閉文件。 做完了!



微型Vim教程(或者,如何僅用8次擊鍵3j cw r Esc ZZ ):

  • 如果有時間,請運行vimtutor
  • h j k l對應於移動鍵
  • 所有命令都可以以“範圍”作為前綴,例如3j下移三行
  • i進入插入模式-您鍵入的文本將出現在文件中
  • EscCtrl c退出插入模式並返回“普通”模式
  • u撤消
  • Ctrl r重做
  • dddwdl分別刪除行,詞或字母
  • cccwcl分別更改行,詞或字母(與dd i相同)
  • yyywyl分別複製(“拉”)行,詞或字母
  • pP分別粘貼在當前位置之後或之前
  • :w 輸入以保存(寫入)文件
  • :q! 輸入即可退出而不保存
  • :wq 輸入ZZ保存並退出

如果您經常編輯文本,請切換到Dvorak鍵盤佈局 ,學習觸摸式輸入法,並學習Vim。 值得付出努力嗎? 是。



ProTip™:不要害怕嘗試重寫歷史記錄的“危險”命令* — Git默認不會刪除您的提交90天; 您可以在參考日誌中找到它們:

$ git reset @~3   # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

*但是要小心--hard--force類的選項,它們會丟棄數據。 * 另外,請勿在您正在協作的任何分支上重寫歷史記錄。


77
投票

您可以使用git-rebase-reword

它旨在以與commit --amend相同的方式編輯任何提交(不僅僅是最後一次)

$ git rebase-reword <commit-or-refname>

它是基於對rebase交互式操作進行修改以修改提交的名稱:“ reword”。 請參閱此帖子人-部分交互模式-

例子:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

392
投票

如前所述, git commit --amend是覆蓋最後一次提交的方法。 注意事項:如果您還想覆蓋文件 ,則命令為

git commit -a --amend -m "My new commit message"

766
投票

要修改上一次提交,請進行所需的更改並進行這些更改,然後運行

git commit --amend

這將在文本編輯器中打開一個文件,代表您的新提交消息。 它開始時填充了舊提交消息中的文本。 根據需要更改提交消息,然後保存文件並退出編輯器以完成操作。

要修改上一次提交並保持相同的日誌消息,請運行

git commit --amend -C HEAD

要通過完全刪除之前的提交來修復它,請運行

git reset --hard HEAD^

如果要編輯多個提交消息,請運行

git rebase -i HEAD~commit_count

(用要編輯的提交數替換commit_count 。)此命令啟動編輯器。 將第一個提交(您要更改的提交)標記為“編輯”而不是“選擇”,然後保存並退出編輯器。 進行您要提交的更改,然後運行

git commit --amend
git rebase --continue

注意:您也可以從git commit --amend打開的編輯器中“進行所需的更改”


©2020 sofbug.com - All rights reserved.