我知道这对很多场景来说都是个坏主意。我正在学习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
现在我想通过这个图并重命名各种提交,以便它们有意义。
例如:
* | [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
然后将“选择”更改为“编辑”我想要修改并随后运行的提交
git commit --amend -m "the new message"
随着rebase过程的继续。
这种方法的问题在于,在最后一次之后 git rebase --continue
我最终在我正好在的分支上进行了两次新的提交(我要重命名的两个重复)。例如,如果我在HEAD位于“branch_2”时运行了rebase,那么图形可能如下所示:
* [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”重命名为“Initial version”。我似乎无法做到这一点 git commit --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
所以,我的branch_2提交很好地标记了。
现在我想移动branch_2a以便它分支出来 [53d638c] branch 2 commit 2
结帐branch_2a
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
与branch_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,所以上面并没有真正影响真正的代码库。很高兴知道你可以做到这一点,如果你不得不这样做。
现在重命名第一个提交。