Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Git中重命名提交消息?_Git - Fatal编程技术网

如何在Git中重命名提交消息?

如何在Git中重命名提交消息?,git,Git,我知道这在很多情况下都是个坏主意。我正在学习Git并进行实验。在此练习中,不会损坏任何代码 我创建了这样一个结构: * [cf0149e] (HEAD, branch_2) more editing * [8fcc106] some edit | | * [59e643e] (branch_2b) branch 2b | / |/ | * [0f4c880] (branch_2_a) branch 2a | / |/ * [a74eb2a] checkout 1 * [9a8dd6a]

我知道这在很多情况下都是个坏主意。我正在学习Git并进行实验。在此练习中,不会损坏任何代码

我创建了这样一个结构:

* [cf0149e] (HEAD, branch_2) more editing
* [8fcc106] some edit
|
|  * [59e643e] (branch_2b) branch 2b
| /
|/
|  * [0f4c880] (branch_2_a) branch 2a
| /
|/
*  [a74eb2a] checkout 1
*  [9a8dd6a] added branch_2 line
|
|
| * [bb903de] (branch_3) branch 3
|/
|
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
* [cf0149e] (HEAD, branch_2) more editing
* [8fcc106] some edit
* [3ff23f0] branch 2 commit 2
* [2f287a1] branch 2 commit 1
|  
|    * [59e643e] (branch_2b) branch 2b
|   /
|  /
| |  * [0f4c880] (branch_2_a) branch 2a
| | /
| |/
| * [a74eb2a] checkout 1
| * [9a8dd6a] added branch_2 line
|/
|
| * [bb903de] (branch_3) branch 3
|/
|
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
现在我想浏览一下这个图,并重命名各种提交,以便它们有意义

例如:

    * | [a74eb2a] checkout 1
    * | [9a8dd6a] added branch_2 line

renamed to:

    * | [a74eb2a] branch 2 commit 2
    * | [9a8dd6a] branch 2 commit 1
请注意:

[cf0149e] (HEAD, branch_2) more editing
[59e643e] (branch_2b) branch 2b
[0f4c880] (branch_2_a) branch 2a
所有分支均来自:

[a74eb2a] checkout 1
我已经试过了

git rebase -i 328454f
然后在我想要修改的提交上将“pick”更改为“edit”,并随后运行

git commit --amend -m "the new message" 
随着重新设定基础过程的继续

这种方法的问题是,在上一次
git-rebase--continue
之后,我在碰巧所在的分支上得到了两个新提交(我想重命名的两个提交的副本)。例如,如果我在HEAD位于“branch_2”时运行rebase,则图形可能如下所示:

* [cf0149e] (HEAD, branch_2) more editing
* [8fcc106] some edit
|
|  * [59e643e] (branch_2b) branch 2b
| /
|/
|  * [0f4c880] (branch_2_a) branch 2a
| /
|/
*  [a74eb2a] checkout 1
*  [9a8dd6a] added branch_2 line
|
|
| * [bb903de] (branch_3) branch 3
|/
|
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
* [cf0149e] (HEAD, branch_2) more editing
* [8fcc106] some edit
* [3ff23f0] branch 2 commit 2
* [2f287a1] branch 2 commit 1
|  
|    * [59e643e] (branch_2b) branch 2b
|   /
|  /
| |  * [0f4c880] (branch_2_a) branch 2a
| | /
| |/
| * [a74eb2a] checkout 1
| * [9a8dd6a] added branch_2 line
|/
|
| * [bb903de] (branch_3) branch 3
|/
|
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
换句话说,我现在有两组表示完全相同代码状态的提交

我只想更改提交消息

我还想将初始消息从“test”重命名为类似“initialversion”的内容。我似乎无法使用git提交--amend-m“Initial version”来完成它,因为如果我签出该提交,我将以无头模式结束

我做错了什么?当然不会那么难

编辑:
这是一种我刚刚尝试过的有效方法。 当然,它改写了历史。因此,除了非常特殊的情况外,这是一个坏主意。 以下是步骤:

签出要修改的分支。 创建修补程序文件:

git format-patch HEAD~x   // Where x is how far back from HEAD you need to patch
编辑修补程序文件以更改提交消息。 现在重置头部

git reset --hard HEAD~x   // Same x as before
应用修补程序:

git am 000*
将使用新的SHA1创建新提交。 如果现在有任何分支需要引用带有更正消息的新提交,则必须使用
git-rebase
将它们移到上面

以我自己的例子来说,在应用补丁程序后,我得出以下结论:

* [7761415] (HEAD, branch_2) branch 2 commit 4
* [286e1b5] branch 2 commit 3
* [53d638c] branch 2 commit 2
* [52f82f7] branch 2 commit 1
| * [bb903de] (branch_3) branch 3
|/
| * [59e643e] (branch_2b) branch 2b
| | * [0f4c880] (branch_2_a) branch 2a
| |/
| * [a74eb2a] checkout 1
| * [9a8dd6a] added branch_2 line
|/
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
因此,我有我的分支_2提交很好的标记。 现在我想移动分支_2a,使其分支出
[53d638c]分支2提交2

结帐分行

git checkout branch_2a
重新定基

git rebase 53d638c
现在我有:

* [fb4d1c5] (HEAD, branch_2a) branch 2a
| * [7761415] (branch_2) branch 2 commit 4
| * [286e1b5] branch 2 commit 3
|/
* [53d638c] branch 2 commit 2
* [52f82f7] branch 2 commit 1
| * [bb903de] (branch_3) branch 3
|/
| * [59e643e] (branch_2b) branch 2b
| * [a74eb2a] checkout 1
| * [9a8dd6a] added branch_2 line
|/
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
分支_2b的相同程序导致:

* [ca9ff6c] (HEAD, branch_2b) branch 2b
| * [fb4d1c5] (branch_2a) branch 2a
|/
| * [7761415] (branch_2) branch 2 commit 4
| * [286e1b5] branch 2 commit 3
|/
* [53d638c] branch 2 commit 2
* [52f82f7] branch 2 commit 1
| * [bb903de] (branch_3) branch 3
|/
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
这正是我想要的。 不要太乱。再说一次,除了非常特殊的情况之外,你不想做什么。在我的例子中,我只是为了学习Git而玩,所以上面的内容并没有真正影响到真正的代码库。很高兴知道,如果有必要,你可以做到这一点


现在开始重命名第一次提交。

您实际上无法更改提交。如果您在任何地方进行最小的单位更改,从电子邮件行中名称的拼写到提交时间戳的精确秒数,您将获得一个新的、不同的提交,其中包含一个新的、不同的SHA1(SHA1是git数据库中每个“对象”的“真实名称”,提交是四种对象类型之一)

提交的一个不可变部分是其“父提交”,它从最近的提交向后构建链到最早的提交

因此,
git-rebase-i
所做的就是创建一个新的提交链,链中的每个提交都具有与原始提交相同的内容/效果加上或减去您在交互过程中所做的任何更改。完成后,它将从旧提交链的末端移除标签(粘贴说明,原样),并将其粘贴到新提交链的末端。它首先制作要修改/重定基准的最旧提交的副本。这一个有重基父级(可以是与原始链中相同的父级提交,也可以是不同的父级:无论哪种方式都可以,因为它是新提交)。然后它复制旧链中的下一个,但指向新链。它一直重复到旧链条的末端

这就是为什么您的所有其他分支现在都独立于重定基础的分支。它们必须是,因为它们使用旧的提交ID。如果您想让它们从新的重设基础的分支分支分支分支分支出来,您必须进入其中每一个分支并重设基础

有一个强大的瑞士陆军链锯ish命令,
git filter branch
,您可以使用它来执行一系列非常大的“重做大量提交,使所有(大部分)与原始提交内容相同的新提交”,类似于类固醇上的
git-rebase
,您可以用于此目的。(使用
--all
运行它以影响所有分支。)当然,由于它实际上会重做所有提交,因此最终的回购基本上与原始回购无关

重写初始提交很困难(并非不可能),因为它没有父级,所以常规的
重基
无法完成。1(
过滤器分支
可以。)因为这些更改了SHA1 ID,并且克隆了您的回购协议的任何人都在使用/依赖于这些ID,所以这通常是一个功能,您不能像这样处理提交。当您知道没有其他人依赖于某个特定的提交集时,您可以随心所欲地重新设置基础,但您不会返回到初始提交,因为它将位于回购的共享部分。这是相当罕见的(当然不是“永远”),整个事情回到“初始提交”都是你自己的私人物品


1自从我写这篇文章以来,
git-rebase
已经学会了像初始提交一样复制根提交。2使用传统的
git-rebase
语法,您必须命名根的父提交,当然没有父提交(这就是为什么它在图中成为“根”)。因此,
rebase
使用
--root
作为参数来覆盖这种情况

2有可能有多个根;例如,使用
git checkout--orphan
,然后使用
git commit
,创建一个新的根提交。虽然git源代码本身保存在带有multiple的git repo中,但拥有这些代码有点不寻常