将整个开发分支重新定位到新的主分支

时间:2015-07-11 02:53:39

标签: git version-control git-rebase git-flow git-rewrite-history

我正在使用一个理论上应该遵循Gitflow工作流的存储库(参见Vincent Driessen的A successful git branching model)。但是,存储库上的初始提交是在develop分支上进行的,并且没有master分支可供查看。它即将发布时间,我需要创建一个master分支,它反映了项目的生产就绪状态,该状态应该从一开始就存在。请记住,develop分支有多个功能分支。存储库完全是本地存储库,尚未推送。

我的想法是创建一个孤儿分支master并将develop分支重新绑定到它上面,但我不知道我该怎么做。

那么,我如何创建master分支,就好像它是从一开始创建的那样?

更新:在我的情况下,develop上的第一次提交不是应该被认为适合生产的提交,因此将此作为初始master提交将使用是不明智的。项目处于此状态的原因是因为它在决定使用Git时最初没有使用VCS。

3 个答案:

答案 0 :(得分:3)

经过一番摆弄,这就是我想出来的。这是VonC's answer的简单手动方法。

重新定位整个发展部门

假设您有一个分支develop,其中包含您的存储库的初始提交,并且您想要重写历史记录,以便master分支包含新的初始值提交。

首先,如果develop分支上的初始提交适合作为新master分支的初始提交,那么您可以在那里创建master分支,并且#&# 39;完成:

$ git branch master <sha1-of-initial-commit-on-develop>

如果您没有这种奢侈品,那么您需要创建一个新的空提交,作为master的初始提交。

# Create the new master branch
$ git checkout --orphan master
# Clear the working directory (we want the initial commit to be empty)
$ git rm -rf .
# Create the initial commit on master
$ git commit --allow-empty -m "Initial commit"
# Rebase the entire develop branch onto the new master branch
$ git rebase --onto master --root develop

如果develop分支机构有任何分支机构,那么它们将会被大概搞砸了#34;。这是因为那些分支(我们称之为主题分支)仍然指向旧的develop分支,然后再进行重新分配。如果您没有develop分支的分支,那么您就完成了。

每个主题分支都必须重新定位到新的develop分支。为此,我们将按照其他问题(Git: How to rebase to a specific commit?)中列出的步骤进行操作。对于每个主题分支,请按照以下步骤操作。

<common-ancestor>替换为新创建的develop分支上的提交的sha1,其中主题分支应该分支。

$ git branch temp <common-ancestor>
$ git checkout <topic-branch>
$ git rebase temp
$ git branch -d temp

那就是它!请记住,您不应该在与其他人合作的分支机构上进行折扣。

答案 1 :(得分:2)

理想情况下,您需要按adding a commit at the start重写dev的完整历史记录:

# remember the first dev commit (before rebase)
git branch tmp  $(git rev-list --max-parents=0 HEAD)

# first you need a new empty branch
git checkout --orphan master
git rm -rf .

# then you apply the same steps
git commit --allow-empty -m 'root commit master'
git rebase --preserve-merges --onto master --root dev

但是,如“Rebasing a branch including all its children”所示,这会使所有feature个分支指向旧的dev来源(在rebase之前)。

git branch --contains tmp | \
xargs -n 1 \
git rebase --committer-date-is-author-date --preserve-merges --onto master tmp^

即:可以从旧的dev第一次提交(tmp)访问的任何分支都需要在master上进行重新定位:任何已在主服务器上重新设置的常见提交都不会重复。这将重新创建来自feature分支,来自新(重新定位)dev分支的提交。

原始答案:

您可以简单地从master分支的第一次提交创建dev分支。

git branch $(git rev-list --max-parents=0 HEAD) master

(参见“How to reference the initial commit?”)

这意味着在dev上完成的第一次提交也被视为master的一部分,这不完全准确,但比重写整个的历史更容易dev

答案 2 :(得分:0)

来自Git filter-branch documentation

  

要将提交(通常位于另一个历史记录的顶端)设置为当前初始提交的父级,以便将其他历史记录粘贴到当前历史记录之后:

git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD
  

(如果父字符串为空 - 在我们处理初始提交时发生 - 将graftcommit添加为父级)。请注意,这假设具有单个根的历史记录(即,没有共同祖先发生的合并)。