0

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

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

打开新分支并将其推送到 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

你怎么认为?

4

3 回答 3

2

您的问题与名称“master”有关。

一个分支就是一个分支。它们中没有一个比其他任何一个都更重要。该名称实际上只是一个标签——一个标识当前 HEAD 的字符串,并且随着 HEAD 的提交而颠簸。但是一个分支的“master”-ness 很重要,因为这是 git 赋予它在项目中创建的第一个分支的名称。但这只是一个名字。让我们取你当前的 master 分支并给它一个新的名字。既然你所说的无关紧要,让我们选择“史蒂夫”。

git branch -m master steve

伟大的。现在你没有主分支!但是你有旧的史蒂夫分支,里面有历史工作。这值得一试,但因为你现在正在历史上划清界限,你可能永远不会再陷入困境。

因此,然后检查您的开发分支,对其进行处理等。当它稳定时(无论在您的特定情况下意味着什么),为自己创建一个新的主人

git checkout -b master

哈哈!该主分支上的首次提交是稳定的,您可以确保所有未来的提交也是如此!(顺便说一句,在从开发到主的所有合并中,您都需要 --no-ff,以将那些中间可能不稳定的提交排除在闪亮的新“主”分支之外。)

于 2012-04-04T12:21:17.010 回答
1

这根本不是分支在 Git 中的工作方式。没有理由从 中删除所有文件master,实际上,这master对于以后的合并将完全无用。您将迫使您的分支masterdevelop分支从根本上发散。

只需检查您的develop分支,然后在那里进行开发工作。当它被认为是“稳定的”时,结帐master并将git merge develop您的稳定代码带入 master。然后推动两个分支。

您还应该将您的内容修改为自动git push origin develop包含在您的分支中,从而允许您推送和拉取更改:-u--set-upstreamdevelop

git push -u origin develop

作为Dan Ray 回答的附录,如果您真的想追溯地master清空直到您git merge --no-ff develop,您需要销毁 master,并且(现在或当您准备合并时)重新创建它以指向您的 repo 中最早的提交。然后masterdevelop将在最早的时刻分流,它们可以合并,给人一种“主人总是稳定的”的错觉:

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

现在您的主分支“总是”为空,直到您的开发代码被合并。

于 2012-04-04T12:00:24.227 回答
0

听起来你想要做的是结合创建一个新develop分支master这个答案如何插入第一个提交,转移所有其他?.

假设您有如下历史记录:

$ 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历史并进行commitnew initial之后masterHEAD

$ 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
于 2012-04-04T12:59:57.483 回答