English 中文(简体)
如何在 Git 中重命名信件的签名?
原标题:How to rename commit messages in Git?
  • 时间:2012-05-25 05:10:45
  •  标签:
  • 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] 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" 

随着重设基准进程的继续。

这种方法的问题是,在上次 < code> git rebase -- continue 之后,我在我碰巧所在的分支上做了两个新的承诺(我要重命名的两个的复制件)。例如,在HEAD在“ branch_2” 时我运行了重新基准时,图表可能看起来是这样的:

* [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

换句话说,我现在有两套承诺 代表完全相同的代码状态。

我只想改变承诺信息

我还要将初始信息从“ 测试” 重新命名为“ 初始版本 ” 。 我似乎无法使用 < code> git committee -- amend - m " 初始版本" 来进行它, 因为如果我检查了该承诺, 我最终会以无头模式结束 。

我做错什么了?

EDIT:
Here s an approach I just tried that works. Of course, it re-writes history. So, outside of very special cases it is a bad idea. Here are the steps:

Checkout the branch to be modified. Create patch files:

git format-patch HEAD~x   // Where x is how far back from HEAD you need to patch

Edit the patch files to change the commit message. Now reset the head.

git reset --hard HEAD~x   // Same x as before

应用补丁 :

git am 000*

New commits will be created with new SHA1 s. If any branches now need to reference the new commits with the corrected messages you have to use git rebase to move them over.

以我个人为例,在应用补丁程序后,

* [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

So, I have my branch_2 commits nicely labeled. Now I want to move branch_2a so that it branches out of [53d638c] branch 2 commit 2

取出分行_ 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

与分支_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

Which is exactly what I was looking for. Not too messy. Again, not something you d want to do outside of very special cases. In my case I am just playing to learn Git, so the above isn t really affecting a real code repository. It s nice to know that you can do this if you have to.

现在开始重命名第一个承诺 。

最佳回答

您实际上无法更改一个承诺 。 如果您在任何地方做出最小的单位更改, 从电子邮件行的名称拼写到正第二个承诺时间戳, 您就会得到一个新的、 不同的承诺 。 新的、 不同的 SHA1 ( SHA1 是 Git 数据库中每个“ 对象 ” 的“ 真实名称 ”, 并承诺是四种对象之一 ) 。

其中不可改变的一部份是它的“父母承诺”, 它把从最近承诺到最老承诺的链条往后拉。

因此, git rebase -i does 是一个 new 承诺链,每个在链条中的承诺都有与原始承诺加减任何变化相同的内容/效果。当全部完成时,它会从旧承诺链的尾端移除标签(粘贴笔,原为粘贴笔),并在新承诺链的尾端粘贴标签。它从复制最老承诺的拷贝开始修改/重新基础。它有重生母(可以是原承诺链中的同一母承诺,也可以是不同的父母:要么是确定,因为它是一个 new 承诺)。 然后它会复制旧承诺链中的下一个标签,但指向新的链。 它会一直重复到旧链的尾端 。

这就是为什么你的其他分支现在都独立于您重设的分支。 它们“ 有/ 有 ”, 因为它们使用旧的 Indent ID 。 如果您想要它们从您新的重设分支中分支分支, 您必须进入其中的每一个分支并重新标定它们 。

有一种强大的瑞士-解放军链锯-ish 命令, < code> git 过滤- branch , 您可以使用它来做一系列非常庞大的“ 重新做出许多承诺, 使所有新的承诺( 大部分) 内容与原始内容相同 ”, 类似于“ code> git rebase - all 来运行它, 影响所有分支 。 ) 当然, 由于它确实重做了全部承诺, 你最终会收到一个基本上与原始的重新承诺无关的回复。

重写初始承诺( 并非不可能) 是很困难的, 因为它没有父/ 父, 所以普通的 < code> rebase 仅仅是不做 。 1 ( filter- branch 可做 ) 。 由于这些更改 SHA1 ID, 以及克隆了您的重信的人正在使用 / 依此而定, 它通常是一个特点, 你无法与这样的承诺混为一谈。 当你知道其他人没有取决于某些特定的承诺, 那么您可以全部选择 rebase , 但是您不会回到初始承诺, 因为那将会在重编的共享部分 。 几乎很少( 当然不是“ 永远” ), 回到“ 初始承诺” 的整个过程都是你自己的私事 。


1 Since I wrote this, >git rebase 已经学会了像初始承诺一样复制根承诺。 2 使用常规 git rebase 语法,您必须命名根的父责任,而在那里当然 没有父责任(在图形中将它变成“root”)。因此, rebase 使用 -root 作为覆盖此案例的理由。

2 有可能有多个根; 例如, 使用 git check out -- orphan (code), 之后是 git enture , 来创建新的根承诺。 虽然 git 源本身被保存在带多个根的 git repo 中, 但拥有这些根承诺有点不寻常 。

问题回答

如果该承诺没有被推动, 其信息可以被修改第一个承诺的第二个承诺更改 : git 承诺 - amend - m “ new message ”





相关问题
git confusion - cloning a repo is returning a past version

Im having some confusion with my git usage. I cloned a repo from one comp to the other, and the new clone is the state of the original that was active some time ago. So its cloning a past version. ...

Appropriate strategy for tagging and hotfixing with git

I was wondering if the strategy I m using for tagging and hotfixing tags (which then I use for deploying rails applications) with git is appropriate. For tagging I just tag a commit of the master ...

Tips on upgrading CVS to git/hg?

We still use CVS, I use git and hg for my personal use though I m still a novice at both, but I realize they re much more modern and better, faster, distributed, etc. It s just everyone is so ...

Using Git in a TFS shop

Using Git at home has spoiled me - I now find using TFS at work to be a bit of a drag and want to explore the possibility of using Git locally and syncing somehow with TFS. I figure there are a few ...