我在提交消息中写错了东西。或者,我忘了包含一些文件。
如何更改提交消息/文件?提交尚未被推送。
- 对于那些对Git有点陌生的人来说:劳里关于还没有推出的观点很重要。就像重新平衡一样,这正在改变历史。如果有人在原始和重写的历史记录之间克隆/提取了您的repo,那么在重写之后他们将无法提取(对于该分支)。
修改最新的提交消息
将打开编辑器,允许您更改最近提交的提交消息。此外,可以在命令行中直接使用以下命令设置提交消息:
1
| git commit --amend -m"New commit message" |
…但是,这可能会使多行提交消息或小的更正更难输入。
在执行此操作之前,请确保没有任何工作副本更改,否则它们也将被提交。(未保存的更改将不会被提交。)
更改已推送到远程分支的提交消息
如果已经将提交推送到远程分支,则需要使用以下命令强制推送提交:
1 2 3
| git push <remote> <branch> --force
# Or
git push <remote> <branch> -f |
警告:强制推将使用本地分支的状态覆盖远程分支。如果远程分支上有您在本地分支中没有的提交,那么您将丢失这些提交。
警告:请注意修改您已经与其他人共享的承诺。修改提交实质上重写了它们,使它们具有不同的shaid,如果其他人拥有您重写的旧提交的副本,则会造成问题。任何拥有旧提交副本的人都需要将他们的工作与您新重新编写的提交同步,这有时可能很困难,因此在尝试重写共享提交历史记录时,请确保与其他人协调,或者避免完全重写共享提交。
使用交互式钢筋网
另一种选择是使用交互式钢筋网。这允许您编辑任何要更新的消息,即使它不是最新的消息。
要进行Git挤压,请执行以下步骤:
1 2
| // 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提交(1)手册页
Git Rebase(1)手册页
Git Push(1)手册页
- 然而,git commit --amend并没有git rebase -i那么强大。
- @杰弗里斯,这绝对不需要。另外,git commit --amend可以修复(a?)主提交。
- 如果你已经推了,再用力推一次:git push -f origin branchname。
- @如果其他人使用同一个仓库,休斯不是有点危险吗?
- 如果不想重写整个提交消息,请使用git commit --amend -c HEAD。这将打开预先填充了旧提交消息的编辑器,以便您可以更改它。
- 如果你只键入git commit --amend,而没有其他内容,那么@sam所说的似乎也有效。
- @休斯不会强迫别人在没有事先警告的情况下使用仓库!!否则,当他们再次尝试获取时,会导致一个奇怪的冲突。如果那个人不知道他/她在做什么,他们可能会错误地解决冲突,然后推动冲突,这将进一步破坏存储库。
- 但是,不要修改已经分享的承诺!
- @不,正确的术语是,或者至少过去是,分支的"尖端"。
- 只是一点细节。如果在有阶段性更改(添加了git add)的情况下执行git commit --amend,它们将成为修改后的提交的一部分。这对于添加更改或删除您忘记转移的内容很有用(通常我在删除文件时忘记了git add命令中的-a选项)。
- 一个很好的答案!并且涵盖了合并的重要点,rebase -i在默认情况下不会让您这样做。要使用REBASE更改合并提交的消息,必须使用保留选项-p。
- @RjmUnro,您提供的链接将提交消息的主体描述为可选的。"如果有任何技术细节不能用这些严格的尺寸限制(主题行)来表达,那么把它们放在正文中,"有时一个小的改变只需要一行来描述它。
- @Antinome现在已经编辑了答案,以反映我之前的评论(stackoverflow.com/revisions/179147/12),因此现在显示-m是一种替代方法,而不是通常的做法。我对新版本很满意,所以我将删除以前的评论。
- 链接到git-scm.com/book/en/git-tools-rewriting-history将是一个很好的答案。
- 应该有2个sha。其中一个diff,一个metadata。这样就可以无缝地移动提交…还原提交。验证更改是否相同(相同的sha=相同的diff…即使不同的人做了…等)。
- "确保没有任何工作副本更改…"可能应为"确保没有任何阶段更改…",按照正常规则,只有阶段更改会影响提交。
- git commit --amend -m"New commit message"并没有使输入多行注释变得繁琐。你应该使用:git commit --amend -m $'- line 1
line2'。
- 如果这个答案还提到编辑一个不是最新的提交消息,那就太好了。也就是说,它应该包括这个答案。
- 这将改变FYKI的散列值。
- 如果已经推到远程分支,那么如果配置git文件中的denynonfastforwards=true,它将不起作用。你需要把它改为假。尝试stackoverflow.com/questions/10544139/&hellip;中的解决方案。
- 索引中还有一些我没有提交的文件。这个命令修改了我以前的提交消息,但也将这些文件添加到提交中。现在,我可以再次修改来拆分我想要的承诺吗?
- 非常好的响应,但是您不会谈论第三个选项,比如"在头之前提交的上一个提交上更改提交消息,而这已经不是推送了"。
- 如果使用git push -f收到denying non-fast-forward错误,则需要在服务器存储库上设置receive.denyNonFastForwards false。请参阅stackoverflow.com/questions/9832348/&hellip;
- "e/r"是什么意思?
- 这意味着在钢筋中选择"编辑"或"重新加工"选项。
- 你将失去那些承诺。我是说在偏僻的地方。正确的?
- git commit --amend -m"New commit message"允许您在提交消息中使用"",而不改变git配置
- GitHub文档对于使用交互式Rebase更新以前提交的消息非常有用。
- 对于使用rebase -i编辑东西有困难的人,从pick改为其他类型的i,然后点击进入编辑模式,然后将pick改为其他类型,然后点击Esc,进入:wq,保存并退出编辑器。最后,它会让您更改提交消息,在这里您将再次输入i,更改注释,点击Esc,然后键入:wq。
- @armand你可以使用git push --force-with-lease。在同一个存储库中工作更安全
1
| git commit --amend -m"your new message" |
- 我确实提交了git-commit--modify-m"新消息",但是推到github生成了"在再次推之前合并远程更改"。在pull、commit、modify和push之后,新消息不会出现。相反,我有github.com的"合并分支"master:[myrepo]"
- @戴维维特,你很可能在试图解决之前把你的承诺推到了上游。
- @Thorbj&248;rnravandersen-谢谢,那是2年前的事了,现在我已经整理好了我的Git工作流程!
- @Kyralessa不是真的。在bash中,您可以很容易地编写多行提交消息,只需在完成之前不关闭引号(在引号内的每行末尾点击回车键)。
- 此命令是否也提交阶段性更改?
- 我不知道一个看起来很像两年前写的答案的主要想法的答案,而且被接受的答案得到了如此多的选票。奇怪。(不过答案没有错)
- @Happycoder:因为这个问题非常流行,并且是许多与Git相关的术语在谷歌(和许多其他搜索引擎)上的第一次点击。人们发现它很有用。
- @Amalmurali,好吧。我的观点不是关于这个问题的流行程度,也不是关于答案的效用。但这一特定的答案并不是最古老的答案,也不能提供对公认答案的进一步了解。它似乎是已接受答案的一部分的副本。这就是我的观点。干杯!
- @厄尔詹金斯是的,这有点有趣,但我很高兴他们能深入研究,即使是"简单"的问题。
- 很小的一点,如果在编辑之前确实将commit推到了远程,那么可以使用git push-f>,也就是force push"修复"它。它将覆盖以前的提交。正如@dan所解释的,这不是最好的方法,但是你在那里做不了什么。
- @韦德,你应该避免使用武力推动共享回购,不惜一切代价。这样做几乎可以保证使用这个遥控器的任何人都会发生冲突。我认为强制更改历史记录的唯一合法原因是从不安全的存储库中删除高度敏感的数据(例如意外提交的"passwords.txt")。在所有其他情况下,使用git revert。如果您必须强制推送,请先阅读以下内容:blog.sensible.io/2012/10/09/&hellip;
- @丹,我明白。这就是为什么我说这不是最好的方法,并指出你的意见。但是,如果他们已经被推到上游的偏远地区,那么他们所能做的很少,这不会引起冲突。
- @韦德,我不同意"他们能做的很少,不会引起冲突。"我是专门回答你之前的陈述"但你不能做的太多。"你可以做一些不会引起冲突的事情。正如我建议的,你应该使用git revert而不是git push -f。revert将添加一个新的commit,该commit将反转在已还原的commit中所做的更改,而不是修改历史记录,从而消除冲突。git-scm.com/docs/git-revert文件
- @我明白你的意思了。是的,那就行了。如果他们是在自己的部门工作,即使是和git revert也会有冲突,不是吗?
- @Wade git revert不会引入任何git commit也不会引入的冲突。它只是添加一个新的提交,这个提交恰好包含反向上一次提交中所做更改的更改。在大多数情况下,任何合并您的分支的人都将进行快速前进。
如果要修复的提交不是最新的提交:
git rebase --interactive $parent_of_flawed_commit
如果要修复多个有缺陷的提交,请传递其中最旧的一个提交的父级。
会有一个编辑器出现,列出自您给出的提交以来的所有提交。
在您要修复的任何承诺之前,将pick更改为reword(或在Git的旧版本上,更改为edit)。
保存后,Git将重放列出的提交。
BR/>
对于您要改写的每个提交,Git都会将您放回编辑器中。对于您要编辑的每个提交,git都会将您放入shell。如果你在空壳里:
以任何你喜欢的方式改变承诺。
git commit --amend
git rebase --continue
这个序列中的大部分将通过在执行过程中输出各种命令来向您解释。这很容易,你不需要记住它——只要记住git rebase --interactive允许你纠正承诺,不管它们多久以前。
请注意,您将不希望更改已推送的提交。或者你可能会这样做,但在这种情况下,你必须非常小心地与每个可能已经完成了你的承诺并在上面完成了工作的人沟通。在有人向已发布的分支推送REBASE或重置后,如何恢复/重新同步?
- 是否可以更改第一次提交的消息(没有父级)?
- 其他答案中有一个提到这个问题,但我会在这里记下。由于git 1.6.6,您可以使用reword代替pick来编辑日志消息。
- 请牢记,您将取消所有提交日期。
- 顺便说一下,$parent_of_flawed_commit相当于$flawed_commit^。
- @平谷:不,你不会放宽任何承诺日期的。
- 如果你已经向上游推进了,永远不要这样做(或者重新平衡)。
- 如果在有缺陷的提交之后有合并,则使用-p(--preserve-merges)。
- 另外,$parent_of_flawed_commit的意思是"在你搞砸的人之前承诺":)
- @亚里士多德,我是唯一一个将提交到远程存储库的人。我可以为已经推动的承诺推动rewords吗?
- 在GitSvn工作流中,这对我非常有效,其中一批更改中的一个Git提交消息被一个SVN预提交挂钩拒绝。我可以重新设计,然后数据处理工作。
- 在Windows上(甚至在sourcetree的mingw控制台中)rework不适用于我。Git总是试图打开一个文件"$@"。非常不幸的是,Git并没有考虑到跨平台。
- 我不需要git rebase --continue,重新平衡已经完成了。
- @13任你可能已经找到答案,但这可能有助于其他人(我没有看到回复你的评论)。stackoverflow.com/questions/2246208/&hellip;
- 如果我想编辑第一个提交消息,即初始提交的消息,该怎么办?
- 使用--root而不是commit hash。
要修改前一个提交,请进行所需的更改并准备这些更改,然后运行
这将在文本编辑器中打开一个代表新提交消息的文件。它开始时填充了旧提交消息中的文本。根据需要更改提交消息,然后保存文件并退出编辑器以完成。
要修改以前的提交并保留相同的日志消息,请运行
1
| git commit --amend -C HEAD |
要通过完全删除前一个提交来修复它,请运行
如果要编辑多个提交消息,请运行
1
| git rebase -i HEAD~commit_count |
(用要编辑的提交数替换提交计数。)此命令启动编辑器。将第一次提交(要更改的提交)标记为"编辑"而不是"选择",然后保存并退出编辑器。进行您想要提交的更改,然后运行
1 2
| git commit --amend
git rebase --continue |
注:您也可以从git commit --amend打开的编辑器中"进行您想要的更改"。
- git rebase -i HEAD~commit_count还允许您更改您选择的许多提交的提交消息。只需将所选提交标记为"已改写"而不是"选取"。
- 如果你不想重新平衡呢?您只想更改旧邮件?
- git reset --hard取消未提交的更改。请用--soft替换--hard。
如前所述,git commit --amend是覆盖最后一个提交的方法。一个注意事项:如果您还想覆盖这些文件,命令将是
1
| git commit -a --amend -m"My new commit message" |
- 如果你不想增加所有的内容,你可以先做git add file.ext,然后只做git commit --amend。
您也可以使用git-filter-branch。
1
| git filter-branch -f --msg-filter"sed 's/errror/error/'" $flawed_commit..HEAD |
这不像一个微不足道的git commit --amend那么简单,但是如果在错误的提交消息之后已经有了一些合并,那么它特别有用。
注意,这将尝试重写HEAD和有缺陷的commit之间的每个commit,因此您应该非常明智地选择msg-filter命令;-)
- 如果regex找不到任何内容,是否有此版本不会更改提交?
- afaik filter branch--msg filter在任何情况下都将生成新的提交。但是,您可以在msg filter中检查SED是否成功,并在filter branch操作结束时使用此信息将树重置为refs/original。
- @只有在使用filter-branch方法时,这才是正确的。如果使用交互式钢筋网,修改后的提交后的提交ID不会更改。
- @标记"是",他们需要。提交ID依赖于以前的提交。如果他们不改变,吉特将是无用的。
- 你需要的是$flawed_commit^..HEAD,而不是$flawed_commit..HEAD。如手册页所述:&171;命令将只重写命令行中提到的正引用(例如,如果通过a..b,则只重写b)。&187;
我喜欢这样。
1
| git commit --amend -c <commit ID> |
否则,将使用新的提交ID进行新的提交。
- 对于我来说,使用上面的命令实际上创建了一个新的提交,其中包含一个新的提交ID和一个额外的提交,并将"合并分支"作为默认提交消息。
- 修改总是使用新的提交ID创建新的提交。提交ID是提交内容的sha哈希,包括提交消息和编写/提交的时间戳。这是Git的一个特性,除了哈希冲突,它确保具有相同ID的两个提交完全相同,具有完全相同的内容、历史记录等。
- 同意埃米尔。此外,阅读文档-似乎所有"-c"都会告诉Git要将哪个commit的消息用作新commit的默认/模板..实际上,默认情况下它已经开始执行"-c",因此无需指定它。
- -c做了一些事情。默认情况下,它使用旧消息,但也复制作者信息(人和时间)。-c做了同样的事情,只是它不要求您编辑消息。
- 就像@santanudey一样,它对我不起作用。我找到了fatal: Option -m cannot be combined with -c/-C/-F/--fixup.。
- 在需要修复多个提交的情况下,使用提交ID非常有用。你不需要任何其他命令,这是简短和明确的。
如果您使用的是git-gui工具,那么有一个名为amend last commit的按钮。单击那个按钮,它将显示您最后一次提交的文件和消息。只需编辑该消息,您就可以用新的提交消息提交它。
或者从控制台/终端使用此命令:
1
| git commit -a --amend -m"My new commit message" |
您可以使用git重新平衡。例如,如果要修改back以提交bbc643cd,请运行
1
| $ git rebase bbc643cd^ --interactive |
在默认编辑器中,将要修改其提交的行中的"pick"修改为"edit"。做出你的改变,然后用
现在你可以使用
修改提交,然后
返回上一个头提交。
- 如果您想确保您从git commit --amend所做的更改生效,可以使用git show,它将显示新消息。
如果只想修改最后一条提交消息,请执行以下操作:
这将使您进入文本退出器,并允许您更改最后一条提交消息。
如果您要更改最后3条提交消息,或到该点为止的任何提交消息,请将HEAD~3提供给git rebase -i命令:
- 这个早先的答案已经说你可以使用git commit --amend,它还说你可以使用git rebase -i HEAD~commit_count,你所做的只是插入3用于commit_count。
如果必须在多个分支上更改旧的提交消息(即,多个分支中存在带有错误消息的提交),则可能需要使用:
1 2
| git filter-branch -f --msg-filter \
'sed"s//<new message>/g"' -- --all |
Git将创建一个临时目录,用于重写和备份refs/original/中的旧引用。
由于备份了旧的引用,因此可以在执行命令之前轻松返回状态。
比如说,你想找回你的主人,然后在old_master分局进入它:
1
| git checkout -b old_master refs/original/refs/heads/master |
- 这个答案并不能解决OP的问题,因为他们只对修复刚刚完成的提交感兴趣。我经常用git commit --amend来修改评论或添加我忘记给git add的文件,但这只是在我用git pushed之前。我也用git filter-branch来处理版本历史,但是操作人员不想这样做,所以这个答案需要一个大的健康警告-不要在家里尝试,peeps!!
使用
要详细了解它,一个优秀的职位是4。正在重写Git历史。它还讨论了何时不使用git commit --amend。
- 有没有一种好的方法来修复已经推送到公共存储库的提交消息?到目前为止,我得出的结论是,一旦被推到,我的承诺信息错误和thinkos必须永远存在。
- 总之,不!没有好的方法可以收回你推过的东西。所有的回缩都在很大程度上或较小程度上是不好的。您需要采用在您自己的私有存储库中的一个分支中工作的规则,在添加一点、测试一点、调整一点时执行多个提交。然后将整个分支合并到一个提交中,编写一个描述整体更改的新提交消息,对其进行校对,然后进行推送。
- 只需指出一个显而易见的事实,即当从一个特性分支返回时,不必进行单一的提交。许多人所做的是在目标分支上重新设置基片(使事情看起来干净),然后与选项合并以抑制快速转发。不过,在你俯卧撑之前要注意的要点是一致的。
修正
你有几个选择。你可以做到
只要这是你最后的承诺。
交互式钢筋网
否则,如果这不是您最后一次提交,您可以执行交互式重新平衡,
1
| git rebase -i [branched_from] [hash before commit] |
然后,在交互式钢筋库中,您只需向该提交添加编辑。当它出现时,执行git commit --amend并修改提交消息。如果您想在提交点之前回滚,也可以使用git reflog,只需删除该提交。然后你再做一次git commit。
如果您使用的是Git图形用户界面,那么您可以修改最后一次未被推送的提交:
1
| Commit/Amend Last Commit |
如果这是你最后的承诺,只需修改承诺:
1
| git commit --amend -o -m"New commit message" |
(使用-o(--only标志确保只更改提交消息)
如果这是一个隐藏的提交,请使用令人敬畏的交互式钢筋:
1
| git rebase -i @~9 # Show the last 9 commits in a text editor |
找到所需的提交,将pick更改为r(reword),然后保存并关闭文件。完成!
微型VIM教程(或者,如何只使用8次击键3jODOCX1〔6〕rXKBDOCX1〔8〕)进行重新设定):
- 有时间的话运行vimtutor。
- hdocx1〔11〕docx1〔12〕docx1〔13〕对应于运动键← ↓ ↑ →
- 所有命令都可以加上前缀"range",例如xykb3j向下移动3行
- xykbi进入插入模式-您键入的文本将出现在文件中
- esc或ctrlxykbeddocx1〔16〕退出插入模式,返回"正常"模式
- xykbu撤销
- ctrlxykbeddocx1〔3〕重做
- xykbdd、xykbdw、xykbdl分别删除一行、一个字或一个字母。
- xykbcc、xykbcw、xykbcl分别更改行、字或字母(同xykbddxykbeddocx1〔15〕)
- xykbyy、xykbyw、xykbyl分别复制("扬克")一行、一个字或一封信。
- xykbp或xykbp分别粘贴在当前位置之后或之前
- DEOCX1〔32〕Enter,用于保存(写入)文件
- DEOCX1〔33〕Enter不保存退出
- :wqEnter或ZZ保存退出
如果你经常编辑文本,然后切换到dvorak键盘布局,学习触摸类型,学习vim。值得付出努力吗?对。
提示?:不要害怕尝试重写历史记录的"危险"命令*-git默认情况下90天内不会删除您的提交;您可以在reflog中找到它们:
1 2 3 4 5 6 7 8 9
| $ 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这样的选项——它们可以丢弃数据。*另外,不要在你合作的任何分支上重写历史。
我尽可能多地使用Git GUI,这使您可以选择修改最后一次提交:
此外,git rebase -i origin/master是一个很好的咒语,它将永远向您呈现您在主服务器上所做的承诺,并给您修改、删除、重新排序或挤压的选项。不需要先抓住这个散列值。
- 如何到达您在示例中显示的屏幕?
- 它是Windows Git GUI的右下部分。只需选择"修正上次提交"开关,它将填充最新的提交信息。
哇,有很多方法可以做到。
另一种方法是删除最后一次提交,但是保留它的更改,这样就不会丢失您的工作。然后,您可以使用已更正的消息执行另一个提交。这看起来像这样:
1 2
| git reset --soft HEAD~1
git commit -m 'New and corrected commit message' |
如果忘记添加文件或进行更改,我总是这样做。
记住指定--soft而不是--hard,否则您将完全失去该承诺。
- 这与git commit --amend的作用完全相同,只是它是一个两步过程。
- @施特劳斯,我相信,修改承诺还保留了原始的承诺作者和日期信息,分别拥有新的承诺人和日期信息。我不确定这种方法能做到这一点。
- @不管怎样,你都是对的。--amend将保留作者信息,但问题只要求更改消息。
对于任何希望使用Windows/Mac图形用户界面来帮助编辑旧消息(即,不仅仅是最新消息)的人,我建议使用sourcetree。下面是要遵循的步骤。
对于尚未推送到远程的提交:
确保您已提交或存储了所有当前更改(即"文件状态"选项卡中没有列出任何文件),否则将无法工作。
在"Log/History"选项卡中,右键单击要编辑的提交下面的图中相邻一行的条目,然后选择"Rebase children ofinteractively…"
选择要更改的提交消息的整行(即单击"消息"列)。
点击"编辑信息"按钮。
根据需要在弹出的对话框中编辑消息,然后单击"确定"。
如果还有其他提交消息要更改,请重复步骤3-4。
单击确定:重新定位将开始。如果一切正常,输出将结束"成功完成"。
…或…对于已推送的提交:
请遵循此答案中的步骤,与上面类似,但需要从命令行运行进一步的命令以强制推送分支-全部读取并应用必要的警告!
如果只想编辑最新提交,请使用:
或
1
| git commit --amend -m 'one line message' |
但是,如果要在一行中编辑多个提交,则应改为使用重新平衡:
1
| git rebase -i <hash of one commit before the wrong commit> |
在上述文件中,写入编辑/e或其他选项之一,然后单击保存并退出。
现在你就要犯错误了。对文件进行更改,它们将自动为您进行转移。类型
保存并退出,然后键入
移动到下一个选择,直到完成所有选择。
注意,在特定的提交之后,这些事情会改变您的所有sha散列。
如果您只想更改最后一条消息,则应使用--only标志或其快捷方式-o和commit --amend:
1
| git commit --amend -o -m"New commit message" |
这确保了你不会意外地用一些阶段性的东西来增强你的承诺。当然,最好有一个适当的$EDITOR配置。然后您可以将-m选项保留在外,Git将用旧的提交消息预先填充提交消息。这样就可以很容易地进行编辑。
- "最高"的答案不能回答问题。它只是简单介绍了git commit --amend。这个问题非常具体,因此时间更长!=更好。对-o旗的决定性提及可能会被掩埋在其余的信息中。我也不愿意编辑一个已经有这么多选票的答案。
- 尽管如此,你可以自由地编辑最上面的答案,因为有一个真正的危险,人们使用它作为"正确"的答案。很容易就可以用一些阶段性的东西来修正你的承诺——这发生在我身上,当你碰巧推动它的时候,这真的很烦人。但是,数量并不能保证正确性。答案的数目和投票的数目都不是。
- 我不会说最上面的答案是"错误的",它"没有回答问题"。它肯定有效,并回答了问题,你只需要确保你没有阶段性的变化,当你试图修正。但我明白你必须警告人们的观点。如果我有时间的话,我稍后再编辑。
- 公平地说:尽管自Git 1.3.0以来,带有--amend的--only选项是可用的,但直到在1.7.11.3(EA2D4ED35902CE15959965AB86D80527731A177C)中固定后,它才正常工作。所以2008年的正确答案可能是:git stash; git commit --amend; git stash pop。
在一行中用新的提交消息更新上一个错误的提交消息:
1
| git commit --amend -m"your new commit message" |
或者,尝试如下Git重置:
1 2 3 4 5 6 7
| # 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也可以帮助您将一个承诺分解为多个承诺:
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 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 commit --amend,就像它在最热门的答案中所说的那样。此外,git reset --soft HEAD^的工作方式与前面的回答中的软重置相同,因为它们都重置回第一个父提交。
- 我只想在解决方案中添加git reset,只是想将一个提交消息拆分为多个提交消息。因为,当我开始使用git时,我就面临着这个问题。有时候,这真的很有帮助。:)
在这个问题上,有很多答案,但没有一个能非常详细地解释如何使用VIM更改较旧的提交消息。我一直在尝试自己做这件事,所以在这里我将详细地写下我是如何做这件事的,尤其是对于那些没有经验的人。
我想更改我已经提交给服务器的五个最新提交。这是非常"危险"的,因为如果已经有人从中退出,您可以通过更改提交消息来把事情搞砸。然而,当你在自己的小树枝上工作时,确保没有人拉它,你可以这样改变它:
假设您要更改五个最新提交,然后在终端中键入:
git rebase -i HEAD~5*其中5是要更改的提交消息数。(因此,如果要将第10次提交更改为最后一次提交,请键入10)
这个命令将使您进入vim,您可以在那里"编辑"提交历史记录。您将在顶部看到最后5个提交,如下所示:
pick commit message
你要写的不是pick,而是reword。您可以在vim中通过在i中键入来实现这一点,这将使您进入插入模式。(您会看到您正处于插入模式,在底部的单词insert)对于您想要在reword而不是pick中更改类型的提交。
然后,您需要保存并退出此屏幕,您可以通过按Esc按钮进入"命令模式"来完成此操作。(您可以检查是否处于命令模式,如果底部插入的单词消失了),则可以通过键入:键入命令,要保存和退出的命令是wq。所以如果你输入:wq,你就不是正确的路径。
然后Vim将检查您想要改写的每个提交消息,这里您可以实际更改提交消息。您将进入插入模式,更改提交消息,进入命令模式,保存并退出。这样做5次,你就失去了活力!
然后,如果您已经推错了承诺,那么您需要git push --force来覆盖它们。记住,git push --force是一个非常危险的操作,所以请确保自从您推错了提交之后,没有人从服务器上拉出来!
现在您已经更改了提交消息!
(正如你所看到的,我在维姆身上没有那么有经验,所以如果我用错误的"行话"来解释发生了什么,请随时纠正我!)
- 堆栈溢出没有"线程",因为它不是一个讨论论坛,只有"问题"、"答案"和"帖子"。</nitpick>。而且,不是所有版本的vim都是相同的,不是所有版本都允许您在插入模式中删除字符(从某种意义上讲是有意义的,对吗?)。如果您希望始终能够删除vim中的字符,那么X和X将执行此操作(小X删除光标前面的字符,X将删除光标后面的字符)。如果你犯了错误,你可以反复使用u来撤销。最后,r是交互式Rebase编辑器中reword的简写。
- 在vim中更改一个词是cw在其开头键入的(尽管问题不是关于vim,我同意)。
您可以使用重新加工的git-rebase
它的设计目的是以与commit --amend相同的方式编辑任何提交(不仅仅是最后一次提交)。
1
| $ git rebase-reword <commit-or-refname> |
它以修改提交的Rebase Interactive操作命名:"reworked"。见本帖与人章节互动模式-
实例:
1 2
| $ git rebase-reword b68f560
$ git rebase-reword HEAD^ |
- 这需要安装一个外部程序。在我看来,学习更有效地使用内置工具和别名会更好。我会键入:g c; g rb -i @~9(commit and rebase),将新commit移到我想要的位置,将commit更改为f(fixup并保存。如果你想要比这更快的东西,你可以叫git commit --fixup=; git rebase -i --autosquash ^。
- github.com/qxo/git-rebase-rework,适用于Linux和Windows
我已经为recommit (amend)添加了reci、recm的别名,现在我可以用git recm或git recm -m来做了。
1 2 3 4 5 6 7 8 9
| $ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
...... |
我意识到我犯了一个错误。为了撤消,我执行了以下操作:
1 2
| git commit --amend -m"T-1000, advanced prototype"
git push --force |
警告:强制执行更改将用本地分支覆盖远程分支。确保你不会重写任何你想保留的东西。如果其他人与您共享分支,那么也要谨慎地强制执行修改(重写)提交,因为如果他们拥有您刚刚重写的提交的旧副本,那么他们需要重写自己的历史。
- 在Git中没有任何东西会被"覆盖"。在这种情况下,分支指针将被设置为新提交,如果没有对它的引用,旧提交将过时,并且可能在几周后被清除。(在此之前,其他人仍然可以找到并引用它,例如通过查看reflog。)
我喜欢使用以下方法:
git status
git add --all
git commit -am"message goes here about the change"
git pull
git push
如果您没有将代码推送到远程分支(github/bitback),您可以在命令行上更改commit消息,如下所示。
1
| git commit --amend -m"Your new message" |
如果您在一个特定的分支上工作,请执行以下操作:
1
| git commit --amend -m"BRANCH-NAME: new message" |
如果您已经用错误的消息推送了代码,那么在更改消息时需要小心。也就是说,在您更改提交消息并再次尝试推送之后,最终会出现问题。要使其平滑,请执行以下步骤。
在做这件事之前,请把我的全部答案都读一遍。
1 2 3
| git commit --amend -m"BRANCH-NAME : your new message"
git push -f origin BRANCH-NAME # Not a best practice. Read below why? |
重要提示:当您直接使用force push时,您可能会遇到其他开发人员正在处理同一分支的代码问题。因此,为了避免这些冲突,您需要在强制执行之前从分支中提取代码:
1 2 3
| git commit --amend -m"BRANCH-NAME : your new message"
git pull origin BRANCH-NAME
git push -f origin BRANCH-NAME |
这是更改提交消息(如果已经推送)时的最佳实践。