web-dev-qa-db-ja.com

Gitのマスターブランチを他のブランチから完全に置き換える方法は?

可能な重複:
現在のGitブランチをマスターブランチにする

Gitリポジトリには2つのブランチがあります。

  1. __変数__
  2. master(元々seotweaksから作成された)

私はmasterを迅速にマージしてseotweaksに戻すことを意図してmasterを作成しました。しかし、それは3か月前であり、このブランチのコードはmasterより13バージョン進んでいます。

master内のすべてのコードは現在多かれ少なかれ時代遅れになっているので、それは実質的に私たちの働くマスターブランチになりました。

私が知っている非常に悪い習慣、教訓。

どうすればmasterブランチの内容すべてをseotweaksの内容に置き換えることができるか知っていますか?

master内のすべてを削除してマージすることもできますが、これはベストプラクティスのようには思えません。

1443
Jason

このようにseotweaksでmasterを上書きするために "ours"マージ戦略を使うことができるはずです。

git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks

その結果、マスターは基本的にseotweaksになります。

-s ours--strategy=oursの略です)

から '私たちの'戦略について:

これで任意の数のヘッドが解決されますが、結果として得られるマージのツリーは常に現在のブランチヘッドのツリーになり、他のすべてのブランチからのすべての変更が事実上無視されます。これは、サイドブランチの古い開発履歴に取って代わることを目的としています。これは再帰的マージ戦略の-Xoursオプションとは異なることに注意してください。

2493
ergosys

Git branch -mを使ってマスターブランチの名前を別のものに変更してから、seotweaksブランチの名前をマスターに変更しますか?このようなもの:

git branch -m master old-master
git branch -m seotweaks master
git Push -f Origin master

これはOrigin masterのコミットを削除するかもしれません git Push -f Origin masterを実行する前にOrigin masterをチェックしてください。

421
ZelluX

あなたはリモートでマスターの名前を変更/削除することができますが、多くの人々が彼らの仕事をリモートマスターブランチに基づいていて、彼らのローカルレポジトリでそのブランチを引っ張っている場合、これは問題になります。
誰もがブランチ 'seotweaks'に取り組んでいるように見えるので、これはここでは当てはまりません。

その場合は、次のことができます。
git remote --showが機能しない場合があります。 (あなたのリモートがあなたのローカルリポジトリ内でどのように宣言されているかチェックするために git remote show を作成してください。私は 'Origin'と仮定します)
(GitHubについて、 house9 コメント: "もう1つのステップを実行し、GitHubの 'Admin'ボタンをクリックし、 'Default Branch'を 'master'以外に設定してから、後で戻る」

git branch -m master master-old  # rename master on local
git Push Origin :master          # delete master on remote
git Push Origin master-old       # create master-old on remote
git checkout -b master seotweaks # create a new local master on top of seotweaks
git Push Origin master           # create master on remote

しかし、もう一度

  • マスターがリモートで削除されている間に他のユーザーがプルしようとすると、プルは失敗します( "リモートでそのような参照はありません")。
  • マスターがリモートで再作成されると、プルはその新しいマスターをローカルの(現在は古い)マスターにマージしようとします。彼らは実際に彼らのローカルマスターを彼らがフェッチするリモート/マスターブランチにreset --hardし、そして彼らの現在のマスターを忘れる必要があります。
70
VonC

seotweaksはもともとmasterからの分岐として作成されていたので、マージして戻すことは良い考えです。ただし、ブランチの1つが実際にはmasterからのブランチではない場合や履歴が大きく異なるため、作業を行っている新しいブランチを優先してmasterブランチを削除したい場合は、これを行うことができます:

git Push [-f] Origin seotweaks:master

あなたがこのエラーを受けているならば、これは特に役に立ちます:

! [remote rejected] master (deletion of the current branch prohibited)

そしてあなたはGitHubを使っておらず、あなたのリモートリポジトリのデフォルトブランチを変更するために "Administration"タブにアクセスすることもできません。さらに、masterを削除することで遭遇する可能性があるので、ダウンタイムや競合状態を引き起こすことはありません。

git Push Origin :master
24
mholm815

これを実行するのが最善の方法であることがわかりました(サーバーに削除できないという問題がありました)。

Originリポジトリをホストするサーバーで、リポジトリ内のディレクトリから次のように入力します。

git config receive.denyDeleteCurrent ignore

ワークステーション上:

git branch -m master vabandoned                 # Rename master on local
git branch -m newBranch master                  # Locally rename branch newBranch to master
git Push Origin :master                         # Delete the remote's master
git Push Origin master:refs/heads/master        # Push the new master to the remote
git Push Origin abandoned:refs/heads/abandoned  # Push the old master to the remote

Originリポジトリをホストしているサーバーに戻ります。

git config receive.denyDeleteCurrent true

ブログ投稿の作者の功績/ http://www.mslinn.com/blog/?p=772

2
ScottGuymer