多くの競合が発生する可能性があるリモートブランチをマージしています。競合があるかどうかはどうすればわかりますか?
のようなものが表示さ--dry-run
れませんgit-merge
。
多くの競合が発生する可能性があるリモートブランチをマージしています。競合があるかどうかはどうすればわかりますか?
のようなものが表示さ--dry-run
れませんgit-merge
。
回答:
前述のように、--no-commit
フラグを渡しますが、早送りのコミットを避けるために--no-ff
、次のようにも渡します。
$ git merge --no-commit --no-ff $BRANCH
段階的な変更を確認するには:
$ git diff --cached
また、早送りのマージであっても、マージを元に戻すことができます。
$ git merge --abort
git merge --only-if-there-wont-be-any-conflicts
か、git diff --show-conflicts <commit>
本当に便利になります。残念ながらそれはまだ可能ではありませんか、それとも何か不足していますか?
git pull --ff-only
。
リポジトリとそのリモートの間の競合を自動的に検出するメソッドを実装する必要がありました。このソリューションはメモリ内でマージを行うため、インデックスや作業ツリーには影響しません。これは、この問題を解決できる最も安全な方法だと思います。仕組みは次のとおりです。
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 <<
または>>
。または、出力をファイルに出力して確認することもできます。'changed in both'で始まる行を見つけた場合、おそらく競合が発生しています。
git merge-tree `git merge-base FETCH_HEAD master` FETCH_HEAD master
git merge-tree `git merge-base clieop master` clieop master | grep -A3 "changed in both"
単に素晴らしい!+100
+<<<<<<< .our
、次のように始まる競合マークアップをgrepする必要があることがわかりました。そのため、次のようなgrep式を使用しますgrep -q '^+<* \.our$'
これに対する私の単純な総当たりの解決策は次のとおりです。
「プリマスター」ブランチを作成します(もちろんマスターから)
必要なすべてのものをこのプレマスターにマージします。
次に、マスターに触れずにマージがどのように行われたかを確認できます。
とにかく、@ orange80のアドバイスに従います。
git merge --abort
競合git reset --hard HEAD~1
があった場合、マージまたはがあった場合は、いつでも実行できgit reset --hard origin/master
ます。別のブランチを作成すると、安心感が得られますが、gitの動作を理解すれば、見当違いの恐れであることを理解できます。作業コピーを変更しないことに懸念がある場合、これは解決策を提供しません。
git merge --no-commit
早送りできる場合はマージを中止しません。 git merge --abort
マージされた場合は機能しません。これをスクリプトとして記述したい場合はgit merge
、さまざまな種類の競合を説明するのに十分なエラーコードを返さないため、扱いにくいです。新しいブランチを操作することで、壊れたスクリプトがリポジトリを手動の操作を必要とする状態のままにしないようにします。もちろん、何も失うことはありません。しかし、他の方法で構築する方が簡単です。
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 branch --contains HEAD
またはさらに直接、単に使用することですgit merge --ff-only
--dry-run
「マージが早送りされるかどうかを単にチェックする」ことはありません。それはマージがする正確な出力を返します:ファイル、競合など。ffは本当に面白くないのでしょうか?
git stash; git reset --hard
ですか?@BrianPhillips
私はこれを行うためのエイリアスを作成し、魅力のように機能します、私はこれを行います:
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を実行した場合とまったく同じように、完全なパッチテキストも取得されます。
master
をorigin
して何をするかでこれを少し明確にすることができます。たとえば、ローカルbranch1
にいrequest-pull
て、ローカルの機能ブランチでを実行したい場合はどうbranch2
でしょうか。それでも必要origin
ですか?もちろん、いつでもドキュメントを読むことができます。
誰もまだパッチの使用を提案していないことに驚いています。
から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
つまり、パッチは成功せず、マージによって競合が発生します。出力がないことは、パッチがクリーンであり、ブランチを簡単にマージできることを意味します
これによって実際に作業ツリーが変更されるわけではないことに注意してください(もちろん、パッチファイルの作成は除きますが、後で安全に削除できます)。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年以上前に、この一見明白な解決策をだれも提案しなかったことは奇妙に思われます。
git diff master your_branch | git apply --check
。
これは興味深いかもしれません:ドキュメントから:
複雑な競合を引き起こしたマージを試みてやり直したい場合は、git merge --abortを使用して回復できます。
しかし、それを素朴な(しかし遅い)方法で行うこともできます。
rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)
(注:/ tmpにクローンを作成するだけでは機能しません。コミットされていない変更が競合しないようにするには、コピーが必要です)。
cp -r repository/.git /tmp/repository/.git
、cd /tmp/repository
、git reset --hard
、git add --all
、git reset --hard
、(良い測定のために)git status
(それはきれいだことを確認するため)。
これは古い質問であることは承知していますが、Google検索で初めて表示されます。
Gitはマージ時に--ff-onlyオプションを導入しました。
送信元:http : //git-scm.com/docs/git-merge
--ffのみ
現在のHEADが既に最新であるか、マージが早送りとして解決できる場合を除き、マージを拒否してゼロ以外のステータスで終了します。
これを行うと、マージと早送りが試行されますが、それができない場合は中止され、早送りを実行できなかったが、作業中のブランチはそのままになります。早送りできる場合は、作業中のブランチでマージを実行します。このオプションは、でも使用できます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