[解決済み】Gitで、あるブランチを別のブランチに「マージ」ではなく「上書き」するには?
質問
2つのブランチがあります。
email
と
staging
.
staging
は最新のもので、もう古い変更点は必要ありません。
email
ブランチを削除したくありません。
の内容をすべてダンプしたいだけなのです。
staging
を
email
というように、両方が同じコミットを指すようにします。それは可能ですか?
解決方法は?
を使用することができます。 'ours' マージ戦略 :
$ git checkout staging
$ git merge -s ours email # Merge branches, but use our (=staging) branch head
$ git checkout email
$ git merge staging
2020-07-30を編集しました。
この質問と可能な解決策についてもう少し考えてみました。親を正しい順序でマージすることが絶対に必要で、このアクションを 1 つのコマンドライン呼び出しで実行する必要があり、配管コマンドを実行しても構わない場合は、次のようにすることができます。
$ git checkout A
$ git merge --ff-only $(git commit-tree -m "Throw away branch 'A'" -p A -p B B^{tree})
これは基本的に、(存在しない)
merge -s theirs
戦略です。
結果の履歴は
plumbing
ブランチ
と比べると、あまり読みやすくもなく、覚えやすくもありません。
-s ours
というスイッチがありますが、これは仕事です。結果として得られるツリーは、再びBブランチと同じになります。
$ git rev-parse A^{tree} B^{tree} HEAD^{tree}
3859ea064e85b2291d189e798bfa1bff87f51f3e
0389f8f2a3e560b639d82597a7bc5489a4c96d44
0389f8f2a3e560b639d82597a7bc5489a4c96d44
2020-07-29を編集しました。
との違いについて、多くの混乱があるようです。
-s ours
と
-X ours
(後者は
-s recursive --strategy-option ours
)があります。この2つの方法を使った2つの結果を示す小さな例を紹介します。の質問と回答も読んでおくことをお勧めします。
(Git マージ) 'ours' 戦略、'ours' オプションと 'theirs' オプションはいつ使うのですか?
まず、2つのブランチと3つのコミット(1つのベースコミット、ブランチごとに1つのコミット)でリポジトリを設定します。サンプルのリポジトリはこちらです。 をGitHubで公開しています。
$ git init
$ echo 'original' | tee file1 file2 file3
$ git commit -m 'initial commit'
$ git branch A
$ git branch B
$ git checkout A
$ echo 'A' > file1
$ git commit -m 'change on branch A' file1
$ git checkout B
$ echo 'B' > file2
$ git commit -m 'change on branch B' file2
では、試しに 戦略オプション (この説明では、彼らのものを使うか、我々のものを使うかはあまり重要ではありません)。
$ git merge -X ours A
$ cat file*
A
B
original
結局は マージ の両方のブランチの内容(サンプルリポジトリでは、ブランチ "strategy-option")が含まれています。を使用した場合と比較してみましょう。 マージ戦略 (次のステップを実行する前に、リポジトリを再インストールするか、ブランチをリセットしてください)。
$ git merge -s ours A
$ cat file*
original
B
original
結果はかなり異なっています (サンプル リポジトリの "merge-strategy" ブランチ)。strategy オプションを使用すると、両方のブランチのマージ結果が得られ、strategy を使用すると、もう一方のブランチで発生したすべての変更が破棄されます。
また、merge-strategy で作成されたコミットは "our"ブランチの最新コミットとまったく同じツリーを指しており、一方 strategy-option は新しい、これまで見たことのないツリーを作成していることに気づかれることでしょう。
$ git rev-parse A^{tree} B^{tree} merge-strategy^{tree} strategy-option^{tree}
3859ea064e85b2291d189e798bfa1bff87f51f3e
0389f8f2a3e560b639d82597a7bc5489a4c96d44
0389f8f2a3e560b639d82597a7bc5489a4c96d44
5b09d34a37a183723b409d25268c8cb4d073206e
OPは確かに、"I no longer need old changes in [...] branch" と "So I just want to dump all the contents of [A] into [B]" を要求しましたが、これは戦略オプションでは不可能です。Ours' マージ戦略を使うことは、多くの可能性のうちのひとつですが、おそらく最も簡単な方法でしょう。
write-tree
と
commit-tree
).
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] まだプッシュされていない Git マージを元に戻す
-
[解決済み] Git フェッチ リモートブランチ
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] 現在のGitブランチをmasterブランチにする
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Git, fatal: リモートエンドが予期せずハングアップしました。
-
[解決済み】マージ後のコミットでGitエラー - fatal: マージ中に部分コミットができない
-
[解決済み】Gitマージで「すでに最新」と報告されるが、違いはある
-
[解決済み】ローカルGitブランチとそのリモートブランチを比較する方法
-
[解決済み] リモートから<branch name>とマージするように構成が指定されていますが、そのような参照は取得されませんでしたか?
-
[解決済み] ブラウンアウトの一環として、パスワード認証が一時的に無効になっています。代わりに個人用アクセストークンを使用してください[重複]。
-
[解決済み] Gitのエラー「object file ... is empty」はどうすれば直せますか?
-
[解決済み] Git の強制上書きを伴うマージ
-
[解決済み] 現在のGitブランチをmasterブランチにする
-
[解決済み] git merge -s ours "の "theirs "バージョンはありますか?