我已经提交了git并随后推送。我想更改提交消息。如果我理解正确,这是不可取的,因为在我进行此类更改之前,可能有人从远程存储库中删除了内容。如果我知道没人拉过呢?
有办法做到这一点吗?
我已经提交了git并随后推送。我想更改提交消息。如果我理解正确,这是不可取的,因为在我进行此类更改之前,可能有人从远程存储库中删除了内容。如果我知道没人拉过呢?
有办法做到这一点吗?
当前回答
我第一次尝试重命名已经推送的大约6条旧提交消息,之后我又做了进一步的提交。
因此,这是最糟糕的案例“案例4:已推送+旧提交”。
我是Vim(现在是Nvim)的用户,也是Vim《逃犯》的超级粉丝。所以我就是这样做的。
这是您在《逃犯》中关于重新定基的一般帮助:
Rebase maps ~
ri Perform an interactive rebase. Uses ancestor of
u commit under cursor as upstream if available.
rf Perform an autosquash rebase without editing the todo
list. Uses ancestor of commit under cursor as
upstream if available.
ru Perform an interactive rebase against @{upstream}.
rp Perform an interactive rebase against @{push}.
rr Continue the current rebase.
rs Skip the current commit and continue the current
rebase.
ra Abort the current rebase.
re Edit the current rebase todo list.
rw Perform an interactive rebase with the commit under
the cursor set to `reword`.
rm Perform an interactive rebase with the commit under
the cursor set to `edit`.
rd Perform an interactive rebase with the commit under
the cursor set to `drop`.
r<Space> Populate command line with ":Git rebase ".
r? Show this help.
获取提交列表。:Git日志--单行我想修复第12行的提交消息(4d43a1b构建(MPL-402):editorconfigfixformesages.json),因为它不是正确的常规提交格式。我将光标放在提交哈希4d43a1b上,然后键入rw这将“在光标设置为reword的情况下执行一个交互式rebase和commit”。请注意,与gitrebase-i HEAD~X相比,这是多么好-知道X是什么并不是那么简单。现在,这将为您提供正确的gitrebase命令。所以用:wq写并退出缓冲区然后按照git/逃犯指导的步骤进行操作。我的一个提交出现了合并冲突,我通过正常的fugitve合并冲突过程解决了这个问题。
希望这足以让你度过第一个“我以前从未做过一次重新训练,我到底该做什么?”的难关。如果您需要后续步骤的帮助,请给我留言。
其他回答
另一个选项是创建一个额外的“勘误表提交”(和推送),它引用包含错误的提交对象——新的勘误表提交也提供了更正。勘误表提交是一种没有实质性代码更改的提交,但有一条重要的提交消息——例如,在自述文件中添加一个空格字符,并使用重要的提交信息提交更改,或者使用git选项——allow empty。它肯定比重定基更容易、更安全,它不会修改真实的历史记录,并且保持了分支树的干净(如果您正在更正最近的提交,那么使用modify也是一个不错的选择,但对于较旧的提交,错误提交可能是一个不错选择)。这种情况很少发生,因此简单地记录错误就足够了。将来,如果您需要在git日志中搜索功能关键字,原始(错误)提交可能不会出现,因为在原始提交中使用了错误的关键字(原始拼写错误)——但是,该关键字将出现在勘误表提交中,然后将您指向具有拼写错误的原始提交。下面是一个示例:
$ git log commit 0c28141c68adae276840f17ccd4766542c33cf1d Author: First Last Date: Wed Aug 8 15:55:52 2018 -0600 Errata commit: This commit has no substantive code change. This commit is provided only to document a correction to a previous commit message. This pertains to commit object e083a7abd8deb5776cb304fa13731a4182a24be1 Original incorrect commit message: Changed background color to red Correction (*change highlighted*): Changed background color to *blue* commit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4 Author: First Last Date: Wed Aug 8 15:43:16 2018 -0600 Some interim commit message commit e083a7abd8deb5776cb304fa13731a4182a24be1 Author: First Last Date: Wed Aug 8 13:31:32 2018 -0600 Changed background color to red
git commit --amend
使用编辑提交消息打字键盘
git push --force
案例1:未推送+最近提交:请参阅
案例2:已推送+最近提交:请参阅
案例3:未推送+旧提交:请参阅
案例4:已推送+旧提交:请参阅
更改历史记录
如果是最近一次提交,您只需执行以下操作:
git commit --amend
这将使用最后一条提交消息打开编辑器,并允许您编辑消息。(如果要删除旧邮件并使用新邮件,可以使用-m。)
推
然后,当你推动时,请这样做:
git push --force-with-lease <repository> <branch>
或者可以使用“+”:
git push <repository> +<branch>
或者您可以使用--force:
git push --force <repository> <branch>
使用这些命令时要小心。
如果其他人将更改推送到同一分支,您可能希望避免破坏这些更改。--forcewithlease选项是最安全的,因为如果有任何上游更改,它将中止(如果不显式指定分支,Git将使用默认的推送设置。如果您的默认推送设置为“匹配”,那么您可以同时销毁多个分支上的更改。
之后拉/取
任何已经拉动的人现在都会收到一条错误消息,他们需要更新(假设他们自己没有做任何更改),方法如下:
git fetch origin
git reset --hard origin/master # Loses local commits
使用重置时要小心--硬。如果对分支进行了更改,这些更改将被销毁。
关于修改历史记录的注释
被破坏的数据实际上只是旧的提交消息,但是--force不知道这一点,并且会很高兴地删除其他数据。因此,将--force想象为“我想销毁数据,我知道哪些数据正在被销毁。”但是,当提交被销毁的数据时,通常可以从reflog中恢复旧的提交—数据实际上是孤立的,而不是被销毁的(尽管孤立的提交会定期删除)。
如果你不认为你在破坏数据,那就远离武力。。。坏事可能会发生。
这就是为什么——租赁的武力更安全。
在控制台中使用以下两个步骤:
git commit --amend -m "new commit message"
然后
git push -f
完成时间:)