web-dev-qa-db-ja.com

競合がある場合にマージを成功させる方法は?

1つのファイルに1つの競合があるプルリクエストをマージしようとしています(以下を参照)。プルリクエストをマージする手順は githubで提供 は次のとおりです。このマージを実行して、prを送信する人がクレジットを取得できるようにすることが重要です。

# Step 1: From your project repository, check out a new branch and test the changes.
git checkout -b droark-master master
git pull https://github.com/droark/cryptopp.git master

# Step 2: Merge the changes and update on GitHub.
git checkout master
git merge --no-ff droark-master
git Push Origin master

1つの競合するファイルの1行を修正する方法を知っています。方法がわからないのは、Gitにマージを実行させ、破損したインデックスファイルに関する苦情を停止させることです。

Gitにマージを実行させ、プルリクエストを提供した人がそれを信用し、インデックスファイルの破損を停止するにはどうすればよいですか?


Git merge errors でマージを修復しようとしました。 1つのエラーセットは、別のエラーセットad infinitumに変わります。また、 マージ中にファイルを無視する に従って問題のファイルをリセットしようとしましたが、必要な1行をコピー/貼り付けする予定ですが、破損したインデックスは保持されます。

これは完全な時間の無駄に変わってしまいましたが、Gitのように時間を浪費するので、Gitのやり方を試そうとは思っていません。今、私は単にGitにマージを実行させ、インデックスファイルの破損を停止させたいだけです。


Githubの指示を使用してマージするときに生成される出力は次のとおりです。

$ git pull https://github.com/droark/cryptopp.git master
From https://github.com/droark/cryptopp
 * branch            master     -> FETCH_HEAD
Auto-merging validate.h
Auto-merging validat2.cpp
Auto-merging validat1.cpp
Auto-merging test.cpp
CONFLICT (content): Merge conflict in test.cpp
Auto-merging pubkey.h
Automatic merge failed; fix conflicts and then commit the result.
16
jww

競合を解決せずにマージする方法はありません。それ以外の場合、gitはどのようにマージするかをどのように知るのでしょうか?ただし、git checkout --ours <filepath>またはgit checkout --theirs <filepath>を使用して、マージしているブランチからバージョンをチェックアウトできます。以下に例を示します。

ステージングでマージするマスターブランチにいるとします。

git checkout master
git merge staging

また、gitは多くの競合を示しています。

...
CONFLICT: Readme.md
...

マスター上にあるReadme.mdのバージョンを保持する場合は、次を実行します。

git checkout --ours Readme.md

マスター--oursは「this」ブランチ、つまりmasterを参照していることに注意してください。

これで、単純にインデックスに追加して、解決済みとしてマークできます。

git add Readme.md

これは、stagingブランチのReadme.mdへの変更を事実上無視します。

マージから除外するファイルごとにこのプロセスを繰り返すことができます。完了したら、通常どおりコミットします。

git commit -m "whatever..."

競合するすべてのファイルに対してそれを繰り返すために、あなたは行うことができます

for f in $(git diff --name-only --diff-filter=U | cat); do
   echo "Resolve conflict in $f ..."
   git checkout --theirs $f
done
21
Anthony E

競合を解決する方法はありません。それがリビジョン管理の仕組みです(アリスが「a」と言ってボブが「b」と言う場合、Gitはyouそれを教えて?)。できることは、 いくつかの可能な方法 のいずれかでマージするときにそれらを解決するようにgitに直接指示することだけです。

git merge -s recursive -X theirs <branch>

-s recursiveは、<branch>が1つだけの場合のデフォルトなので、ここで省略できます)

すでにツリーで競合が発生しているため、

  • 手動解決ルート に従ってください
    • ファイルを思いのままに編集する
    • git add it(Gitのaddは、ファイルを解決済みとしてマークします)
    • git commitはマージを完了します。または
  • git merge --abortを使用してマージ前の状態を復元し、上記の自動解決オプションを使用してマージを再試行します
13
ivan_pozdeev

競合の解決は、進行中の他の作業を処理するのと同じです。すべての変更をステージングする必要があります(git add)そしてコミットされます。自動マージに成功したファイルはすでにステージングされています。競合するファイルはそうではありません。

競合するファイルを必要に応じて編集し、ステージングします(git add)、それがすべて完了したら、git commit

具体的には...

  • 編集test.cpp競合を修正します(それらは<<<<マーカー)
  • git add test.cpp
  • テストを実行して、すべてが正常であることを確認します。
  • git commit
4
Schwern

開発をマスターにプッシュする

git Push --force Origin branchA:branchB

これにより、強制的にマージしてからプッシュします

3
ShadowCore