我在提交消息中写了错误的东西.或者,我忘了包含一些文件.
如何更改提交消息/文件?提交尚未被推送.
git commit --amend
将打开您的编辑器,允许您更改最近提交的提交消息.此外,您可以在命令行中直接设置提交消息:
git commit --amend -m "New commit message"
...但是,这可能使多行提交消息或小修正更加麻烦.
确保你没有任何工作副本的修改上演这样做,否则它们可能会犯太多了.(未分级变化将不会提交.)
如果您已经将提交推送到远程分支,那么您需要强制推送提交:
git push --force
# Or
git push -f
警告:强制推送将使用本地状态覆盖远程分支.如果远程分支上有您在本地分支中没有的提交,则会丢失这些提交.
警告:谨慎修改已与其他人共享的提交.修改提交本质上会将它们重写为具有不同的SHA ID,如果其他人拥有您已重写的旧提交的副本,则会出现问题.拥有旧提交副本的任何人都需要将他们的工作与新重写的提交同步,这有时会很困难,因此请确保在尝试重写共享提交历史记录时与其他人协调,或者只是避免重写共享提交共.
另一种选择是使用交互式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
编辑消息
当您使用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"
如果要修复的提交不是最新的提交:
git rebase --interactive $parent_of_flawed_commit
如果要修复多个有缺陷的提交,请传递最旧的提交的父级.
将出现一个编辑器,其中列出了自您提交的所有提交以来的所有提交.
在要修复的任何提交之前更改pick
为reword
(或旧版本的Git edit
).
保存后,Git将重播列出的提交.
对于你想要改写的每个提交,Git会让你回到编辑器中.对于您要编辑的每个提交,Git会将您放入shell中.如果你在shell中:
以您喜欢的任何方式更改提交.
git commit --amend
git rebase --continue
大多数此序列将通过各种命令的输出向您解释.这很容易,你不需要记住它 - 只要记住,git rebase --interactive
无论多久以前它都能让你正确提交.
请注意,您不希望更改已推送的提交.或者也许你这样做,但在这种情况下,你必须非常谨慎地与每个可能已经完成提交并完成工作的人进行沟通.在有人推送rebase或重置到已发布的分支后,如何恢复/重新同步?
要修改先前的提交,请进行所需的更改并暂存这些更改,然后运行
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 commit --amend
是覆盖最后一次提交的方法.一个注意事项:如果您还想覆盖文件,那么命令就是
git commit -a --amend -m "My new commit message"
你也可以使用git git filter-branch
.
git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
它并不像琐碎那么容易git commit --amend
,但如果你在错误的提交消息之后已经有一些合并,它就特别有用.
请注意,这将尝试重写每次提交HEAD
和有缺陷的提交,所以你应该msg-filter
非常明智地选择你的命令;-)
我更喜欢这种方式.
git commit --amend -c
否则,将有一个带有新提交ID的新提交
如果您使用的是Git GUI工具,则会有一个名为modify last commit的按钮.单击该按钮,然后它将显示您上次提交的文件和消息.只需编辑该消息,您就可以使用新的提交消息进行提交.
或者从控制台/终端使用此命令:
git commit -a --amend -m "My new commit message"
你可以使用Git rebasing.例如,如果要修改回提交bbc643cd,请运行
$ git rebase bbc643cd^ --interactive
在默认编辑器中,将"pick"修改为要修改其提交的行中的"edit".进行更改,然后进行演示
$ git add
现在你可以使用了
$ git commit --amend
修改提交,然后修改
$ git rebase --continue
返回上一个头部提交.
如果您只想修改上次提交消息,请执行以下操作:
git commit --amend
这将使您进入文本存储器并让您更改最后一次提交消息.
如果要更改最后3个提交消息或任何提交消息,请提供HEAD~3
给该git rebase -i
命令:
git rebase -i HEAD~3
如果您必须在多个分支上更改旧的提交消息(即,多个分支中存在错误消息的提交),您可能希望使用:
git filter-branch -f --msg-filter \
'sed "s///g"' -- --all
Git将创建一个临时目录,用于重写和另外备份旧引用refs/original/
.
-f
将强制执行该操作.如果临时目录已经存在或者存在已存在的引用,则这是必需的refs/original
.如果不是这种情况,您可以删除此标志.
--
将过滤器分支选项与修订选项分开.
--all
将确保所有分支和标签都被重写.
由于旧引用的备份,您可以在执行命令之前轻松返回状态.
说,您想要恢复您的主人并在分支中访问它old_master
:
git checkout -b old_master refs/original/refs/heads/master
使用
git commit --amend
要详细了解它,一篇优秀的文章是4.重写Git历史.它还谈到何时不使用 git commit --amend
.
你有几个选择.你可以做
git commit --amend
只要这是你的最后一次提交.
否则,如果它不是你的最后一次提交,你可以做一个交互式的rebase,
git rebase -i [branched_from] [hash before commit]
然后在交互式rebase中,您只需向该提交添加edit.当它出现时,执行a git commit --amend
并修改提交消息.如果要在该提交点之前回滚,您也可以使用git reflog
并删除该提交.然后你再做git commit
一次.
如果您使用的是Git GUI,则可以修改最后一次未被推送的提交:
Commit/Amend Last Commit
如果这是你的最后一次提交,只需修改提交:
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
为r
(reword
),然后保存并关闭文件.完成!
微型vim教程(或者,如何只用8次击键来重新定义3j
cw
r
EscZZ
):
vimtutor
如果你有时间,请跑
h
j
k
l
对应于移动键 ←↓↑→
所有命令都可以以"范围"为前缀,例如3j
向下移动3行
i
进入插入模式 - 您键入的文本将出现在文件中
Esc或Ctrlc
退出插入模式并返回"正常"模式
u
撤销
Ctrlr
重做
dd
,dw
,dl
删除线,字或字母,分别
cc
,cw
,cl
以改变线,字或字母,分别为(相同dd
i
)
yy
,yw
,yl
复制("抽出")的线,字或字母,分别
p
或P
分别在当前位置之后或之前粘贴
:w
Enter 保存(写入)文件
:q!
Enter 退出而不保存
:wq
Enter或者ZZ
保存并退出
如果你经常编辑文本,那么切换到Dvorak键盘布局,学习触摸式,并学习vim.值得努力吗?是.
ProTip™:不要害怕尝试重写历史记录的"危险"命令* - Git默认情况下不会删除你的提交90天; 你可以在reflog中找到它们:
$ 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
- 他们可以丢弃数据.
* 此外,不要在您正在协作的任何分支上重写历史记录.
我尽可能多地使用Git GUI,这使您可以选择修改上次提交:
此外,这git rebase -i origin/master
是一个很好的口头禅,它将始终为您提供您在master上完成的提交,并为您提供修改,删除,重新排序或压缩的选项.无需先获取该哈希值.
哇,所以有很多方法可以做到这一点.
另一种方法是删除最后一次提交,但保留其更改,这样您就不会丢失工作.然后,您可以使用更正的消息进行另一次提交.这看起来像这样:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
如果我忘记添加文件或进行更改,我总是这样做.
请记住指定--soft
而不是--hard
,否则您将完全失去该提交.
对于任何寻找Windows/Mac GUI以帮助编辑旧消息(即不仅仅是最新消息)的人,我建议使用SourceTree.要遵循的步骤如下.
对于尚未推送到远程的提交:
确保您已提交或隐藏所有当前更改(即"文件状态"选项卡中未列出任何文件) - 否则将无法正常工作.
在"日志/历史记录"选项卡中,右键单击要编辑的提交下方图形中相邻行的条目,然后选择"以交互方式重新生成
选择要更改的提交消息的整行(即单击"消息"列).
单击"编辑消息"按钮.
在出现的对话框中根据需要编辑消息,然后单击"确定".
如果要更改其他提交消息,请重复步骤3-4.
单击"确定":将重新开始重新定位.如果一切顺利,输出将结束"已成功完成".
......或者......对于已被推送的提交:
按照本答案中的步骤进行操作,这些步骤与上述类似,但需要从命令行运行另一个命令来强制推送分支 - 全部阅读并应用必要的注意事项!
如果您只想编辑最新的提交使用:
git commit --amend
要么
git commit --amend -m 'one line message'
但是如果你想连续编辑几个提交,你应该使用rebasing代替:
git rebase -i
在上面的文件中写入编辑/ e或其他选项之一并点击保存并退出.
现在你将处于第一次错误的提交.对文件进行更改,它们将自动为您播放.类型
git commit --amend
保存并退出并键入
git rebase --continue
移动到下一个选择,直到完成所有选择.
请注意,这些内容会在特定提交后更改所有SHA哈希值.
如果你只是想改变你的最后一条消息,你应该使用的--only
标志或它的快捷方式-o
有commit --amend
:
git commit --amend -o -m "New commit message"
这可以确保您不会意外地使用分段内容增强您的提交.当然最好有一个合适的$EDITOR
配置.然后你可以退出-m
选项,git会用旧的预先填充提交消息.通过这种方式,它可以轻松编辑.
使用一行中的新提交消息更新上次错误的提交消息:
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.
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"
在这里,您已成功将最后一次提交分成两次提交.
在这个问题上有很多答案,但没有一个能够详细解释如何使用VIM更改旧的提交消息.我自己一直试图这样做,所以在这里我会详细写下我是如何做到的,尤其是那些没有VIM经验的人!
我想改变我已经推送到服务器的五个最新提交.这是非常"危险"的原因,如果其他人已经从中撤出,你可以通过更改提交消息搞砸了.但是当你在你自己的小分支上工作并且确定没有人拉它时你可以改变它:
假设您要更改五个最新提交,然后在终端中键入:
pick
*其中5是您要更改的提交消息数.(所以如果你想改变你输入的第10个到最后一次提交10)
此命令将使您进入VIM,您可以"编辑"您的提交历史记录.你会看到最后5个提交在顶部,如下所示:
reword
而不是i
你需要写reword
.您可以通过输入来在VIM中执行此操作pick
,这将使您进入INSERT模式.(您可以通过底部的INSERT一词看到您处于插入模式)对于要更改的提交,请键入:
而不是wq
然后你需要保存并退出这个屏幕,你可以先按下esc按钮进入'命令模式'.(如果底部的INSERT单词已经消失,你可以检查你是否处于命令模式)然后你可以输入一个命令:wq
,保存和退出命令git push --force
.因此,如果你打字,git push --force
他就是正确的.
然后VIM将遍历您想要重写的每个提交消息,在这里您可以实际更改提交消息.您将通过进入INSERT模式,更改提交消息,进入命令模式并保存并退出来执行此操作.这样做5次,你就离开了VIM!
然后,如果您已经推送了错误的提交,则需要pick
覆盖它们.请记住,这reword
是一件非常危险的事情,所以请确保自推送错误提交后没有人从服务器中拔出!
现在您已经更改了提交消息!
(如你所见,我在VIM中没有经验,所以如果我用错误的'lingo'来解释发生了什么,请随时纠正我!)
你可以使用git-rebase-reword
它旨在编辑任何提交(不仅仅是最后一次) commit --amend
$ git rebase-reword
它以rebase交互操作命名,以修改提交:"reword".看这篇文章和man -section交互模式 -
例子:
$ git rebase-reword b68f560 $ git rebase-reword HEAD^
我添加了别名reci
,recm
为此recommit (amend)
,现在我可以使用git recm
或git recm -m
.
$ vim ~/.gitconfig [alias] ...... cm = commit reci = commit --amend recm = commit --amend ......
我意识到我已经推了一个错误的提交.为了撤消,我做了以下事情:
git commit --amend -m "T-1000, advanced prototype"
git push --force
警告:强制推送您的更改将覆盖您的本地更改远程分支.确保您不会覆盖任何您想要保留的内容.如果其他人与你共享分支,也要谨慎推动修改(重写)提交,因为如果他们拥有你刚刚重写的提交的旧副本,他们将需要重写他们自己的历史记录.
我喜欢使用以下内容:
git status
git add --all
git commit -am "message goes here about the change"
git pull
git push
如果您尚未将代码推送到远程分支(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
这是更改提交消息时的最佳做法(如果已经推送).