我在提交消息中写错了内容。
如何更改信息?提交尚未被推送。
我在提交消息中写错了内容。
如何更改信息?提交尚未被推送。
Answers:
git commit --amend
将打开您的编辑器,使您可以更改最近一次提交的提交消息。另外,您可以直接在命令行中使用以下命令设置提交消息:
git commit --amend -m "New commit message"
…但是,这会使输入多行提交消息或进行小的更正变得更加麻烦。
确保你没有任何工作副本的修改上演这样做之前,否则它们可能会犯了。(未暂存的更改将不会提交。)
如果您已经将提交推送到远程分支,那么-在本地修改提交(如上所述)之后-您还需要使用以下命令强制推送提交:
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f
警告:强行推将用您本地的状态覆盖远程分支。如果远程分支上有您本地分支中没有的提交,您将丢失这些提交。
警告:对于修改您已经与其他人共享的提交要谨慎。修改提交实质上会将它们重写为具有不同的SHA ID,如果其他人拥有您已重写的旧提交的副本,则会带来问题。拥有旧提交副本的任何人都需要将他们的工作与新重写的提交同步,这有时可能很困难,因此在尝试重写共享提交历史记录时请确保与他人协调,或者只是避免重写共享提交共。
另一种选择是使用交互式变基。这样,即使不是最新消息,您也可以编辑要更新的任何消息。
为了做一个壁球南瓜,请按照下列步骤操作:
// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n
压缩提交后-选择e/r
用于编辑消息的:
当你使用git rebase -i HEAD~n
可以有更多的比的n条提交。Git会“收集”最近n次提交中的所有提交,如果在该范围之间某处存在合并,您也会看到所有提交,因此结果将为n +。
如果您需要为多个分支执行此操作,并且在修改内容时可能会遇到冲突,请设置git rerere
并让Git自动为您解决这些冲突。
git commit --amend
不如git rebase -i
。
git commit --amend
可以修复(a?)主提交。
git push -f origin branchname
git push -f
如果其他人使用相同的存储库,@ hughes并不有点危险?
git commit --amend -c HEAD
。这将打开用旧的提交消息预填充的编辑器,因此您可以对其进行更改。
git commit --amend -m "your new message"
如果您要修复的提交不是最新的提交:
git rebase --interactive $parent_of_flawed_commit
如果您要修复多个有缺陷的提交,请传递其中最早的一个的父提交。
将出现一个编辑器,并列出您提交以来的所有提交。
pick
改为reword
(或在旧版本的Git上更改为edit
)。对于您要重新编写单词的每次提交,Git都会将您带回到编辑器中。对于您要编辑的每个提交,Git会将您放入外壳。如果您在外壳中:
git commit --amend
git rebase --continue
您将通过执行各种命令的输出向您解释此序列的大部分内容。这很容易;您不需要记住它-只需记住,git rebase --interactive
无论它们有多久,它都可以使您更正提交。
注意,您将不想更改已经推送的提交。也许您这样做了,但在那种情况下,您将必须格外小心,与可能撤消了您的承诺并在其上完成工作的所有人进行沟通。在有人将基准或重置推送到已发布的分支后,如何恢复/重新同步?
reword
代替pick
来编辑日志消息。
$parent_of_flawed_commit
等效于$flawed_commit^
。
-p
(--preserve-merges
)。
要修改上一次提交,请进行所需的更改并进行这些更改,然后运行
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 -i HEAD~commit_count
也将允许您更改选择的许多提交的提交消息。只需将所选提交标记为“ reword”,而不是“ pick”。
git reset --hard
消除未提交的更改。请替换--hard
为--soft
。
git reset --hard
是完全合法的命令,但是考虑到这个问题,这是令人误解的。您可以使用--hard
,如果你提交的修改要扔掉,而不是如果你在由错字提交信息!
如前所述,git commit --amend
是覆盖上一次提交的方法。注意事项:如果您还想覆盖文件,则命令为
git commit -a --amend -m "My new commit message"
git add file.ext
然后就git commit --amend
您也可以使用git filter-branch
它。
git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
这并不简单git commit --amend
,但是如果您在错误的提交消息之后已经进行了一些合并,则它特别有用。
请注意,这将尝试重写之间的所有提交HEAD
以及有缺陷的提交,因此您应该msg-filter
非常明智地选择命令;-)
$flawed_commit^..HEAD
,没有$flawed_commit..HEAD
。如手册页所述:« 该命令将只重写命令行中提到的正引用(例如,如果您传递a..b,则只会重写b)。»
我更喜欢这样:
git commit --amend -c <commit ID>
否则,将使用新的提交ID进行新的提交。
-c
做了几件事情。默认情况下,它使用旧消息,但它也复制作者信息(人和时间)。-C
除了不要求您编辑消息外,其他操作相同。
fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
如果使用的是Git GUI工具,则有一个名为Amend last commit的按钮。单击该按钮,然后它将显示您的最后提交文件和消息。只需编辑该消息,就可以使用新的提交消息来提交它。
或从控制台/终端使用此命令:
git commit -a --amend -m "My new commit message"
您可以使用Git rebasing。例如,如果要修改回以提交bbc643cd,请运行
$ git rebase bbc643cd^ --interactive
在默认编辑器中,在要修改其提交的行中将“ pick”修改为“ edit”。进行更改,然后使用
$ git add <filepattern>
现在您可以使用
$ git commit --amend
修改提交,然后
$ git rebase --continue
返回上一个头部提交。
git commit --amend
生效,则可以使用git show
它,它会显示新消息。
如果您只想修改最后的提交消息,请执行以下操作:
git commit --amend
这将使您进入文本编辑器,并更改最后的提交消息。
如果要更改最后三个提交消息,或者要更改到目前为止的任何提交消息,请提供HEAD~3
以下git rebase -i
命令:
git rebase -i HEAD~3
如果您必须在多个分支上更改旧的提交消息(即,在多个分支中存在带有错误消息的提交),则可能要使用:
git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all
Git将创建一个临时目录进行重写,并另外将旧引用备份到中refs/original/
。
-f
将强制执行该操作。如果临时目录已经存在或在下已经存在引用,则这是必需的refs/original
。如果不是这种情况,则可以删除此标志。
--
将筛选器分支选项与修订选项分开。
--all
将确保所有分支和标签都被重写。
由于备份了旧的引用,因此您可以轻松地返回到执行命令之前的状态。
假设您要恢复您的母版并在branch中访问它old_master
:
git checkout -b old_master refs/original/refs/heads/master
git commit --amend
来修复评论或添加文件我忘了git add
,但只过之前我已经git push
编。git filter-branch
当我想完全弄乱版本历史记录时,我也会使用它,但是OP不想这样做,因此此答案需要一个大的健康警告-请勿在家尝试此操作,偷看!
git commit --amend
在您编写答案之前,答案已经(多次)给出。您为什么再次发布?如果要添加“重写Git历史记录”的链接,则可以编辑现有答案之一,或留下评论。
如果这是您的最后一次提交,则只需修改提交:
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
向下移动三行i
进入插入模式-您键入的文本将出现在文件中c
退出插入模式并返回“正常”模式u
撤销r
重做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天;您可以在参考日志中找到它们:
$ 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
虽然-他们可以丢弃的数据。
* 另外,请勿在您正在合作的任何分支机构上重写历史记录。
nano
?我们在谈论的是需要对文本文件进行的琐碎修改,而不是会产生关于“最佳”文本编辑器的激烈争论的硬核编码。
ddjjpZZ
将commit 2下移。关于Vim的基本知识没有任何奥秘。Vim要比nano更舒适,需要10分钟。
我尽可能地使用Git GUI,这使您可以选择修改最后一次提交:
另外,这git rebase -i origin/master
是一个不错的口头禅,它将始终向您展示您在master上所做的提交,并为您提供修改,删除,重新排序或压榨的选项。无需先掌握该哈希值。
哇,所以有很多方法可以做到这一点。
执行此操作的另一种方法是删除最后的提交,但保留其更改,以免丢失工作。然后,您可以使用更正后的消息再次提交。看起来像这样:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
如果忘记添加文件或进行更改,我总是这样做。
请记住指定--soft
而不是指定--hard
,否则将完全丢失该提交。
git commit --amend
两步过程完全一样。
--amend
将保留作者信息,但问题仅要求更改消息。
对于正在寻找Windows / Mac GUI来帮助编辑较旧消息(即不仅仅是最新消息)的任何人,我建议您使用Sourcetree。遵循的步骤如下。
对于尚未推送到远程的提交:
Unable to create 'project_path/.git/index.lock': File exists.
尝试同时修改多个提交消息时,有时会遇到这种失败。不确定确切的问题是什么,还是不确定在Sourcetree的未来版本中是否可以解决,但是如果发生这种情况,建议一次将其重新设置为基础(速度较慢,但似乎更可靠)。...或者...对于已经推送的提交:
请按照此答案中与上述类似的步骤进行操作,但需要从命令行(git push origin <branch> -f
)运行另一个命令来强制按下分支。我建议您阅读所有内容并采取必要的警告!
如果只想编辑最新的提交,请使用:
git commit --amend
要么
git commit --amend -m 'one line message'
但是,如果您要连续编辑多个提交,则应改用rebasing:
git rebase -i <hash of one commit before the wrong commit>
在上面的文件中,写 edit/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
。这个问题非常具体,因此更长的时间=更好。对-o
标志的决定性提及可能会掩盖在其余信息中。我也不愿意编辑已经有很多票的答案。
--only
with选项,但--amend
在1.7.11.3(ea2d4ed35902ce15959965ab86d80527731a177c)中对其进行修复之前,该选项仍无法正常工作。因此,回想2008年的正确答案可能是:git stash; git commit --amend; git stash pop
。
在一行中用新的提交消息更新您的最后一个错误的提交消息:
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"
在这里,您已成功将上一个提交分为两个提交。
git reset
解决方案,只是想将一个提交消息拆分为多个提交消息。因为,当我开始使用时就遇到了这个问题git
。有时,这确实很有帮助。:)
关于这个问题,有很多答案,但是都没有一个非常详细地说明如何使用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经验不足,所以如果我使用错误的“行话”来解释正在发生的事情,请随时纠正我!)
<nitpick>
Stack Overflow上没有“线程”,因为它不是讨论论坛,只有“问题”,“答案”和“帖子”。</nitpick>
。另外,并不是所有的Vim版本都相同,不是所有的Vim版本都可以让您在插入模式下删除字符(在某种意义上对吧?)。如果您希望始终能够删除Vim中的字符,X
并且x
可以这样做(仅x
删除光标前面的字符,X
而后面删除的字符)。如果您犯了错误,则可以u
反复使用以撤消操作。最后,r
是reword
交互式rebase编辑器中的简写。
cw
在其开头输入(尽管我同意问题不在于vim)。
您可以使用git-rebase-reword
它旨在以与编辑相同的方式编辑任何提交(不仅是最后一次) commit --amend
$ git rebase-reword <commit-or-refname>
它是基于对rebase交互式操作进行修改以修改提交的名称:“ reword”。请参阅此帖子和人-部分交互模式-
例子:
$ git rebase-reword b68f560
$ git rebase-reword HEAD^
g c; g rb -i @~9
提交并变基),将新提交移至所需位置,更改commit
为f
(fixup
),然后保存。如果您想要更快的速度,可以使用别名 git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
我意识到我已经推了一个错字的提交。为了撤消操作,我执行了以下操作:
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 <origin master>
git push <origin master>
如果您尚未将代码推送到远程分支(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
这是更改提交消息(如果已被推送)的最佳实践。