0

私はマスターブランチで開発を始めたGitリポジトリを持っていますが、今ではマスターは長期的なブランチであってはならないと信じています。他の人と同様に、マスターブランチは常に安定した製品を保持していると思います。

そこで、 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

あなたの問題は、名前「マスター」にあります。

枝は枝です。それらのどれも、他のものよりも本当に重要ではありません。名前は文字通りただのタグです。つまり、現在の HEAD を識別する文字列であり、その HEAD が上にコミットされるとバンプします。しかし、ブランチの「マスター」らしさは、git がプロジェクトで作成する最初のブランチに付ける名前であるため、重要です。しかし、それはただの名前です。現在の master ブランチに新しい名前を付けましょう。呼び方は関係ないので「スティーブ」にしましょう。

git branch -m master steve

偉大な。これで master ブランチはなくなりました! しかし、歴史的な仕事をしている古い steve ブランチがあります。試してみる価値はありますが、現在、歴史の砂に線を引いているため、二度と戻ってこないでしょう。

次に、開発ブランチをチェックアウトして作業します。そして、それが安定したら(特定のケースでそれが何を意味するかに関係なく)、自分で新しいマスターを作成します

git checkout -b master

ハハ!そのマスター ブランチでの最初のコミットは安定しており、将来のすべてのコミットも安定していることを確認できます。(ところで、devel から master へのすべてのマージで --no-ff が必要になるでしょう。これらの中間の潜在的に不安定なコミットを、光沢のある新しい「マスター」ブランチから除外します。)

于 2012-04-04T12:21:17.010 に答える
1

これは、Git でのブランチの動作とはまったく異なります。からすべてのファイルを削除する理由はありません。master実際、これはmaster後でマージするのにまったく役に立たなくなります。masterブランチとdevelopブランチを根本的な方法で分岐させることになります。

ブランチをチェックアウトしてdevelop、そこで開発作業を行ってください。「安定」と見なされたら、チェックアウトmastergit merge developて、安定したコードをマスターに取り込みます。次に、両方のブランチをプッシュします。

また、変更をプッシュおよびプルできるように、ブランチに自動的git push origin developに含めるように変更する必要があります。-u--set-upstreamdevelop

git push -u origin develop

Dan Ray の answerへの補遺として、本当にさかのぼってmasterまで空にしたい場合git merge --no-ff developは、 master を破棄し、(現在またはマージの準備ができたら) 再作成して、リポジトリの最も古いコミットを指すようにする必要があります。その後masterdevelop可能な限り早い時点で分岐し、「マスターは常に安定している」という錯覚を与えてマージできます。

  • 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

これで、開発コードがマージされるまで、マスター ブランチは「常に」空でした。

于 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履歴を取り除き、new 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 に答える