kni*_*ttl 17 git branch rebase
是否可以使用git中的所有子分支来重新分支一个分支?
我经常使用分支作为快速/可变标记来标记某些提交.
* master
*
* featureA-finished
*
* origin/master
Run Code Online (Sandbox Code Playgroud)
现在我想rebase -i master进入origin/master,改变/重新提交提交featureA-finished^
之后git rebase -i --onto origin/master origin/master master,我基本上希望历史是:
* master
*
* featureA-finished
* (changed/reworded)
* origin/master
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
* master
*
* (same changeset as featureA-finished)
* (changed/reworded)
| * featureA-finished
|.* (original commit i wanted to edit)
* origin/master
Run Code Online (Sandbox Code Playgroud)
有没有办法绕过它,还是我坚持在新的重新提交的作品上重新创建分支?
看起来这个功能正在慢慢进入 Git。rebase将获得一个选项--rebase-refs,该选项将完全按照我原来的答案要求进行操作。对于建议的补丁系列,请参阅 gmane 上的线程rebase:命令“ref”和选项 --rewrite-{refs,heads,tags}。
2022 年更新:
该选项--update-refs终于登陆了 Git v2.38.0,它现在可以完全执行 12 年前最初问题中所要求的操作:)
此功能已于 8 月份与提交3d8e3dc4fc22fe41f8ee1184f085c600f35ec76f合并。万岁!
根据git的对象模型,如果你只改变提交的元数据(即提交消息)而不是包含在其中的底层数据("树"),那么它的树形散列将保持不变.
除了编辑提交消息之外,您还执行了一个rebase,它将更改历史记录中每个提交的Tree哈希值,因为从中提取的任何更改origin/master都会影响重写历史记录中的文件:这意味着某些文件( blob)你的提交指向已经改变.
所以没有防弹的方法可以做你想要的.
也就是说,编辑提交rebase -i通常不会改变提交的时间戳和作者,因此您可以使用它来唯一地标识在rebase操作之前和之后的提交.
您必须编写一个脚本,在执行rebase之前根据这些"timestamp:author"标识符记录所有分支起始点,然后找到具有相同"timestamp:author"ID的重写提交并对其上的分支进行rebase.
可悲的是,我现在没有时间尝试自己编写这个脚本,所以我只能祝你好运!
编辑:您可以使用以下方式获取作者电子邮件地址和时间戳:
$ git log --graph --all --pretty=format:"%h %ae:%ci"
* 53ca31a robert.meerman@gmail.com:2010-06-16 13:50:12 +0100
* 03dda75 robert.meerman@gmail.com:2010-06-16 13:50:11 +0100
| * a8bb03a robert.meerman@gmail.com:2010-06-16 13:49:46 +0100
| * b93e59d robert.meerman@gmail.com:2010-06-16 13:49:44 +0100
|/
* d4214a2 robert.meerman@gmail.com:2010-06-16 13:49:41 +0100
Run Code Online (Sandbox Code Playgroud)
您可以根据提交哈希获取每个分支的列表:
$ git branch --contains 03dda75
* testbranch
Run Code Online (Sandbox Code Playgroud)
每次提交时注意多个分支,共同的祖先d4214a2属于两个分支!
| 归档时间: |
|
| 查看次数: |
3321 次 |
| 最近记录: |