我知道在很多情况下这是一个不好的想法。我正在学习Git并进行实验。在这个练习中,没有代码会被损坏。
我创建了以下这样的结构:
现在我想浏览这个图表并重新命名各个提交,使它们更有意义。例如:
请注意:
随着rebase过程的继续,这种方法存在的问题是,在最后一个
换句话说,我现在有两组提交记录,它们代表完全相同的代码状态。
我想做的只是更改提交消息。
我还想将最初的消息从“test”重命名为类似于“初始版本”的东西。如果我使用
我做错了什么?这肯定不可能很难。
编辑:
这里是我刚刚尝试过的一种方法,它有效。当然,它会重写历史记录。因此,在非常特殊的情况下,它是一个坏主意。以下是步骤: 检出要修改的分支。 创建补丁文件:
现在我有:
同样的步骤用于branch_2b会得到如下结果:
我创建了以下这样的结构:
* [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"
随着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”重命名为类似于“初始版本”的东西。如果我使用
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而尝试,因此上述内容并没有影响真实的代码仓库。如果必要的话,这样做还是很有用的。
现在我们来重命名第一个提交。