Gitにリポジトリがあります。私はブランチを作成し、マスターとブランチの両方にいくつか変更を加えました。
その後、数十回コミットした後、ブランチがマスターよりもはるかに良い状態にあることに気付いたので、ブランチをマスターにしてマスターの変更を無視したいと思います。
変更をマスターに残したくないので、マージできません。私は何をすべきか?
Extra:この場合、「古い」マスターはすでにpush
GitHubなどの別のリポジトリに移動されています。これはどのように状況を変えますか?
Gitにリポジトリがあります。私はブランチを作成し、マスターとブランチの両方にいくつか変更を加えました。
その後、数十回コミットした後、ブランチがマスターよりもはるかに良い状態にあることに気付いたので、ブランチをマスターにしてマスターの変更を無視したいと思います。
変更をマスターに残したくないので、マージできません。私は何をすべきか?
Extra:この場合、「古い」マスターはすでにpush
GitHubなどの別のリポジトリに移動されています。これはどのように状況を変えますか?
回答:
他の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
--strategy=ours
とは異なり--strategy=recursive -Xours
ます。つまり、「ours」はそれ自体が戦略(結果は現在のブランチになります)、または「再帰」戦略へのオプションとして渡されます(他のブランチの変更を持ち込み、競合がある場合は自動的に現在のブランチの変更を優先します) )。
git merge --strategy=ours master -m "new master"
。
git push
コードをリモートにプッシュしたい場合は、この直後に行う必要があることを(新規または不明な人のために)追加したかっただけです。「Your branch is ahead of 'origin/master' by 50 commits.
これは期待されています」のような警告が表示される場合があります。押すだけ!:D
すべてがリモートリポジトリ(GitHub)にプッシュされていることを確認します。
git checkout master
「マスター」を「better_branch」で上書きします。
git reset --hard better_branch
リモートリポジトリへのプッシュを強制します。
git push -f origin master
git reset --hard origin/master
次にプルするときに必要になることに注意してください。これの危険性は、この回答で
編集:あなたはあなたが公開レポにプッシュしたとは言いませんでした!それは違いを生む世界です。
「ダーティ」な方法と「クリーン」な方法の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
git branch old-master master; git branch -f master new-master
。新規にバックアップブランチを作成してから、マスターを直接新しいマスターに移動します。(そして、あなたの名前のつづりを間違えて申し訳ありませんが、ちょうどそれに気づきました)
ブランチの名前を次のように変更master
します。
git branch -M branch_name master
git checkout master&&git reset --hard better_branch
ますか?
私が理解していることから、現在のブランチを既存のブランチに分岐できます。本質的に、これは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
私はブログの投稿で私が望んだ答えを見つけました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つのコードブロックに入れたいからです。
それ以外の場合は、コピーして貼り付け、以下の詳細を読んで、変更しておく必要のある行を確認します(既に実行した後)。
ここで与えられた解決策( 'master'のブランチの名前を変更)は、リモート(GitHub)リポジトリの結果を主張していません。
-f - 力
通常、コマンドは、それを上書きするために使用されたローカル参照の祖先ではないリモート参照の更新を拒否します。このフラグはチェックを無効にします。これにより、リモートリポジトリがコミットを失う可能性があります。注意して使用してください。
他の人がすでにリポをプルしている場合、彼らは自分のマスターを新しいGitHubマスターブランチに置き換える(または多くのマージを処理する)ことなく、その新しいマスター履歴をプルすることはできません。公開レポジトリにはgit push --forceに代わるもの
があります。Jefromiの答え(正しい変更を元のマスターにマージする)はその1つです。
このシンプルな方法が最も効果的であることがわかりました。履歴は書き換えられず、以前のブランチのチェックインはすべてマスターに追加されます。何も失われず、コミットログで何が発生したかを明確に確認できます。
目的:「ブランチ」の現在の状態を「マスター」にする
ブランチで作業し、変更をコミットしてプッシュし、ローカルおよびリモートのリポジトリが最新であることを確認します。
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
この後、マスターはブランチの最後のコミットの正確な状態になり、マスターコミットログにはブランチのすべてのチェックインが表示されます。
他のブランチからマスターにすべてのファイルをチェックアウトすることもできます:
git checkout master
git checkout better_branch -- .
すべての変更をコミットします。
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>
私にとって、私は自分のdevlがマスターに戻った後にそれをマスターに戻したかった。
開発中:
git checkout master
git pull
git checkout develop
git pull
git reset --hard origin/master
git push -f
以下の手順は、Atlassian(Bitbucketサーバー)を搭載したGitブラウザーで実行されます
{current-branch}を master
master
「master-duplicate」という名前を付けます。