在Git中改变项目中的开发工作流程
我有一个Git仓库,我已经开始在master分支上开发,现在我相信主人不应该是一个长时间运行的分支。作为其他人,我认为主分支总是拥有稳定的产品。在Git中改变项目中的开发工作流程
所以,我想打开一个新的分支名为开发和该分支将是一个长期运行的开发分支,但我不知道什么是最好的方法来切换这里。我目前的解决办法是这样的:
开拓新的分支,并把它推到GitHub上:
git checkout -b develop
git push origin develop
然后回到主分支和停止跟踪的所有文件,除了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
你的想法是什么?
你的问题是名称为“大师”。
分支是分支。没有一个比其他任何一个都更重要。这个名字实际上只是一个标签 - 一个标识当前HEAD的字符串,并且随着HEAD在其上的提交而出现颠簸。但是分支的“主”才是重要的,因为这是git给它在项目中创建的第一个分支的名字。但这是只是一个名字。让我们把你当前的主分支给它一个新的名字。既然你称之为无关紧要,我们选择“史蒂夫”。
git branch -m master steve
太好了。现在你没有主分支!但你有一个历史悠久的老史蒂夫分支。这是值得的,但是因为你现在正在历史的沙滩上画一条线,所以你可能永远不会回头看看它。
所以后来检查出你的Dev分支,它的工作,等等。而当它是稳定的(不管它在您的特定情况下,意味着),自己创建一个新的主
git checkout -b master
哈哈!在主分支上的第一次提交是稳定的,并且您可以确保所有将来的提交都是如此! (顺便说一句,你会希望在所有从开发到主人的合并中都不需要ff,以便让那些中间潜在的非稳定提交脱离你闪亮的新“主”分支。)
+1;这可能是更好的(更耐心)解释事物的方式。 @tugberk作为一个方面说明,如果它是“不符合历史的”不稳定的代码,你想保持在主控之外(即主控方的每个提交都应该稳定),这是不可能的。 Master(包括'git checkout -b master')将包含您在'develop'(或'steve')上所做的所有开发承诺。在这个意义上,你不能把“不稳定”的东西放在主人之外。分支机构在Git中不会以这种方式工作。 – meagar 2012-04-04 12:28:36
@maegar - 嘘!我试图让他没有注意到! ;-) – 2012-04-04 12:33:58
这并不是Git中分支机构的工作原理。没有理由从master
中删除所有文件,事实上,这将使master
完全无用于以后的合并。您将迫使您的master
和develop
分支以基本方式发散。
只需结账您的develop
分行,并在那里开展您的开发工作。当它被认为是“稳定的”时,签出master
和git merge develop
将您的稳定代码放入主文件中。然后推两个分支。
你也应该修改git push origin develop
包括-u
为您develop
分支自动--set-upstream
,让您推拉变化:
git push -u origin develop
作为附录Dan Ray's answer,如果你真的想追溯使master
为空,直到你git merge --no-ff develop
,你需要摧毁主人,并且(现在或者当你准备好合并时)重新创建它以指向你的回购中最早的提交。然后master
和develop
将在尽可能早的时刻有分歧,他们可以合并给予错觉,以为“主人总是稳定”:
- 结帐您
develop
分支:git checkout -b develop
- 删除
master
:git branch -d master
- 通过
git log
- 找到您存储库中最早的提交:
git branch master <early commit id>
- 最终合并到主:
git checkout master && git merge --no-ff develop
现在你的主人分公司“总是”一直空着,直到你的开发代码是在合并
这并不能解决我的主要问题。我不想要稳定的代码在我的主分支。我目前的代码在master中是不稳定的,不稳定,没有为开发做好准备。我不确定你在这里之后能得到什么。 – tugberk 2012-04-04 12:04:24
这没有意义。在早期开发过程中,在主程序中存在不稳定的代码时没有任何错误*。只要不要在那里做你的开发工作,然后,当你准备好时,把你的稳定的东西合并回去。去掉所有的文件没有任何意义。您最好只是彻底删除'master'分支,然后在您认为代码“稳定”时重新创建它。 – meagar 2012-04-04 12:06:41
这对你来说可能没有意义,但对我来说确实很好。我相信主分支始终拥有稳定的代码,我在此之后。 – tugberk 2012-04-04 12:08:40
听起来像你想要做的是从master
和this answer创建新的develop
分支的组合,用于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
创建一个从master
分支新develop
分支:
$ 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
的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
:
$ git checkout master
$ git merge --no-ff develop
$ git log --oneline --graph --decorate --all
* e8a5c32 (HEAD, master) Merge branch 'develop'
|\
| * 3d589b6 (develop) D
| * f6a83da C
| * 6c8bdc9 B
| * f8dd99f A
| * 79706b0 initial
|/
* 8b9881c new initial
这没有任何意义。你能否解释一下你试图完成的任务是将你的'master'分支清空?这与使其稳定无关,只是使它变得空虚无用。我也很困惑你的意思是“长期运行”的分支。主人应该是*最长的*运行分支。按照惯例,它应该是整个项目历史中始终存在的唯一分支。 – meagar 2012-04-04 12:01:10
@meagar我想我解释了我的后面:*主人不应该是一个长期运行的分支。作为其他人,我认为主分支总是持有稳定的产品。*。通过*长期运行*,我的意思是开发分支。 – tugberk 2012-04-04 12:06:52
* master *分支可以并且应该保持稳定的产品,但这意味着(正如我所说)它应该是最长的运行分支*。它应该始终存在,而您的开发和功能分支合并并分叉并消失。 – meagar 2012-04-04 12:08:43