我已经提交了git并随后推送。我想更改提交消息。如果我理解正确,这是不可取的,因为在我进行此类更改之前,可能有人从远程存储库中删除了内容。如果我知道没人拉过呢?

有办法做到这一点吗?


当前回答

确保在正确的分支上进行更改

git checkout 

#确保您在正确的分支上进行更改只是为了确定:

git checkout branchname

Then

git commit --amend -m "new message"

然后按下

git push --force

其他回答

更改历史记录

如果是最近一次提交,您只需执行以下操作:

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签出原点/分支名称

如果您已经在分支中,那么最好进行拉入或重入

git pull

or

git -c core.quotepath=false fetch origin --progress --prune

稍后您可以简单地使用

git commit --amend -m "Your message here"

或者如果您想打开文本编辑器,请使用

git commit --amend

如果你有很多评论,我更喜欢使用文本编辑器。您可以使用命令设置首选文本编辑器

git config --global core.editor your_preffered_editor_here

无论如何,当您更改完提交消息后,保存并退出

然后运行

git push --force

你已经完成了

案例1:未推送+最近提交:请参阅

案例2:已推送+最近提交:请参阅

案例3:未推送+旧提交:请参阅

案例4:已推送+旧提交:请参阅

确保在正确的分支上进行更改

git checkout 

#确保您在正确的分支上进行更改只是为了确定:

git checkout branchname

Then

git commit --amend -m "new message"

然后按下

git push --force

我第一次尝试重命名已经推送的大约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合并冲突过程解决了这个问题。

希望这足以让你度过第一个“我以前从未做过一次重新训练,我到底该做什么?”的难关。如果您需要后续步骤的帮助,请给我留言。