web-dev-qa-db-ja.com

バイナリファイルとのGit競合を解決する

私は、Windows上のGit(msysgit)を使用して、これまで行ってきた設計作業の変更を追跡しています。

今日は別のPCで作業していて(リモートリポジトリbrianを使って)、今日行った編集内容を自分のラップトップの通常のローカルバージョンにマージしようとしています。

私のラップトップでは、私はgit pull brian masterを使って自分のローカルバージョンに変更を反映させました。 InDesignのメインドキュメント以外はすべて問題ありませんでした - これは競合として示されています。

PC上のバージョン(brian)は保持したい最新のバージョンですが、どのコマンドがこのコマンドを使用するように指示しているのかわかりません。

私は自分のラップトップにファイルを直接コピーしようとしましたが、これは全体のマージプロセスを壊すようです。

誰かが私を正しい方向に向けることができますか?

422
Kevin Wilson

git checkoutは、このような場合に--oursまたは--theirsオプションを受け入れます。したがって、マージの競合があり、マージしているブランチのファイルだけが必要なことがわかっている場合は、次のようにします。

$ git checkout --theirs -- path/to/conflicted-file.txt

そのバージョンのファイルを使用します。同様に、あなたが自分のバージョン(マージされているバージョンではない)が欲しいと知っているなら、あなたは使うことができます。

$ git checkout --ours -- path/to/conflicted-file.txt
783
mipadi

このように手動で(ファイルを上書きして)競合を解決してからファイルをコミットする必要があります(上書きしてもローカルバージョンを使用しても)。

git commit -a -m "Fix merge conflict in test.foo"

Gitは通常マージ後に自動コミットしますが、競合を検出したときにはそれ自体では解決できないため、すべてのパッチを適用し、残りは手動で解決してコミットすることができます。 Git MergeのmanページGit-SVNのクラッシュコース または this というブログエントリが、それがどのように機能するのかを明らかにする可能性があります。

編集:下記の投稿を見てください、あなたは実際にファイルを自分でコピーする必要はありませんが、使うことができます

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt

必要なファイルのバージョンを選択します。ファイルのコピー/編集は、両方のバージョンを混在させる場合にのみ必要です。

Mipadis answerを正しいものとしてマークしてください。

142
VolkA

またこの問題を克服することができます

git mergetool

これによりgitは衝突したバイナリのローカルコピーを作成してデフォルトのエディタを生成します。

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

明らかにテキストエディタでバイナリファイルを編集することはできません。代わりに、エディタを閉じることなく、新しい{conflicted}.REMOTEファイルを{conflicted}上にコピーします。それからあなたがエディタを閉じるとgitは装飾されていない作業コピーが変更されたことを確認し、あなたのマージコンフリクトは通常の方法で解決されます。

109
RobM

現在のブランチにバージョンを保持して解決する(マージしているブランチのバージョンを無視する)には、ファイルを追加してコミットします。

git commit -a

現在のブランチのバージョンをマージしているブランチのバージョンで上書きすることで解決するには、まずそのバージョンを作業ディレクトリに取得してから追加/コミットする必要があります。

git checkout otherbranch theconflictedfile
git commit -a

詳細に説明

16
Joshua Flanagan

mipadiの答えは私にはうまくいきませんでした、私はこれをする必要がありました:

git checkout - パス/ to/file.bin

または、バージョンをマージしたままにします。

git checkout - theirsパス/ to/file.bin

それから

git add path/to/file.bin

それから私は再び "git mergetool"を実行して次の対立に進むことができました。

9
kris

から git checkout docs

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
インデックスからパスをチェックアウトするとき、マージされていないパスについてステージ#2(ours)または#3(theirs)をチェックアウトします。

前回の失敗したマージのため、インデックスにはマージされていないエントリが含まれる可能性があります。デフォルトでは、インデックスからそのようなエントリをチェックアウトしようとすると、チェックアウト操作は失敗し、チェックアウトは行われません。 -fを使用すると、これらのマージされていないエントリは無視されます。 --oursまたは--theirsを使用して、マージの特定の側からのコンテンツをインデックスからチェックアウトできます。 -mを使用すると、作業ツリーファイルに加えられた変更を破棄して、元の競合したマージ結果を再作成することができます。

5
user456814

この手順はGithubにpull requestを送信した後にバイナリの衝突を解決するためのものです。

  1. それでGithubでは、あなたのpull requestがバイナリファイルと衝突しているのがわかりました。
  2. 今すぐあなたのローカルコンピュータ上の同じgitブランチに戻ります。
  3. あなたは(a)このバイナリファイルを作り直す/再構築する、そして(b)新しいバイナリファイルを同じgitブランチにコミットする。
  4. これと同じgitブランチをもう一度Githubにプッシュします。

Githubで、あなたのpull requestで、衝突は消えるはずです。

4
david m lee

私は似たような問題に遭遇しました(マージ時に衝突を引き起こしたバイナリファイルを含むコミットを引きたい)が、完全にgitを使ってできる別の解決策に出会いました(すなわち手動でファイルをコピーする必要はありません)。私はそれをここに含めることを考え出したので、少なくとも私が次にそれを必要とするときにそれを思い出すことができる。 :)手順は次のようになります。

% git fetch

これは最新のコミットをリモートリポジトリから取得します(あなたの設定によってはリモートブランチ名を指定する必要があるかもしれません)が、それらをマージしようとはしません。コミットをFETCH_HEADに記録します

% git checkout FETCH_HEAD stuff/to/update

これは私が欲しいバイナリファイルのコピーを取得し、リモートブランチから取得したバージョンで作業ツリーにあるものを上書きします。 gitはマージを行おうとしないので、リモートブランチからのバイナリファイルの正確なコピーを取得するだけです。それが完了したら、通常どおり新しいコピーを追加/コミットできます。

3
Brian Webster

私はウィンドウズ上のGitでバイナリファイルの差分/マージを管理するための2つの戦略に出会いました。

  1. Tortoise gitでは、ファイルの拡張子に基づいてさまざまな種類のファイルに対して差分/マージツールを設定できます。 2.35.4.3を参照してください。詳細設定の差分/マージ http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html 。この戦略はもちろん適切なdiff/mergeツールが利用可能であることに依存しています。

  2. Git属性を使用して、バイナリファイルをテキストに変換するツール/コマンドを指定してから、デフォルトのdiff/mergeツールにそれをさせることができます。 http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes を参照してください。この記事では、メタデータを使って画像を比較する例も示しています。

ソフトウェアモデルのバイナリファイルを扱うための両方の戦略を持っていましたが、設定が簡単だったので、我々は亀gitを使いました。

1
BoJohDoh

バイナリがdll以上のもの、あるいは画像のような直接編集の可能性があるもの、またはブレンドファイルの場合他の)本当のマージは、次のようになります。

私はあなたのバイナリファイルが何であるかを指向した差分ツールを検索することをお勧めします。

そしてそれらを比較しなさい。

ファイルを比較するための差分ツールがない場合、binファイルのオリジナルジェネレータ(つまり、{エディタが存在する} _)があるとします。 blender 3dでは、手動でそれらのファイルを調べたり、ログを見たり、相手に何を含めるべきかを尋ねたり、 https://git-scm.com/book/es/)でファイルの出力を行うことができます。 v2/Git-Tools-Advanced-Merging#_manual_remerge

$ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend

1
tyoc213

Git Workflow for Excelを使用します。 https://www.xltrail.com/blog/git-workflow-for-Excel アプリケーションを使用して、マージ問題のほとんどのバイナリファイルを解決します。このオープンソースのアプリは私があまりにも多くの時間を費やすことなく生産的に問題を解決するのを助けて、混乱することなく私は桜をファイルの正しいバージョンを選ぶことを可能にします。

0

私のケースはバグのようです.... git 2.21.0を使って

私は引っ張った...それはバイナリファイルについて文句を言った:

warning: Cannot merge binary files: <path>
Auto-merging <path>
CONFLICT (content): Merge conflict in <path>
Automatic merge failed; fix conflicts and then commit the result.

そして、ここでの答えのどれにも、意味のある出力が得られなかった。

私が今持っているファイルを見れば...それは私が編集したものです。どちらかをすれば:

git checkout --theirs -- <path>
git checkout --ours -- <path>

私は出力を得ます:

Updated 0 paths from the index

私はまだ自分のバージョンのファイルを持っています。 rmを実行してからチェックアウトすると、代わりに1と表示されますが、それでもファイルの私のバージョンが表示されます。

git mergetoolは言います

No files need merging

そしてgit statusは言う

    All conflicts fixed but you are still merging.
    (use "git commit" to conclude merge)

1つの選択肢は、 コミットを元に戻す ...ですが、私は不幸で、たくさんのコミットがありました。そして、この悪いものが最初でした。それを繰り返す時間を無駄にしたくありません。

だからこの狂気を解決するために:

走ったばかり

git commit

これはリモートバージョンを失い、おそらく余分なバイナリファイルを保存するスペースをいくらか浪費します...

git checkout <commit where the remote version exists> <path>

これは私にリモートバージョンを返します

それから、ファイルをもう一度編集してから、コミットしてプッシュします。これも、おそらくバイナリファイルの別のコピーでスペースを浪費することを意味します。

0
Peter