首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何以编程方式编辑旧的git提交消息?

如何以编程方式编辑旧的git提交消息?
EN

Stack Overflow用户
提问于 2018-06-01 05:01:00
回答 2查看 11.9K关注 0票数 10

您只能以编程方式编辑最后一条提交消息:

代码语言:javascript
复制
git commit --amend -m 'xxxxxxx'

或者以交互方式随机提交:

代码语言:javascript
复制
git rebase -i HEAD~n
# Vim opens up, select the commit you want to modify, and change the word "pick" for "edit"
git commit --amend -m "Changing an old commit message!"
git rebase --continue

如何将两者结合起来?我希望以编程方式更改消息,但要更改为先前提交的消息,而不仅仅是最后提交的消息。

我想要修改的提交已经被推送到git服务器,但是让其他人重新同步git项目并不是问题。

EN

回答 2

Stack Overflow用户

发布于 2018-06-01 05:20:21

不能简单地“修改”任意提交的原因是提交是不可变的。当您修改提交时,它实际上会用另一个提交替换当前提交,并将您的分支移动到新的提交。包含旧消息、作者姓名等的提交仍然存在于历史记录中,直到您将其清除:

代码语言:javascript
复制
Before:

        master
          |
          v
A -- B -- C

代码语言:javascript
复制
After:

        master
          |
          v
A -- B -- C'
      \
       \- C

要模拟“修改”任意提交,您不仅必须重写该提交,还必须重写它之后的整个历史,因为提交包括它的父项作为其不可变数据的一部分:

代码语言:javascript
复制
Before:

        master
          |
          v
A -- B -- C

代码语言:javascript
复制
After:

         master
           |
           v
A -- B' -- C'
 \ 
  \- B --- C

为此,您可以在感兴趣的提交上创建一个分支,对其进行修改,并将原始分支之后的提交范围重新设置为新分支的顶端。下面是一个例子,告诉你你想要什么:

代码语言:javascript
复制
Start:

             master
               |
               v
A -- B -- C -- D

代码语言:javascript
复制
New Branch:

             master
               |
               v
A -- B -- C -- D
     ^
     |
    temp

代码语言:javascript
复制
Amend:

             master
               |
               v
A -- B -- C -- D
 \
  \- B'
     ^
     |
    temp

代码语言:javascript
复制
Rebase:

A -- B  -- C  -- D
 \
  \- B' -- C' -- D'
     ^           ^
     |           |
    temp       master

代码语言:javascript
复制
Cleanup:

A -- B  -- C  -- D
 \
  \- B' -- C' -- D'
                 ^
                 |
               master

顺便说一句,当你只修改一次提交时,除了没有显式的临时分支之外,这几乎就是交互式rebase所做的。

票数 10
EN

Stack Overflow用户

发布于 2019-02-05 06:17:51

由于您希望以编程方式进行更改,因此不能选择交互式rebase (git rebase -i)。

无论出于什么原因,编辑旧的提交都将有效地将所有提交重新建立在该提交之上。如果只更改提交消息,则不需要担心合并冲突。

创建一个以目标提交为头的新临时分支,编辑提交消息,将旧分支合并到新分支,然后删除旧临时分支。

在shell脚本中:

代码语言:javascript
复制
CURBRANCH=`git rev-parse --abbrev-ref HEAD`
TMPBRANCH=tmp$$
git checkout $SHA -b $TMPBRANCH
MSG=`tempfile`
git log --format=%B -n 1 HEAD > $MSG
... edit the $MSG file
git commit --amend -F $MSG
SHA=`git rev-list -n 1 HEAD`   # Commit has change, so SHA has also changed
rm $MSG
git rebase --onto $TMPBRANCH HEAD $CURBRANCH
git branch -d $TMPBRANCH
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50632722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档