如何在git中使现有分支成为孤儿

时间:2015-05-17 05:48:56

标签: git branch git-branch

有没有办法在git中创建现有分支孤儿?

git checkout --orphan似乎只是创建一个新的孤儿?

4 个答案:

答案 0 :(得分:6)

我是否理解您,您希望孤立分支已经拥有提交历史记录?如果是这样,这是一个解决方案。

首先,你需要选择一个提交来启动新分支。在我的示例中,这将是HEAD~2sha1=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 Volynkinanswer涉及在新的孤儿分支中至少进行一次提交。
这是因为第一次提交的git cherry-pick df931da..master 没有会导致“Can't cherry-pick into empty head”。

但不再是,git 2.9.X / 2.10(2016年第3季度)。

commit 0f974e2Michael 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

相关问题