最初に実際にマージせずにマージをテストする方法


166

git merge現在の作業中のブランチとマスターの2つのブランチ間をシミュレートする方法はありますか?

を作成しなければならないとき、私はしばしば衝突を起こしgit mergeます。最初にマージをシミュレートする方法はありますか?



回答:


132

マージを試すまで、何が起こるかをシミュレートする方法はないと思います。ただし、git statusマージを実行する前にの出力が空であることを確認した場合、先に進んで試してみるのは非常に安全です。競合が発生した場合は、すぐに以前の状態に戻すことができます。

git reset --merge

git 1.7.4以降、次のようにしてマージを中止することもできます:

git merge --abort

(そのオプションを追加したコミットメッセージで説明されているように、これはとの一貫性git rebase --abortなどのために追加されました。)


4
@Amberの答えは、「マージをシミュレートする方法」について尋ねられている内容に正確に答えることです。--no-commit私の意見では、使用する方がはるかに簡単です
Samirahmed 2013年

14
@samirahmed:@Amberが質問に文字通り回答しました。確かに--no-commit、インデックスと作業ツリーはまだ変更していませんが、「変更を加えずに」ではありません。質問、それは一般的に、マージがどのように行われるかを確認する最善の方法がマージを試すことであることに気付いていないためです。多くの場合、以前の状態に戻ることがどれほど簡単かを知らないためです問題があることが判明した場合。
Mark Longair 2013年

2
これがgitのより新しいバージョンで追加されたかどうかはわかりませんが、ドキュメント(1.8.4)では「存在git merge --abortするgit reset --mergeときMERGE_HEADと同等」と記載されているので、覚えやすいものは何でもあります:)
Samuel Meacham

@SamuelMeacham:それを指摘してくれてありがとう-それは1.7.4で導入されました。私はそれで答えを更新しました。ありがとう!
Mark Longair、

この提案は、git 1.9.4では何もしませんでした。
djangofan 2014年

137

を使用git merge --no-commitして、マージが実際にコミットされるのを防ぐことができます。マージがうまく機能しない場合は、元のヘッドにリセットしてください。

たとえそれが早送りであっても(したがって、定義上、競合がないため)マージを最終的に実行したくない場合は、追加することもでき--no-ffます。


私はそれgit merge --abortが存在するとは思わない-たぶんあなたは意味git reset --mergeですか
Mark Longair、2011

いや、とは違っrebase--abortfor がないことを忘れてしまいましたgit merge
アンバー

7
--no-ffも投げます。ffマージが発生しないようにするため。
アンディ

1
@Andy --no-ffは、--no-commit早送りの変更を停止しないため、ここではほとんど必須です。
jackr 2015年

1
@Anant Anand Gupta-これは良いトリックですが、次のようにする必要があります:git config --global alias.tm "merge --no-commit --no-ff"
pasx

109

トピックブランチの変更をマスターと比較したい場合は、次の方法が最も簡単で安全です。

git checkout master
git checkout -b trial_merge
git merge topic_branch

マージが完了すると、マスターからの統合された変更を簡単に確認できます

git diff master

完了したら、単にtrial_mergeブランチを削除します

git checkout master
git branch -D trial_merge

このように、マスターブランチは決して変更されません。


4
また、必要なことgit checkout --detachを何でも実行してテストできます。後で、変更を保持する場合は、を実行しますgit checkout -b new_branch。また、変更を破棄したい場合は、必要なブランチをチェックアウトします(git checkout master)。
Shayan Toqraee 2017

topic_branchが巨大な場合(最初にこの質問をしているdiff master場合のように)、マージが競合を引き起こす場合、出力はおそらく大きすぎて目を見張ることはできません。
Crescent Fresh

私は間違いなくこれがとても好きです...安全でシンプルです。
レオ

4

私が使う :

git merge --ff-only

ドキュメントによると:

現在のHEADが既に最新であるか、マージが早送りとして解決できる場合を除き、マージを拒否してゼロ以外のステータスで終了します。

2つのブランチ間で競合がない場合、早送りマージが行われるため、これは実際にはシミュレーションではありません。ただし、競合が発生した場合は通知され、何も起こりません。


4

git merge --abort最近、が使えるようになりました。ただし、これはマージの競合がある場合にのみ使用できます。コミットしたくない場合は、上記の他の方法を使用してください。


1
上記の他の方法はどれですか?彼らはすべて言及しgit merge --abortます。あなたが参照している回答をだれが書いたかを特定することによって、あなたの回答を将来証明する必要があります。
マイケルフルトン

3

使い捨てブランチを作成して(git checkout -b)、そこでテストマージを実行しないのはなぜですか?


1
あなたが提案するのは、実際には、Ianの答えを簡潔に表現したものです:)
tzot 2018

0

それがあなたのケースであるかどうかは正確にはわかりませんが、あなたの質問では、機能を開始したり、数日かけてコミットしたり、その開発を何度もマージしたりすることがあります。

この時点で、変更した正確なファイルを制御できなくなり、機能が閉じてコードが開発されたときにのみ、それを知ることができます。

この場合、ソースツリーを使用することで(マージ以外の変更ではなく)行った変更を知ることができます。

ベースブランチを右ボタンでクリックして選択する必要がありますDiff Against Current

2つのブランチ間の差分を知るSourcetreeの機能

その後、ブランチをベースブランチにマージした場合にマージされるすべての変更がソースツリーに表示されます。

結果

もちろん、競合は表示されませんが、マージでは便利なツールです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.