我知道这对于很多场景来说都是个坏主意。我正在学习 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
然后在我想要修改并随后运行的提交上将“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
* [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
换句话说,我现在有两组代表完全相同的代码状态的提交。
我想做的就是更改提交消息。
我还想将初始消息从“测试”重命名为“初始版本”。我似乎无法做到这一点,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,所以上述内容并没有真正影响真正的代码存储库。很高兴知道您可以在必要时执行此操作。
现在开始重命名第一个提交。