我在提交信息中写错了内容。
我该如何修改这个信息呢?该提交还未被推送到服务器上。
我在提交信息中写错了内容。
我该如何修改这个信息呢?该提交还未被推送到服务器上。
如果您需要在多个分支上更改旧的提交信息(即,带有错误信息的提交存在于多个分支中),您可以使用:
git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all
Git将创建一个临时目录进行重写,并在refs/original/
中备份旧引用。
-f
强制执行操作。如果临时目录已经存在或者已经存在存储在refs/original
下的引用,则这是必要的。如果不是这种情况,则可以省略此标志。
--
将filter-branch选项与修订选项分隔开。
--all
将确保重写所有分支和标记。
由于备份了旧引用,您可以轻松地返回到执行该命令之前的状态。
假设您想恢复您的主分支并在分支old_master
中进行访问:
git checkout -b old_master refs/original/refs/heads/master
git commit --amend
来修复注释或添加我忘记 git add
的文件,但只有在我没有 git push
之前才这样做。当我想完全混淆版本历史记录时,我也会使用 git filter-branch
,但是提问者并不想这样做,所以这个答案需要一个大警告 - 不要在家里尝试这个操作! - kbro如果这是你的最后一次提交,只需 修改 提交:
git commit --amend -o -m "New commit message"
(使用-o
(--only
)标志确保仅更改提交消息)
如果是一个隐藏的提交,请使用强大的交互式变基:
git rebase -i @~9 # Show the last 9 commits in a text editor
找到你想要的提交,将pick
改为r
(reword
),然后保存并关闭文件。完成!
3j
cw
r
EscZZ
):
vimtutor
h
j
k
l
对应移动键 ←↓↑→3j
向下移动三行i
进入插入模式 —— 输入的文本将出现在文件中c
退出插入模式并返回到“正常”模式u
撤销r
重做dd
、dw
、dl
删除一行、一个单词或一个字母cc
、cw
、cl
更改一行、一个单词或一个字母(与 dd
i
相同)yy
、yw
、yl
复制(“yank”)一行、一个单词或一个字母p
或 P
粘贴到当前位置的后面或前面,分别:w
Enter 保存文件:q!
Enter 不保存退出:wq
Enter 或 ZZ
保存并退出如果你经常编辑文本,请切换到Dvorak键盘布局,学习触摸打字并学习Vim。值得付出这个努力吗?是的。
$ 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
这样的选项——它们可能会丢弃数据。
* 另外,在任何你正在协作的分支上不要重写历史记录。
ddjjpZZ
可以将一个提交向下移动 2 个位置。基本的 Vim 知识并没有什么神秘的地方;花费 10 分钟时间学习 Vim 就可以比使用 nano 更加熟练。 - Zazgit commit --amend
的答案已经被多次给出了。为什么你还要再次发布它呢?如果你想添加一个指向“重写Git历史”的链接,你可以编辑现有答案之一,或者留下评论。 - Dan Dascalescu这里有几个选项。你可以:
git commit --amend
只要是你的最后一次提交,就不需要进行交互式变基。
否则,如果不是你的最后一次提交,你可以进行交互式变基。
git rebase -i [branched_from] [hash before commit]
然后在交互式 rebase 中,您只需将 “edit” 添加到该提交中。当它出现时,执行 git commit --amend
并修改提交消息。如果您想回滚到该提交点之前,您也可以使用 git reflog
并删除该提交。然后您只需再次执行 git commit
。
如果您使用的是 Git GUI,您可以使用以下命令修改尚未推送的最后一次提交:
Commit/Amend Last Commit
我尽可能地使用Git GUI,它提供了修改最后一次提交的选项:
此外,git rebase -i origin/master
是一个很好的口令,它将始终向您呈现在 master 分支之上的提交,并提供修改、删除、重新排序或压缩的选项。无需首先获取那个哈希值。
如果有人正在寻找一个Windows/Mac GUI来帮助编辑较旧的消息(不仅仅是最新的消息),我推荐使用Sourcetree。下面是跟随的步骤图片。
对于还没有推送到远程的提交:
... 或者 ... 对于已经被推送的提交:
按照此答案中的步骤进行操作,其与上述步骤类似,但需要使用命令行运行进一步的命令(git push origin <branch> -f
)来强制推送分支。我建议您仔细阅读并采取必要的谨慎措施!
哇,有很多种方法可以做到这一点。
另一种方法是删除最后一次提交,但保留其更改,以便您不会丢失工作。然后,您可以使用更正后的消息进行另一次提交。操作方式如下:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
如果我忘记添加文件或进行更改,我总是这样做。
记住使用--soft
而不是--hard
,否则您将完全丢失该提交记录。
git commit --amend
的功能完全相同,只是它需要分成两步完成。 - Joseph K. Strauss--amend
将保留作者信息,但问题只要求更改消息。 - Joseph K. Strauss如果您只想编辑最新的提交记录,请使用:
git commit --amend
或者git commit --amend -m 'one line message'
但是如果你想要编辑一系列提交记录,你应该使用变基(rebase):
git rebase -i <hash of one commit before the wrong commit>
在像上面的文件中,输入edit/e
或其他选项,然后保存并退出。
现在你将会在第一个错误的提交处。更改文件内容,它们将自动为你暂存。键入
git commit --amend
保存并退出,然后输入
git rebase --continue
要移动到下一个选择,直到完成所有选择。
请注意,在特定提交之后,这些操作将更改您的所有SHA哈希值。
如果你只想修改你最后一条消息,你应该使用--only
标志或其快捷方式-o
与commit --amend
一起使用:
如果您只想更改上一条提交的信息,请使用--only
标志或其缩写-o
与commit --amend
一起使用:
git commit --amend -o -m "New commit message"
这样可以确保您不会意外地将暂存的内容与提交混合。当然,最好有一个适当的$EDITOR
配置。然后您可以省略-m
选项,Git会使用旧的提交信息填充提交信息。以此方式可以轻松编辑。
git commit --amend
进行了一般性的介绍。问题非常具体,因此长并不等于好。关键的 -o
标志可能会被淹没在其他信息中。我也不太舒服编辑已经有很多赞的答案。 - David Ongaro--amend
选项的--only
选项可用,但直到在1.7.11.3中修复后才能正常工作(ea2d4ed35902ce15959965ab86d80527731a177c)。因此,回到2008年的正确答案可能是:git stash; git commit --amend; git stash pop
。 - David Ongaro