現在のGitブランチをマスターブランチにする


1657

Gitにリポジトリがあります。私はブランチを作成し、マスターとブランチの両方にいくつか変更を加えました。

その後、数十回コミットした後、ブランチがマスターよりもはるかに良い状態にあることに気付いたので、ブランチをマスターにしてマスターの変更を無視したいと思います。

変更をマスターに残したくないので、マージできません。私は何をすべきか?

Extra:この場合、「古い」マスターはすでにpushGitHubなどの別のリポジトリに移動されています。これはどのように状況を変えますか?


2
非常によく似た質問stackoverflow.com/q/2862590/151641の
mloskot

4
同じ問題を抱えていた、しかし、私は単純にマスターを削除し、マスタに別のブランチに改名:stackoverflow.com/a/14518201/189673
jayarjo

10
@jayarjoは、可能であれば、これを回避する必要があります。履歴を書き直し、次にマスターをプルしようとするときに他のすべての人に問題を引き起こすためです。
joelittlejohn

3
これが@Jefromiの回答が好きな理由です。アーカイブの履歴の分解は行われていません。
froggythefrog 2015年

回答:


2134

他の2つの答えの問題は、新しいマスターに古いマスターが祖先として含まれていないため、プッシュすると、他のすべてのユーザーがめちゃくちゃになることです。これはあなたがしたいことです:

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

履歴をもう少し明確にしたい場合は、マージコミットメッセージに情報を追加して、実行した内容を明確にすることをお勧めします。2行目を次のように変更します。

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message

25
gitのマージ「戦略」についての注意:--strategy=oursとは異なり--strategy=recursive -Xoursます。つまり、「ours」はそれ自体が戦略(結果は現在のブランチになります)、または「再帰」戦略へのオプションとして渡されます(他のブランチの変更を持ち込み、競合がある場合は自動的に現在のブランチの変更を優先します) )。
ケルビン

5
それを機能させるには、2行目を作成する必要がありましたgit merge --strategy=ours master -m "new master"
白熱

5
@Johsmそれがまさに私の答えの最初の文が言っていることです。これを行うと、新しいマスターには古いマスターと同じ履歴がありません。これは、プッシュ/プルする場合は非常に悪いことです。これを正しく機能させるには、祖先を共有する必要があります。代わりにあなたが言っていることをするなら、それをプッシュしようとすると、それを強制しない限り失敗します(これは悪いことであり、あなたを止めようとしているためです)。古いマスターと新しいマスターをマージしようとしますが、これはおそらく列車事故です。
Cascabel 2015年

4
マージ中にviエディターが表示された場合は、次のように入力します。:w(保存用):q(viを終了するため)
Tomas Kubes

9
この答えはうまくいきます。git pushコードをリモートにプッシュしたい場合は、この直後に行う必要があることを(新規または不明な人のために)追加したかっただけです。「Your branch is ahead of 'origin/master' by 50 commits.これは期待されています」のような警告が表示される場合があります。押すだけ!:D
チャペルジュース2017年

388

すべてがリモートリポジトリ(GitHub)にプッシュされていることを確認します。

git checkout master

「マスター」を「better_branch」で上書きします。

git reset --hard better_branch

リモートリポジトリへのプッシュを強制します。

git push -f origin master

81
これはおそらく、ほとんどの人が探している答えです。BS戦略のマージに関する他のすべての回答は、ブランチを完全に置き換えるわけではありません。これにより、すべてが思い通りになりました。ブランチを上書きして、強制的に押し上げます。
グバトロン2017年

31
これは確かに多くの人が探しているものですが、リポジトリをコピーする他のローカルコピーは、git reset --hard origin/master次にプルするときに必要になることに注意してください。これの危険性は、この回答で
7yl4r '27 / 03/17

3
また、リポジトリへの強制プッシュを許可する必要があることにも注意してください-たとえば、ビジネス環境ではこれは機能しません
inetphantom

ここの良い面は、人々が何を望んでいるかにもよりますが、悪い面もあります。あなたがマスターの歴史を他のブランチの歴史で置き換えるまで行きたいならば、これはあなたの答えです。
b15

75

編集:あなたはあなたが公開レポにプッシュしたとは言いませんでした!それは違いを生む世界です。

「ダーティ」な方法と「クリーン」な方法の2つの方法があります。ブランチの名前がだとしますnew-master。これはきれいな方法です:

git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

これにより、名前が変更されたブランチと一致するように構成ファイルが変更されます。

ダーティな方法で行うこともできます。これは、構成ファイルを更新しません。これは、上記の内部で行われていることのようなものです...

mv -i .git/refs/new-master .git/refs/master
git checkout master

2
ありがとうございました。もう一つ質問。私はそれをgithubにプッシュしています。これを行うと、そこで何が起こりますか?
KarelBílek10年

3
@Karel:他のユーザーに少し混乱を引き起こします。マスターをgithubマスターにリセットする必要があります。それらの問題を引き起こさないようにしたい場合は、私の答えを見てください。
Cascabel

6
@Dietrick Epp:汚いやり方を提案するのが良い考えかどうかはわかりません。それはリモートトラッキング、reflogsを台無しにするでしょう...あなたがこれまでやった理由を考えることはできません。
Cascabel

2
ああ、それは良い点です。ただし、両方の方法で使用できますgit branch old-master master; git branch -f master new-master。新規にバックアップブランチを作成してから、マスターを直接新しいマスターに移動します。(そして、あなたの名前のつづりを間違えて申し訳ありませんが、ちょうどそれに気づきました)
Cascabel 2010

2
@FakeName私はそれをする理由がないと結論しませんでした、ただそれを汚い方法で行う理由がないということです。(前のコメントのように)通常のコマンドを使用してそれを行うことができ、reflogがそのままで、物事を中断する可能性がないことを除いて、同じ結果が得られます。また、実装の詳細を変更する必要がないため、動作することが保証されています。
Cascabel 2013年

46

ブランチの名前を次のように変更masterします。

git branch -M branch_name master

11
残念ながらgitはブランチの名前変更を追跡しません。そのため、すでにリポをリモートにプッシュしていて、他のローカルの古いマスターブランチにローカルの変更がある場合、問題が発生します。
thSoft 2015年

これとの違いはありgit checkout master&&git reset --hard better_branchますか?
wotanii

26

私が理解していることから、現在のブランチを既存のブランチに分岐できます。本質的に、これはmaster現在のブランチにあるもので上書きします:

git branch -f master HEAD

それが完了したら、通常はローカルmasterブランチをプッシュできます。おそらくここでもforceパラメータが必要です。

git push -f origin master

マージや長いコマンドはありません。単にbranchそしてpush—しかし、そうです、これはmasterブランチの履歴書き換えます。そのため、チームで作業する場合、自分が何をしているかを知る必要があります。




または、任意のブランチを任意のリモートブランチにプッシュできることがわかりました。

# This will force push the current branch to the remote master
git push -f origin HEAD:master

# Switch current branch to master
git checkout master

# Reset the local master branch to what's on the remote
git reset --hard origin/master

非常にシンプルで完璧に機能しました!2つのシンプルで理解しやすいgitコマンド。私のgitリポジトリは保存され、とてもきれいになりました。ありがとう!
thehelix 2018

16

私はブログの投稿で私が望んだ答えを見つけましたgitのmasterブランチを別のブランチに置き換えます

git checkout feature_branch
git merge -s ours --no-commit master
git commit      # Add a message regarding the replacement that you just did
git checkout master
git merge feature_branch

基本的には、Cascabelの回答と同じです。彼が自分のソリューションのに追加した「オプション」は、すでに私のメインコードブロックに埋め込まれています。

この方法を見つける方が簡単です。

これを新しい答えとして追加します。後でこのソリューションが必要になった場合は、使用するすべてのコード 1つのコードブロックに入れたいからです。

それ以外の場合は、コピーして貼り付け、以下の詳細読んで、変更しておく必要のある行を確認します(既に実行した後)。


14

ここで与えられた解決策( 'master'のブランチの名前を変更)は、リモート(GitHub)リポジトリの結果を主張していません。

  • そのブランチを作成してから何もプッシュしていなかった場合は、名前を変更して問題なくプッシュできます。
  • GitHubにプッシュマスターがあった場合は、新しいブランチを 'git push -f'する必要があります早送りモードではプッシュできなくなります
    -f
    - 力

通常、コマンドは、それを上書きするために使用されたローカル参照の祖先ではないリモート参照の更新を拒否します。このフラグはチェックを無効にします。これにより、リモートリポジトリがコミットを失う可能性があります。注意して使用してください。

他の人がすでにリポをプルしている場合、彼らは自分のマスターを新しいGitHubマスターブランチに置き換える(または多くのマージを処理する)ことなく、その新しいマスター履歴をプルすることはできません。公開レポジトリにはgit push --forceに代わるもの
があります。Jefromiの答え(正しい変更を元のマスターにマージする)はその1つです。


14

このシンプルな方法が最も効果的であることがわかりました。履歴は書き換えられず、以前のブランチのチェックインはすべてマスターに追加されます。何も失われず、コミットログで何が発生したかを明確に確認できます。

目的:「ブランチ」の現在の状態を「マスター」にする

ブランチで作業し、変更をコミットしてプッシュし、ローカルおよびリモートのリポジトリが最新であることを確認します。

git checkout master      # Set local repository to master
git reset --hard branch  # Force working tree and index to branch
git push origin master    # Update remote repository

この後、マスターはブランチの最後のコミットの正確な状態になり、マスターコミットログにはブランチのすべてのチェックインが表示されます。


10

他のブランチからマスターにすべてのファイルをチェックアウトすることもできます:

git checkout master
git checkout better_branch -- .

すべての変更をコミットします。


5

Jefromiの答えに追加するには、sourceブランチの履歴に無意味なマージを配置したくない場合は、oursマージ用の一時的なブランチを作成してから、それを破棄できます。

git checkout <source>
git checkout -b temp            # temporary branch for merge
git merge -s ours <target>      # create merge commit with contents of <source>
git checkout <target>           # fast forward <target> to merge commit
git merge temp                  # ...
git branch -d temp              # throw temporary branch away

この方法では、マージコミットはtargetブランチの履歴にのみ存在します。

または、マージをまったく作成したくない場合は、のコンテンツを取得sourceして、の新しいコミットに使用することができますtarget

git checkout <source>                          # fill index with contents of <source>
git symbolic-ref HEAD <target>                 # tell git we're committing on <target>
git commit -m "Setting contents to <source>"   # make an ordinary commit with the contents of <source>

3

私にとって、私は自分のdevlがマスターに戻った後にそれをマスターに戻したかった。

開発中:

git checkout master
git pull

git checkout develop
git pull

git reset --hard origin/master
git push -f

2

私のやり方は次のとおりです

#Backup branch
git checkout -b master_backup
git push origin master_backup
git checkout master
#Hard Reset master branch to the last common commit
git reset --hard e8c8597
#Merge
git merge develop

2

EclipseでeGitを使用している場合:

  • プロジェクトノードを右クリックします。
  • チーム」 → 「詳細」「ブランチの名前を変更」を選択します
  • 次に、リモートトラッキングフォルダを展開します。
  • 間違った名前のブランチを選択し、名前の変更ボタンをクリックして、新しい名前に変更します。
  • 新しいマスターを選択し、名前をマスターに変更します。

私はそれをしましたが、それがうまくいったかどうかはわかりません。githubでは何も変更されていませんが、git拡張ではブランチの名前が変更されていることがわかります。
Pramod

0

以下の手順は、Atlassian(Bitbucketサーバー)を搭載したGitブラウザーで実行されます

{current-branch}を master

  1. からブランチを作成し、master「master-duplicate」という名前を付けます。
  2. {current-branch}からブランチを作成し、「{current-branch} -copy」という名前を付けます。
  3. リポジトリ設定(Bitbucket)で、「Default Branch」を「master-duplicate」を指すように変更します(この手順がないと、マスターを削除できません-「次の手順」)。
  4. 「マスター」ブランチを削除します-この手順はソースツリーから実行しました(CLIまたはGitブラウザーから実行できます)
  5. 「{current-branch}」の名前を「master」に変更し、リポジトリにプッシュします(これにより、新しい「master」ブランチが作成されますが、「{current-branch}」が存在します)。
  6. リポジトリ設定で、「デフォルトブランチ」を「マスター」を指すように変更します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.