在Git中更改项目中间的开发工作流程

时间:2012-04-04 11:52:20

标签: git github

我有一个Git存储库,我已经开始在 master 分支上开发了,现在我相信master不应该是一个长期运行的分支。和其他人一样,我认为master branch总是拥有稳定的产品。

所以,我想打开一个名为 develop 的新分支,该分支将是一个长期运行的开发分支,但我不确定在这里切换的最佳方法是什么。我目前的解决方案是:

打开新分支并将其推送到GitHub:

git checkout -b develop
git push origin develop

然后返回master分支并停止跟踪除 README.md 之外的所有文件并将其推送到远程存储库(在本例中为GitHub):

git checkout master
git rm . --cached -r
git add README.md
git commit -m "cleaned up the master branch"
git push origin master

你有什么想法?

3 个答案:

答案 0 :(得分:2)

您的问题出在NAME“master”上。

分支是分支。它们中没有一个比任何其他都重要。这个名称实际上只是一个标签 - 一个标识当前HEAD的字符串,并且在HEAD被提交的顶部突然出现。但是分支的“主” - 唯一重要的是因为git这个名称给出了它在项目中创建的第一个分支。但那只是只是一个名字。让我们把你当前的主分支给它一个新的名字。因为你所谓的无关紧要,让我们选择“史蒂夫”。

git branch -m master steve

大。现在你没有主分支了!但是你有一个古老的史蒂夫分支,其中有历史作品。这是值得拥有的,但是因为你现在正在历史上画出一条线,你可能永远不会再陷入其中。

然后检查你的开发分支,继续工作等等。当它稳定时(无论你的具体情况如何),创建一个新主人

git checkout -b master
哈哈!该主分支的第一次提交是稳定的,您可以确保所有未来的提交也是如此! (顺便说一下,你需要 - 从开发到主服务器的所有合并中的no-ff,以保持那些中间可能不稳定的提交从你闪亮的新“主”分支中。)

答案 1 :(得分:1)

这根本不是分支在Git中如何运作的。没有理由从master中删除所有文件,实际上,这会使master完全无用,以便以后合并。您将迫使masterdevelop分支机构以基本方式发生分歧。

只需检查您的develop分支机构,然后在那里进行开发工作。当它被视为“稳定”时,请结帐mastergit merge develop以使您的稳定代码成为主人。然后推两个分支。

您还应修改git push origin develop以包含-u自动--set-upstream develop分支,以便您推送和撤消更改:

git push -u origin develop

作为Dan Ray's answer的附录,如果你真的想追溯master使git merge --no-ff develop空,直到你master,你需要摧毁主人,(现在或当你准备好时) merge)重新创建它以指向repo中最早的提交。然后developdevelop会在最早的时刻发生分歧,并且它们可以合并,从而产生“主人总是稳定”的错觉:

  • 结帐您的git checkout -b develop分行:master
  • 删除git branch -d mastergit log
  • 通过git branch master <early commit id>
  • 在您的存储库中找到最早的提交
  • 在早期的时间点重新创建主人:git checkout master && git merge --no-ff develop
  • 最终合并为主人:{{1}}

现在,您的主分支“始终”为空,直到您的开发代码合并为止。

答案 2 :(得分:0)

听起来您要做的就是为develop创建新的master分支,为this answer创建How to insert a commit as the first, shifting all the others?

假设您有以下历史记录:

$ git --version
git version 1.7.9.rc2.1.g69204
$ git log --oneline --decorate --all
3047e68 (HEAD, master) D
d5b5fdb C
4a26775 B
c53013b A
2a984b8 initial

develop分支创建一个新的master分支:

$ git branch develop
$ git log --oneline --decorate --all
3047e68 (HEAD, master, develop) D
d5b5fdb C
4a26775 B
c53013b A
2a984b8 initial

创建一个新的初始提交并按照您的喜好进行设置:

$ git symbolic-ref HEAD refs/heads/newroot
$ git rm --cached -r .
$ git add README.md
$ git clean -f -d
$ git commit -m 'new initial'
$ git log --oneline --decorate --all
8b9881c (HEAD, newroot) new initial
3047e68 (master, develop) D
d5b5fdb C
4a26775 B
c53013b A
2a984b8 initial

现在使newroot develop分支和新的初始提交master分支:

$ git rebase --onto newroot newroot develop
$ git branch -d newroot
$ git log --oneline --decorate --all
3d589b6 (HEAD, develop) D
f6a83da C
6c8bdc9 B
f8dd99f A
79706b0 initial
8b9881c new initial
3047e68 (master) D
d5b5fdb C
4a26775 B
c53013b A
2a984b8 initial

现在,在您确定要删除现有的master历史记录并使new initial提交master的{​​{1}}之后:

HEAD

$ git reset --hard 8b9881c HEAD is now at 8b9881c new initial $ git log --oneline --decorate --all 3d589b6 (develop) D f6a83da C 6c8bdc9 B f8dd99f A 79706b0 initial 8b9881c (HEAD, master) new initial 分支稳定并准备好develop时:

master