如何修改现有的,未付的提交?

我在提交消息中写了错误的东西。 另外,我忘了包含一些文件。

我如何更改提交消息/文件? 提交还没有被推送。

修改最近的提交消息

git commit --amend 

将打开您的编辑器,允许您更改最近提交的提交消息。 另外,你可以直接在命令行中设置提交信息:

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

…但是,这可以使多行提交消息或小的更正更麻烦的input。

确保在执行此操作之前没有任何工作副本更改,否则他们也会执行任务。 ( Unstaged更改不会被提交。)

更改已经推送到远程分支的提交消息

如果您已经将您的提交推送到您的远程分支,那么您需要强制推送提交 :

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

警告:强制推送将使用本地状态覆盖远程分支 。 如果远程分支上有你在本地分支中没有的提交,那么你失去这些提交。

警告:谨慎地修改您已经与其他人分享的提交。 修改提交实质上是将其重写为具有不同的SHA ID,如果其他人拥有您已经重写的旧提交的副本,则会造成问题。 任何拥有旧提交副本的人都需要将他们的工作与最近重写的提交进行同步,这有时会很困难,所以在尝试重写共享提交历史logging时要确保与其他人协调,或者避免重写共享提交共。


使用交互式底座

另一个select是使用交互式底座。
这使您可以编辑任何要更新的邮件,即使它不是最新的邮件。

为了做一个混帐南瓜,请按照下列步骤:

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

一旦你挤压你的提交 – selecte/r编辑消息

在这里输入图像描述

有关交互式重新分配的重要提示

当你使用git rebase -i HEAD~X ,可能会有超过X提交。 Git会“收集”最后一次X提交中的所有提交,如果在这个范围之间的某个地方有合并,你将会看到所有的提交,所以结果将是X +。

好的提示:

如果你必须做的不止一个分支,当修改内容设置git rerere时你可能会面临冲突,并让git自动为你解决这些冲突。


文档

  • git-commit(1)手册页

  • git-rebase(1)手册页

  • git-push(1)手册页

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

如果您要解决的提交不是最新的:

  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可以让你纠正提交,不pipe他们多久以前。


请注意,您不想更改已经推送的提交。 或者,也许你会这样做,但是在这种情况下,你必须非常小心地与每个可能已经完成提交并完成工作的人沟通。 如果有人推迟重置或重置到发布的分支后,如何恢复/重新同步?

要修改以前的提交,请进行所需的更改并进行更改,然后运行

 git commit --amend 

这将在您的文本编辑器中打开一个代表您的新提交消息的文件。 它开始填充旧的提交消息中的文本。 根据需要更改提交消息,然后保存该文件并退出编辑器完成。

要修改以前的提交并保持相同的日志消息,请运行

 git commit --amend -C HEAD 

要通过完全删除它来修复以前的提交,请运行

 git reset --hard HEAD^ 

如果您想编辑多个提交消息,请运行

 git rebase -i HEAD~ commit_count 

(将commit_countreplace为您要编辑的提交数量。)此命令将启动您的编辑器。 将第一个提交(您想要更改的那个)标记为“编辑”而不是“pick”,然后保存并退出编辑器。 进行要提交的更改,然后运行

 git commit --amend git rebase --continue 

注意:您也可以从git commit --amend打开的编辑器中“进行所需更改”

如前所述, git commit --amend是覆盖上次提交的方式。 一个注意:如果你想也覆盖文件 ,命令将是

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

你也可以使用git filter-branch

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

这并不像一个简单的git commit --amend那么简单,但是如果你在错误的提交消息之后已经有了一些合并的话,那就特别有用了。

请注意,这将尝试重写HEAD和有缺陷的提交之间的每个提交,所以你应该select你的msg-filter命令非常明智;-)

我更喜欢这种方式。

 git commit --amend -c <commit ID> 

否则,将会有一个新的提交和一个新的提交ID

如果您使用的是Git GUI工具,则会有一个名为“修改上次提交”的button。 点击那个button,然后它会显示你最近的提交文件和消息。 只需编辑该消息,您可以使用新的提交消息进行提交。

或从控制台/terminal使用此命令:

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

你可以使用Git rebasing 。 例如,如果你想修改回提交bbc643cd,运行

 $ git rebase bbc643cd^ --interactive 

在默认编辑器中,在要修改其提交的行中修改“select”到“编辑”。 做你的改变,然后把它们放在一起

 $ git add <filepattern> 

现在你可以使用

 $ git commit --amend 

修改提交,之后

 $ git rebase --continue 

返回到前面的头提交。

  1. 如果你只想修改你最近的提交信息,那么做:

     git commit --amend 

    这将把你放入你的文本exitor,让你改变最后的提交信息。

  2. 如果你想改变最后3个提交消息或者任何提交消息,那么把git rebase -i提供给git rebase -i命令:

     git rebase -i HEAD~3 

如果您必须在多个分支上更改旧的提交消息(即错误消息的提交出现在多个分支中),则可能需要使用:

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

Git将创build一个用于重写的临时目录,并在refs/original/额外备份旧引用。

  • -f将强制执行操作。 如果临时目录已经存在,或者已经有参考文件存储在refs/original下,这是必须的。 如果不是这样的话,你可以放弃这个标志。

  • --从修订选项中分离filter分支选项。

  • --all所有的分支标签都会被重写。

由于您的旧引用的备份,您可以轻松地返回到执行命令之前的状态。

说,你想恢复你的主人,并在分行old_master访问它:

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

使用

 git commit --amend 

要详细了解它,一篇优秀的文章是4.重写Git历史 。 它也谈到何时不使用 git commit --amend

修改

这里有几个选项。 你可以做

 git commit --amend 

只要这是你最后一次提交。

交互式重新分配

否则,如果它不是你最后一次提交,你可以做一个交互式重新分配,

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

然后在交互式底座里面,您只需将编辑添加到该提交。 当它出现时做一个git commit --amend修改并修改提交消息。 如果你想在这个提交点之前回滚,你也可以使用git reflog并删除那个提交。 然后你只是再次做一个git commit

如果你正在使用Git GUI,你可以修改最后一个没有被推送的提交:

 Commit/Amend Last Commit 

我尽可能多地使用Git GUI ,并且可以select修改上次提交:

Tick that box

另外, git rebase -i origin/master是一个不错的口头禅,它会一直向你提供你在master上完成的提交,并给你修改,删除,重新sorting或挤压的选项。 没有必要首先得到这个散列。

如果这是您最后一次提交,请修改提交:

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

(使用-o (– --only )标志确保只更改提交消息)

如果这是一个埋葬的提交,使用真棒互动rebase

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

find你想要的提交,将pick更改为rreword ),并保存并closures文件。 完成!


微型vim教程(或者,如何只用8个按键3j cw r Esc ZZ ):

  • 如果你有时间运行vimtutor
  • h j k l对应于移动键
  • 所有命令都可以用“范围”作为前缀,例如3j向下移动3行
  • i进入插入模式 – 你input的文字会出现在文件中
  • EscCtrl c退出插入模式并返回“正常”模式
  • u撤消
  • 按住 r重做
  • dddwdl分别删除一行,一个字或一个字母
  • cccwcl分别改变行,字或字母(与dd i相同)
  • yyywyl分别拷贝(“yank”)一行,一个字或一个字母
  • pP分别粘贴在当前位置之后或当前位置之前
  • :w input以保存(写入)文件
  • :q! input退出而不保存
  • :wq inputZZ保存并退出

如果你编辑文本很多,然后切换到Dvorak键盘布局,学习触摸式,并学习VIM。 这是值得的努力? 是。


ProTip™:不要害怕尝试重写历史logging的“危险”命令* – 默认情况下,Git不会删除90天的提交; 你可以在reflog中find它们:

 $ git reset @~3 # go back 3 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这样的选项 – 他们可以丢弃数据。
另外,不要在你正在合作的分支上重写历史logging。

哇,所以有很多方法可以做到这一点。

另一种方法是删除最后一次提交,但保留更改,以免丢失工作。 然后您可以使用更正的消息进行另一次提交。 这看起来像这样:

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

我总是这样做,如果我忘记添加一个文件或做一个改变。

请记住指定--soft而不是--hard ,否则完全失去该提交。

如果你只是想编辑最新的提交使用:

 git commit --amend 

要么

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

但是如果你想连续编辑几个提交,你应该使用rebasing来代替:

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

git rebase编辑

在一个像上面的文件编辑/电子或其他选项之一,并保存并退出。

现在你将会遇到第一个错误的提交。 在文件中进行更改,并且会自动为您进行演示。 types

 git commit --amend 

保存并退出并键入

 git rebase --continue 

移到下一个select,直到完成所有select。

请注意,这些事情在特定的提交之后会改变你的所有SHA哈希值。

如果你只想改变你的最后一条消息,你应该使用--only标志或其快捷方式-o commit --amend

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

这可以确保你不会意外地增强你的提交的东西。 当然,最好有一个适当的$EDITORconfiguration。 然后你可以把-m选项取出来,git会预先填写提交信息。 这样可以很容易地编辑。

对于任何正在寻找Windows / Mac GUI的人来说,编辑不仅仅是最新的消息(对于未完成的提交 ),我会推荐SourceTree 。

更新:我自从发现了下面的过程进一步详细描述,更好的截图和额外的步骤,当提交被推入这个答案 。

SourceTree交互式重新分配

程序:

  1. 确保你已经提交或隐藏了所有的当前更改(即没有“文件状态”选项卡中列出的文件 – 否则将无法正常工作)。
  2. 在“日志/历史logging”选项卡中,右键单击要编辑的提交下方graphics中相邻行的条目,然后select“交互地重新实现<提交参考>的子项 …”
  3. select您想要更改的提交消息的整行( 即单击“消息”列 )。
  4. 点击“编辑信息”button。
  5. 在出现的对话框中根据需要编辑消息,然后单击确定。
  6. 如果还有其他消息要更改,请重复步骤3-4。
  7. 点击确定 – 重新启动 – 如果一切正常,输出将结束“成功完成”。

在一行中用新的提交信息更新最后一次错误的提交信息:

 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 seperately to make multiple commits: eg git add app/ git commit -m "add all files in app directory" git add config/ git commit -m "add all files in config directory" 

在这里,你已经成功地把你的最后一个提交分成两个提交。

在这个问题上有很多答案,但是他们都没有详细解释如何使用VIM更改旧的提交消息。 我被困在试图自己做这个,所以在这里我会详细地写下我是如何做到的,特别是对于没有VIM经验的人们!

我想改变我已经推送到服务器的五个最新的提交。 这是相当“危险的”,因为如果有其他人已经从这个拉你可以通过改变提交信息搞砸了。 但是,当你在你自己的小分支上工作,并确定没有人拉它时,你可以像这样改变它:

比方说,你想改变你的五个最新的提交,然后你在terminal中input:

git rebase -i HEAD~5 *其中5是您要更改的提交消息的数量。 (所以如果你想改变第十个到最后一个提交你input10)

这个命令会让你进入VIM,你可以编辑你的提交历史logging。 你会看到你最后的5个提交,如下所示:

pick <commit hash> commit message

而不是pick你需要写reword 。 您可以在VIM中inputi来完成此操作,这样可以进入INSERT模式。 (你可以看到你的插入模式是底部的INSERT字样)对于你想要改变types的提交而不是pick

然后你需要保存并退出这个屏幕,通过按escbutton进入“命令模式”。 (如果底部的INSERT字样已经消失,则可以检查您是否处于命令模式)然后,您可以input以下命令来键入命令: ,保存并退出的命令是wq 。 所以,如果你input:wq你是正确的轨道上。

那么VIM将会检查你想要改写的每个提交信息,在这里你可以改变提交信息。 您将通过进入INSERT模式,更改提交消息,进入命令模式并保存并退出。 做5次,你离开VIM!

然后,如果你已经推错提交,你需要git push --force来覆盖它们。 请记住, git push --force是一个相当危险的事情,所以确保没有人从服务器上拉出来,因为你推错提交!

现在你已经改变了你的提交消息!

(正如你所看到的,我不是那种在VIM中经历过的,所以如果我用错误的“行话”来解释发生了什么,请随时纠正我!)

我已经添加了reci的别名, recm recommit (amend)它,现在我可以用git recmgit recm -m

 $ vim ~/.gitconfig [alias] ...... cm = commit reci = commit --amend recm = commit --amend ...... 

你可以使用git-rebase-reword

它被devise来编辑任何提交(不只是最后一个)相同的方式commit --amend

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

它以rebase交互作用来修改commit:“reword”。 看到这个post和man- section互动模式 –

例子:

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

我意识到,我已经推倒了一个错字。 为了撤消,我做了以下工作:

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

警告:强制推送您的更改将覆盖您的本地远程分支。 确保你不会覆盖任何你想保留的东西。 如果其他人与你分享分支,那么也要小心推动一个修改(重写)的提交,因为如果他们有你刚刚改写的提交的旧副本,他们将需要重写自己的历史logging。

I like to use the following:

  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>

If you have not pushed the code to your remote branch ( GitHub / Bitbucket ) you can change the commit message on the command line as below.

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

If you're working on a specific branch do this:

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

If you've already pushed the code with the wrong message, and you need to be careful when changing the message. That is, after you change the commit message and try pushing it again, you end up with having issues. To make it smooth, follow these steps.

Please read my entire answer before doing it.

 git commit --amend -m "BRANCH-NAME : your new message" git push -f origin BRANCH-NAME # Not a best practice. Read below why? 

Important note: When you use the force push directly you might end up with code issues that other developers are working on the same branch. So to avoid those conflicts, you need to pull the code from your branch before making the force push :

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

This is the best practice when changing the commit message, if it was already pushed.