私は多くの衝突があるかもしれないリモートブランチにマージしています。競合が発生するかどうかはどうすればわかりますか。
--dry-run
にgit-merge
のようなものは何もありません。
前述したように、--no-commit
フラグを渡しますが、早送りコミットを避けるために、次のように--no-ff
も渡します。
$ git merge --no-commit --no-ff $BRANCH
段階的な変更を確認するには
$ git diff --cached
早送りでも、元に戻すことができます。
$ git merge --abort
リポジトリとそのリモートの間の衝突を自動的に見つけるメソッドを実装しなければなりませんでした。この解決策はメモリにマージするので、インデックスにも作業ツリーにも影響しません。私はこれがあなたがこの問題を解決することができる最も安全な方法であると思います。これがどのように動作するのかです:
git fetch Origin master
です。git merge-base FETCH_HEAD master
git merge-tree mergebase master FETCH_HEAD
(mergebaseは、前の手順でmerge-baseが印刷した16進数のIDです)リモートマスターとローカルマスターをマージしたいとしますが、どのブランチでも使用できます。 git merge-tree
はメモリ内でマージを実行し、結果を標準出力に出力します。パターン<<
または>>
をgrepします。または、出力をファイルに出力して確認することもできます。 'both in changed'で始まる行を見つけた場合、おそらく衝突があるでしょう。
これに対する私の単純なブルートフォース解決策は、次のとおりです。
(もちろんマスターから) "pre-master"ブランチを作成する
あなたが望むすべてのものをこのプレマスターにマージしてください。
次に、マスターに触れることなくマージがどのように行われたかを確認できます。
とにかく、私は@ orange80のアドバイスに従うでしょう。
Gitを使ってマージを元に戻すのはとても簡単なので、空走についても心配する必要はありません。
$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world
編集:以下のコメントで述べたように、作業ディレクトリやステージングエリアに変更があった場合、おそらく上記を実行する前にそれらを隠しておくことをお勧めします(そうでなければそれらは上記のgit reset
の後に消えます)
私はこれを行うためのエイリアスを作り、魅力のように動作します、私はこれをします:
git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '
今私は呼ぶだけ
git mergetest <branchname>
衝突があるかどうかを調べる.
現在のブランチをリモートブランチと比較するだけで、プル/マージを実行したときに何が変更されるのかがわかります。
#see diff between current master and remote branch
git diff master Origin/master
これを行うには、 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を実行した場合とまったく同じように、完全なパッチテキストも取得されます。
誰もまだパッチの使用を提案していないのは驚きです。
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年以上の間に、この一見明白な解決策が示唆されることは不思議に思えます
これは古い質問ですが、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
これは面白いかもしれません:ドキュメントから:
複雑な衝突を引き起こして最初からやり直したいマージを試みた場合は、git merge --abortで回復できます。
しかし、あなたはそれを素朴な(しかし遅い)方法で行うこともできます。
rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)
(注:/ tmpに複製するだけではうまくいきません。コミットされていない変更が競合しないようにするために、コピーが必要になります)。
私はgit logを使ってmasterブランチからfeatureブランチに何が変わったのかを見ます。
git log does_this_branch..contain_this_branch_changes
例えば - マスターにマージされた/されていない機能ブランチにコミットがあるかどうかを確認します。
git log master..feature_branch
BからAに早送りしたい場合は、git log B..Aに何も表示されないことを確認する必要があります。しかし、B..Aが何かを持っていても、あなたはまだ衝突なしでマージすることができるかもしれません、それで上記は二つのことを示します:早送りがあるので、あなたは衝突を受けません。