Git 如何重新设置(压缩)上次提交到主控的基础并更改提交消息

Git 如何重新设置(压缩)上次提交到主控的基础并更改提交消息,git,git-interactive-rebase,Git,Git Interactive Rebase,在GitI,存在以下情况: o "ok" b6ca869 [my_branch*] | o "ok" 479d27c | o "ok" c80fad5 | o "ok" 8f7fe87 | o "master commit message" [master][remotes/origin/master] 我想压缩这4个“ok”承诺,并进一步更改消息 o "my_branch commit message" [my_branch*] | o "master commit message

在GitI,存在以下情况:

o "ok" b6ca869   [my_branch*]
|
o "ok" 479d27c
|
o "ok" c80fad5
|
o "ok" 8f7fe87
|
o "master commit message" [master][remotes/origin/master]
我想压缩这4个“ok”承诺,并进一步更改消息

o "my_branch commit message"    [my_branch*]
|
o "master commit message" [master][remotes/origin/master]
所以我要做的是

git rebase --interactive master
GNU nano(我在Ubuntu上)编辑器打开了

GNU nano 2.2.2             File: /home/.git/modules/src/android/frameworks/base/rebase-merge/git-rebase-todo                                

pick 8f7fe87 ok
pick c80fad5 ok
pick 479d27c ok
pick b6ca869 ok

# Rebase aeedb8f..b6ca869 onto aeedb8f
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

据我所知,我必须编辑此文件,但实际上我不知道如何编辑。

您需要将最后3个提交压缩到第一个提交,因此(
s
代表
squash
):


保存然后退出,一个新的缓冲区将弹出所有提交消息。只需在末尾使用/修改您想要的提交,保存并退出。

将三个较低的
拾取
s更改为
挤压
,然后保存并退出。将弹出另一个编辑器,允许您更改提交消息


如果出于任何原因要撤消重基,请查看
git reflog
。它将向您显示重基之前状态的sha1,您可以通过执行
git reset--hard sha1
返回到该状态。还有一个引用reflog的快捷方式,
git reset--hard@{1}
您可以将最后4次提交挤在一起;因为你在当地犯了罪。为此,请将文件编辑为:

pick 8f7fe87 ok
s c80fad5 ok
s 479d27c ok
s b6ca869 ok
之后,您将能够更改(组合)提交消息

但是这不会在最后一次使用“主提交消息”提交时挤压它们。问题是您的“主提交”已推送到服务器;因此,您不能简单地将提交附加到已推送到服务器的提交


该提交具有特定的“散列”代码;而且由于其他用户可能已经提取了该代码;git不允许(或不容易)附加到已经推送到服务器的提交。如果你想这样做,你可以看到这个

你是说
git reset--hard HEAD@{1}
?这是两件不同的事情,但都能工作。“@{1}”引用当前分支的上一个状态。(参见git rev parse(1))非常完美,谢谢。这个答案是第一个,所以我会接受它。
pick 8f7fe87 ok
s c80fad5 ok
s 479d27c ok
s b6ca869 ok