web-dev-qa-db-ja.com

git-merge --dry-runオプションはありますか?

私は多くの衝突があるかもしれないリモートブランチにマージしています。競合が発生するかどうかはどうすればわかりますか。

--dry-rungit-mergeのようなものは何もありません。

646
Otto

前述したように、--no-commitフラグを渡しますが、早送りコミットを避けるために、次のように--no-ffも渡します。

$ git merge --no-commit --no-ff $BRANCH

段階的な変更を確認するには

$ git diff --cached

早送りでも、元に戻すことができます。

$ git merge --abort
722
mipadi

リポジトリとそのリモートの間の衝突を自動的に見つけるメソッドを実装しなければなりませんでした。この解決策はメモリにマージするので、インデックスにも作業ツリーにも影響しません。私はこれがあなたがこの問題を解決することができる最も安全な方法であると思います。これがどのように動作するのかです:

  1. あなたのリポジトリにリモートを取得します。例えば、git fetch Origin masterです。
  2. Git merge-baseを実行します。git merge-base FETCH_HEAD master
  3. Git merge-treeを実行します。git merge-tree mergebase master FETCH_HEADmergebaseは、前の手順でmerge-baseが印刷した16進数のIDです)

リモートマスターとローカルマスターをマージしたいとしますが、どのブランチでも使用できます。 git merge-treeはメモリ内でマージを実行し、結果を標準出力に出力します。パターン<<または>>をgrepします。または、出力をファイルに出力して確認することもできます。 'both in changed'で始まる行を見つけた場合、おそらく衝突があるでしょう。

213
akostajti

これに対する私の単純なブルートフォース解決策は、次のとおりです。

  1. (もちろんマスターから) "pre-master"ブランチを作成する

  2. あなたが望むすべてのものをこのプレマスターにマージしてください。
    次に、マスターに触れることなくマージがどのように行われたかを確認できます。

    • プレマスターをマスターORにマージする
    • ワナビーからリリースされたすべてのブランチをマスターにマージする

とにかく、私は@ orange80のアドバイスに従うでしょう。

49
hades

Gitを使ってマージを元に戻すのはとても簡単なので、空走についても心配する必要はありません。

$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world

編集:以下のコメントで述べたように、作業ディレクトリやステージングエリアに変更があった場合、おそらく上記を実行する前にそれらを隠しておくことをお勧めします(そうでなければそれらは上記のgit resetの後に消えます)

46
Brian Phillips

私はこれを行うためのエイリアスを作り、魅力のように動作します、私はこれをします:

 git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '

今私は呼ぶだけ

git mergetest <branchname>

衝突があるかどうかを調べる.

34
Okonomiyaki3000

現在のブランチをリモートブランチと比較するだけで、プル/マージを実行したときに何が変更されるのかがわかります。

#see diff between current master and remote branch
git diff master Origin/master
27
timh

これを行うには、 request-pull gitコマンドを使用します。それはあなたがマージするときに起こるであろうすべての変更を見ることを可能にしますが、あなたのローカルまたはリモートのリポジトリに何もしなくても

たとえば、「feature-x」という名前のブランチをマスターブランチにマージしたいとします。

git request-pull master Origin feature-x

何もしないで何が起きるのかの要約を表示します。

The following changes since commit fc01dde318:
    Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
    http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
    Adding some layout
    Refactoring
ioserver.js            |   8 +++---
package.json           |   7 +++++-
server.js              |   4 +--
layout/ldkdsd.js       | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js

-pパラメータを追加すると、変更されたすべてのファイルに対してgit diffを実行した場合とまったく同じように、完全なパッチテキストも取得されます。

19
ArnaudR

誰もまだパッチの使用を提案していないのは驚きです。

your_branchからmasterへのマージをテストしたいとします(masterをチェックアウトしたとします)。

$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch

これでうまくいくはずです。

こんなエラーが出たら

error: patch failed: test.txt:1
error: test.txt: patch does not apply

これはパッチが成功しなかったことを意味し、マージは衝突を引き起こします。何も出力されない場合はパッチがきれいであることを意味し、あなたは簡単にブランチをマージすることができるでしょう


これはnotで実際に作業ツリーを変更することに注意してください(もちろんパッチファイルを作成することは別ですが、あとで安全に削除することができます)。 git-applyのドキュメントから:

--check
    Instead of applying the patch, see if the patch is applicable to the
    current working tree and/or the index file and detects errors. Turns
    off "apply".

私よりgitの方が賢くて経験豊富な人への注意:私がここで間違っていて、この方法が通常のマージと異なる振る舞いをするかどうか私に知らせてください。この質問が誰も存在していなかった8年以上の間に、この一見明白な解決策が示唆されることは不思議に思えます

17

これは古い質問ですが、Google検索で最初に表示される質問です。

マージ時にGitは--ff-onlyオプションを導入しました。

投稿者: http://git-scm.com/docs/git-merge


- ffのみ

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

これを行うとマージして早送りしようとしますが、それができない場合は中止して早送りを実行できないというプロンプトを出しますが、作業中のブランチはそのまま残します。早送りできる場合は、作業ブランチでマージを実行します。このオプションはgit pullでも利用可能です。したがって、次のことができます。

git pull --ff-only Origin branchA #See if you can pull down and merge branchA

git merge --ff-only branchA branchB #See if you can merge branchA into branchB
8
Jason McKindly

これは面白いかもしれません:ドキュメントから:

複雑な衝突を引き起こして最初からやり直したいマージを試みた場合は、git merge --abortで回復できます。

しかし、あなたはそれを素朴な(しかし遅い)方法で行うこともできます。

rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)

(注:/ tmpに複製するだけではうまくいきません。コミットされていない変更が競合しないようにするために、コピーが必要になります)。

8
user1985657

私はgit logを使ってmasterブランチからfeatureブランチに何が変わったのかを見ます。

git log does_this_branch..contain_this_branch_changes

例えば - マスターにマージされた/されていない機能ブランチにコミットがあるかどうかを確認します。

git log master..feature_branch
7
nelsonenzo

BからAに早送りしたい場合は、git log B..Aに何も表示されないことを確認する必要があります。しかし、B..Aが何かを持っていても、あなたはまだ衝突なしでマージすることができるかもしれません、それで上記は二つのことを示します:早送りがあるので、あなたは衝突を受けません。

3
Erik Allik