有没有办法在git中创建现有分支孤儿?
git checkout --orphan
似乎只是创建一个新的孤儿?
答案 0 :(得分:6)
我是否理解您,您希望孤立分支已经拥有提交历史记录?如果是这样,这是一个解决方案。
首先,你需要选择一个提交来启动新分支。在我的示例中,这将是HEAD~2
,sha1=df931da
。
说,我们有一个简单的回购。 git log --oneline --graph --decorate
显示以下内容:
* 4f14671 (HEAD, master) 4
* 1daf6ba 3
* df931da 2
* 410711d 1
现在,行动!
# Move to the point where we want new branch to start.
➜ gitorphan git:(master) git checkout HEAD~2
此处以及➜ gitorphan git:(master)
部分是zsh的提示,而不是命令的一部分。
# make an orphan branch
➜ gitorphan git:(df931da) git checkout --orphan orphanbranch
Switched to a new branch 'orphanbranch'
# first commit in it
➜ gitorphan git:(orphanbranch) ✗ git commit -m'first commit in orphan'
[orphanbranch (root-commit) f0d071a] first commit in orphan
2 files changed, 2 insertions(+)
create mode 100644 1
create mode 100644 2
# Check that this is realy an orphan branch
➜ gitorphan git:(orphanbranch) git checkout HEAD^
error: pathspec 'HEAD^' did not match any file(s) known to git.
# Now cherry-pick from previous branch a range of commits
➜ gitorphan git:(orphanbranch) git cherry-pick df931da..master
[orphanbranch 7387de1] 3
1 file changed, 1 insertion(+)
create mode 100644 3
[orphanbranch 4d8cc9d] 4
1 file changed, 1 insertion(+)
create mode 100644 4
现在,分支orphanbranch
在一次提交中有一个df931da工作树的快照,并且进一步提交就像它们在主服务器中一样。
➜ gitorphan git:(orphanbranch) git log --oneline
4d8cc9d 4
7387de1 3
f0d071a first commit in orphan
答案 1 :(得分:3)
这是一种简单的方法
git branch -m master old_master
git checkout --orphan master
-m =将分支移动到新名称
结帐 - 将新主人结帐为孤儿
答案 2 :(得分:3)
Nick Volynkin的answer涉及在新的孤儿分支中至少进行一次提交。
这是因为第一次提交的git cherry-pick df931da..master
没有会导致“Can't cherry-pick into empty head
”。
但不再是,git 2.9.X / 2.10(2016年第3季度)。
commit 0f974e2见Michael J Gruber (mjg
)(2016年6月6日)
(由Junio C Hamano -- gitster
--于commit 25227f0合并,2016年7月6日)
cherry-pick
:允许挑选未出生的分支“
git cherry-pick A
”在未出生的分支上工作,但“git cherry-pick A..B
”没有。
这意味着解决方案变为:
# make an orphan branch
➜ gitorphan git:(df931da) git checkout --orphan orphanbranch
Switched to a new branch 'orphanbranch'
# Now cherry-pick from previous branch a range of commits
➜ gitorphan git:(orphanbranch) git cherry-pick df931da..master
在采摘樱桃之前,不需要先提交。
答案 3 :(得分:2)
让我们说你已经结帐了一个新的分支,并且做了两次提交,如下所示。 13hh93是结帐的校验和,54hdsf是最新提交的校验和:
master => new_branch_1(13hh93)=> new_branch_2 => new_branch_3(54hdsf)
然后按以下步骤操作。第1步进入结账的开始。第2步从中创建一个孤儿分支。第3步将分支的其余部分应用于您的孤儿分支。
1)git checkout 13hh93 2)git checkout new_orphan_branch --orphan 3)git diff 13hh93 54hdsf | git apply