您只能以编程方式编辑最后一条提交消息:
git commit --amend -m 'xxxxxxx'
或者以交互方式随机提交:
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项目并不是问题。
发布于 2018-06-01 05:20:21
不能简单地“修改”任意提交的原因是提交是不可变的。当您修改提交时,它实际上会用另一个提交替换当前提交,并将您的分支移动到新的提交。包含旧消息、作者姓名等的提交仍然存在于历史记录中,直到您将其清除:
Before:
master
|
v
A -- B -- C
After:
master
|
v
A -- B -- C'
\
\- C
要模拟“修改”任意提交,您不仅必须重写该提交,还必须重写它之后的整个历史,因为提交包括它的父项作为其不可变数据的一部分:
Before:
master
|
v
A -- B -- C
After:
master
|
v
A -- B' -- C'
\
\- B --- C
为此,您可以在感兴趣的提交上创建一个分支,对其进行修改,并将原始分支之后的提交范围重新设置为新分支的顶端。下面是一个例子,告诉你你想要什么:
Start:
master
|
v
A -- B -- C -- D
New Branch:
master
|
v
A -- B -- C -- D
^
|
temp
Amend:
master
|
v
A -- B -- C -- D
\
\- B'
^
|
temp
Rebase:
A -- B -- C -- D
\
\- B' -- C' -- D'
^ ^
| |
temp master
Cleanup:
A -- B -- C -- D
\
\- B' -- C' -- D'
^
|
master
顺便说一句,当你只修改一次提交时,除了没有显式的临时分支之外,这几乎就是交互式rebase所做的。
发布于 2019-02-05 06:17:51
由于您希望以编程方式进行更改,因此不能选择交互式rebase (git rebase -i)。
无论出于什么原因,编辑旧的提交都将有效地将所有提交重新建立在该提交之上。如果只更改提交消息,则不需要担心合并冲突。
创建一个以目标提交为头的新临时分支,编辑提交消息,将旧分支合并到新分支,然后删除旧临时分支。
在shell脚本中:
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
https://stackoverflow.com/questions/50632722
复制相似问题