git清除所有修改 - 取消git




如何修改現有的,未刪除的提交? (18)

修改最新的提交消息

git commit --amend

將打開您的編輯器,允許您更改最近提交的提交消息。 此外,您可以在命令行中直接設置提交消息:

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

...但是,這可能使多行提交消息或小修正更加麻煩。

確保在執行此操作之前沒有進行任何工作副本更改,否則它們也會被提交。 (未提交的更改不會被提交。)

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

如果您已經將提交推送到遠程分支,那麼您需要強制推送提交

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

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

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

使用交互式rebase

另一種選擇是使用交互式rebase。
這允許您編輯要更新的任何消息,即使它不是最新消息。

為了做一個git squash,請按照下列步驟操作:

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

一旦你壓縮你的提交 - 選擇e/r來編輯消息

關於Interactive rebase的重要說明

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

好提示:

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

🔥熱尖

您還可以編寫一個小的bash函數來修改最後一個git commit消息並將其推送到遠程。 一直幫助我。 這是功能; 將它放在你的.bashrc或類似的.zshrc文件中並重新加載你的shell。

# Amend the last commit message
# Push the changes to remote by force
# USAGE: gamend "Your New Commit Msg"
function gamend() {
    git commit --amend -m "[email protected]"
    git push --force
}

文檔

我在提交消息中寫了錯誤的東西。 或者,我忘了包含一些文件。

如何更改提交消息/文件? 提交尚未被推送。


修改

你有幾個選擇。 你可以做

git commit --amend

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

交互式rebase

否則,如果它不是你的最後一次提交,你可以做一個交互式的rebase,

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

然後在交互式rebase中,您只需向該提交添加edit。 當它出現時,執行git commit --amend並修改提交消息。 如果你想在該提交點之前回滾,你也可以使用git reflog並刪除該提交。 然後你再次做一個git commit


你也可以使用git filter-branch

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

它並不像一個簡單的git commit --amend那麼容易,但是如果你在錯誤的提交消息之後已經有一些合併,那麼它特別有用。

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


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

$ git rebase bbc643cd^ --interactive

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

$ git add <filepattern>

現在你可以使用了

$ git commit --amend

修改提交,然後修改

$ git rebase --continue

返回上一個頭部提交。


使用一行中的新提交消息更新上次錯誤的提交消息:

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

或者,嘗試git reset,如下所示:

# 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.

使用reset將提交拆分為較小的提交

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 seperately 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"

在這裡,您已成功將最後一次提交分成兩次提交。


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

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

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

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

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


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

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

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

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

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

如果您只想更改上一條消息,則應使用--only標誌或其快捷方式-o with commit --amend

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

這可以確保您不會意外地使用分段內容增強您的提交。 當然最好有一個合適的$EDITOR配置。 然後你可以退出-m選項,git會用舊的預先填充提交消息。 通過這種方式,它可以輕鬆編輯。


如果您只想編輯最新的提交用法:

git commit --amend

要么

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

但是如果你想連續編輯幾個提交,你應該使用rebasing代替:

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

在上面的文件中寫入編輯/ e或其他選項之一併點擊保存並退出。

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

git commit --amend

保存並退出並鍵入

git rebase --continue 

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

請注意,這些內容會在特定提交後更改所有SHA哈希值。


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

  1. git rebase --interactive $parent_of_flawed_commit

    如果要修復多個有缺陷的提交,請傳遞最舊的提交的父級。

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

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

  3. 對於你想要改寫的每個提交,Git會讓你回到編輯器中。 對於您要編輯的每個提交,Git會將您放入shell中。 如果你在shell中:

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

大多數此序列將通過各種命令的輸出向您解釋。 這很容易,你不需要記住它 - 只要記住git rebase --interactive讓你無論多久以前都能正確提交。

請注意,您不希望更改已推送的提交。 或者也許你這樣做,但在這種情況下,你必須非常謹慎地與每個可能已經完成提交並完成工作的人溝通。 在有人推送rebase或重置到已發布的分支後,如何恢復/重新同步?


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

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向下移動3行
  • i進入插入模式 - 您鍵入的文本將出現在文件中
  • EscCtrl c退出插入模式並返回“正常”模式
  • u要撤消
  • Ctrl r重做
  • dddwdl分別刪除一行,一行或一個字母
  • cccwcl分別改變一行,一個字或一個字母(與dd i相同)
  • yyywyl分別複製(“yank”)一行,一個字或一個字母
  • pP分別在當前位置之後或之前粘貼
  • :w 輸入以保存(寫入)文件
  • :q! 輸入退出而不保存
  • :wq EnterZZ保存並退出

如果你經常編輯文本,那麼切換到Dvorak鍵盤佈局,學習觸摸式,並學習vim。 值得努力嗎? 是。


ProTip™:不要害怕嘗試重寫歷史記錄的“危險”命令* - Git默認情況下不會刪除你的提交90天; 你可以在reflog中找到它們:

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

* 注意像--hard--force這樣的選項 - 他們可以丟棄數據。
* 此外,不要在您正在協作的任何分支上重寫歷史記錄。


我喜歡使用以下內容:

  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>

我更喜歡這種方式。

git commit --amend -c <commit ID>

否則,將有一個帶有新提交ID的新提交


要修改先前的提交,請進行所需的更改並暫存這些更改,然後運行

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打開的編輯器中“進行所需的更改”


你可以使用git-rebase-reword

它旨在編輯任何提交(不僅僅是最後一次) commit --amend

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

它以rebase交互操作命名,用於修改提交:“reword”。看到這篇文章man -section交互模式 -

例子:

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

我意識到我已經推了一個錯誤的提交。為了撤消,我做了以下事情:

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

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


我添加了別名recirecm為此recommit (amend),現在我可以使用git recmgit recm -m

$ vim ~/.gitconfig

[alias]

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




amend