我正在使用一个理论上应该遵循Gitflow工作流的存储库(参见Vincent Driessen的A successful git branching model)。但是,存储库上的初始提交是在develop
分支上进行的,并且没有master
分支可供查看。它即将发布时间,我需要创建一个master
分支,它反映了项目的生产就绪状态,该状态应该从一开始就存在。请记住,develop
分支有多个功能分支。存储库完全是本地存储库,尚未推送。
我的想法是创建一个孤儿分支master
并将develop
分支重新绑定到它上面,但我不知道我该怎么做。
那么,我如何创建master
分支,就好像它是从一开始创建的那样?
更新:在我的情况下,develop
上的第一次提交不是应该被认为适合生产的提交,因此将此作为初始master
提交将使用是不明智的。项目处于此状态的原因是因为它在决定使用Git时最初没有使用VCS。
答案 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添加为父级)。请注意,这假设具有单个根的历史记录(即,没有共同祖先发生的合并)。