【问题标题】:How do I keep the commit message when editing commits via git rebase --interactive?通过 git rebase --interactive 编辑提交时如何保留提交消息?
【发布时间】:2012-06-05 15:48:10
【问题描述】:

我目前正在git rebase --interactive 会话中,我正在编辑提交。我正在按照How can I split up a Git commit buried in history? 的建议进行操作,即我运行git reset HEAD^ 并进行了修改。 现在我希望 rebase 继续,这需要我提交我的更改。我想修改我的旧提交消息,但问题是,如果我运行git commit --amend,我会收到提交的提交消息之前我实际上正在修改的那个 --我当然不想将我的更改合并到那个提交中。

那么,我该如何检索我现在正在处理的提交的旧提交消息?

【问题讨论】:

  • git commit --amend 应该显示你正在编辑的提交的消息(我刚试过),这里一定有问题
  • @CharlesB 您是否按照所述在工作流程中尝试过,即在git rebase --interactivegit reset HEAD^、一些修改以及将文件添加回索引之后?
  • 好的,不确定是不是你想要的,但建议的提交消息设置为HEAD^ 的。这对我来说非常有意义,因为它是您要拆分的那个
  • 您标记为要编辑的提交是您要拆分的提交的子项
  • 我实际上很确定我标记了正确的提交以进行编辑,并使用git reset HEAD^ 重置索引真的取消了我想要进行的更改...(我实际上并没有尝试拆分该提交,但只是修改它引入的一些更改。)

标签: git


【解决方案1】:

为什么要遵循关于提交拆分的说明if you don't want it

您不会重置为HEAD^,这仅适用于拆分提交时。只需在 rebase -i 中标记要编辑的提交,进行更改,commit --amendrebase --continue

【讨论】:

  • 难道你不能真的使用git reset head^,而不是使用git commit --amend,而是使用git commit,然后使用rebase --continue?结果一样,不是吗?
  • 我觉得很难理解,在交互式 rebase 中间怎么能猜到 HEAD^ 是什么?修改提交简单明了
  • 无需猜测,git log --graph --oneline 非常清楚head^ 是什么,即使在rebase -i 期间也是如此。但我同意,简单地修改提交更简单。
【解决方案2】:

我改编了git-commit(1)git-reset(1)中的一些例子:

$ git reset HEAD^
$ git add ...                 # stage the first part of your split
$ git commit -m 'part one'
$ git commit -a -c ORIG_HEAD  # start with the earlier commit message

如果您担心做一些可能会改变ORIG_HEAD 的事情,您可以改为:

$ SAVED=$(git rev-parse HEAD)
$ git reset HEAD^
...
$ git commit -a -c $SAVED   # start with the earlier commit message

【讨论】:

  • 您的答案中使用commit 而没有--amend 标志的部分是正确的。但是,正如 this comment 中的原始发帖人所述,他并没有尝试拆分他的提交,因此进行两个单独的提交并不是正确的解决方案。
  • 另外,在您的回答中,ORIG_HEAD 指向 第一次提交,这是原始发帖人在开始变基之前所在的位置。如果他正在编辑作为 ORIG_HEAD 祖先的提交,则 ORIG_HEAD 将不包含祖先的原始消息,在这种情况下,您的解决方案的这一部分将不正确。
  • 我已经回答了这个问题,我认为这是公平的。原始海报可免费编辑。 :-) 感谢您的更正——ORIG_HEAD 假设git reset HEAD^ 已经发生,这不是我写的。现已修复。
  • 很久以前我就打算再看看这个。我不确定我在 cmets 中向您提到的任何内容是否正确,因此您的回答可能还不错。
【解决方案3】:

我有另一个似乎更简单的答案,虽然没有记录。

$ git reset HEAD^
$ git add ...               # stage the first part of your split
$ git commit -m 'part one'
$ git commit -a -F $(git rev-parse --git-dir)/rebase-merge/message

【讨论】:

  • 再一次,原发帖人不想拆分他的提交,所以进行两次提交不是正确的解决方案。
【解决方案4】:

CharlesB's solution is correct and probably easier 时,原发帖人在他想要编辑的提交之前看到提交消息的原因是因为他使用了--amend 标志git commit,修改上一个提交。

不要使用--amend 提交您的更改,只需使用不带标志的git commit,这不会触及之前的提交。您还可以传入一个选项,以重用您使用 git reset head^ 重置的提交中的提交消息:

git commit --reuse-message=HEAD@{1}

# Or use -C, which is the same thing, but shorter:
git commit -C HEAD@{1}

HEAD@{1} 指向你在git reset head^ 之前的提交。您也可以直接传递该提交的 sha id。

来自the git commit docs

-C <commit>
--reuse-message=<commit>

获取现有的提交对象,并在创建提交时重用日志消息和作者信息(包括时间戳)。

当然,就像我说的,CharlesB 的解决方案更简单,因为如果你不做第一个git reset head^,你可以直接修改并修改你想要修改的提交,你会自动得到git commit --amend 时的先前提交消息,您不必为它传递提交 sha。

【讨论】:

  • 小写的head 真的在这里工作吗?我必须使用完全大写的版本。
  • @milkypostman 这实际上取决于您的操作系统和 shell 环境,msysgit 和 OS X 似乎可以使用小写的 head,但 Unix 环境可能只接受大写的 HEAD。跨度>
  • HEAD 可以在过去几年的所有 git 版本中替换 @,例如HEAD@{1} 变为 @{1}HEAD~ 变为 @~。节省一些输入。
  • @user456814 如果您的文件系统不区分大小写,我怀疑head 可以工作;它可能是指您的仓库中的.git/HEAD 文件。正如我上面提到的,如果你的 git 版本是最近的,你可以使用 @ 而不是 headHEAD
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 2017-11-04
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2011-04-25
  • 2018-01-05
  • 2011-11-27
相关资源
最近更新 更多