バイナリファイルとのGit競合の解決
-
07-07-2019 - |
質問
私は、Windows上でGit(msysgit)を使用して、これまでに行った設計作業の変更を追跡しています。
今日は別のPC(リモートリポジトリbrian
)で作業しており、今日行った編集をラップトップの通常のローカルバージョンにマージしようとしています。
ラップトップでは、git pull brian master
を使用して、変更をローカルバージョンに取り込みました。メインのInDesignドキュメント以外はすべて問題ありませんでした-これは競合として表示されます。
PCのバージョン(<=>)は保持したい最新のものですが、どのコマンドがこのバージョンを使用するようにレポに指示するかわかりません。
ファイルをラップトップに直接コピーしようとしましたが、これによりマージプロセス全体が中断されるようです。
誰かが私を正しい方向に向けることができますか?
解決
git checkout
は、このような場合に--ours
または--theirs
オプションを受け入れます。マージの競合があり、マージするブランチのファイルだけが必要なことがわかっている場合は、次の操作を実行できます。
$ git checkout --theirs -- path/to/conflicted-file.txt
ファイルのそのバージョンを使用します。同様に、(マージされるバージョンではなく)バージョンが必要なことがわかっている場合は、
を使用できます$ git checkout --ours -- path/to/conflicted-file.txt
他のヒント
このように手動で競合を解決し(ファイルをコピーする)、次にファイルをコミットします(コピーしたかローカルバージョンを使用したかに関係なく)
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の回答を正しいものとしてマークしてください。
この問題は次の方法でも克服できます
git mergetool
これにより、git
は競合するバイナリのローカルコピーを作成し、それらにデフォルトエディタを生成します。
-
{conflicted}.HEAD
-
{conflicted}
-
{conflicted}.REMOTE
明らかに、テキストエディターでバイナリファイルを便利に編集することはできません。代わりに、エディターを閉じずに、新しい<=>ファイルを<=>にコピーします。その後、エディターを閉じると、<=>により、装飾されていない作業コピーが変更され、マージの競合が通常の方法で解決されたことがわかります。
現在のブランチにバージョンを保持して解決する(マージするブランチのバージョンを無視する)には、ファイルを追加してコミットするだけです:
git commit -a
現在のブランチのバージョンをマージ中のブランチのバージョンで上書きして解決するには、まずそのバージョンを作業ディレクトリに取得してから追加/コミットする必要があります:
git checkout otherbranch theconflictedfile
git commit -a
mipadiの答えは私にとってはうまくいきませんでした。これをする必要がありました:
git checkout --ours path / to / file.bin
または、バージョンをマージするために:
git checkout --theirs path / to / file.bin
then
git add path / to / file.bin
そして<!> quot; git mergetool <!> quot;再度、次の競合に進みます。
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...
--ours
--theirs
インデックスからパスをチェックアウトする場合、マージされていないパスについてはステージ#2(ours
)または#3(theirs
)をチェックアウトします。以前にマージに失敗したため、インデックスにマージされていないエントリが含まれている可能性があります。デフォルトでは、インデックスからそのようなエントリをチェックアウトしようとすると、チェックアウト操作は失敗し、何もチェックアウトされません。
-f
を使用すると、これらのマージされていないエントリは無視されます。-m
または<=>を使用して、マージの特定の側のコンテンツをインデックスからチェックアウトできます。 <=>を使用すると、作業ツリーファイルに加えた変更を破棄して、元の競合するマージ結果を再作成できます。
この手順は、プルリクエストをGithubに送信した後、バイナリファイルの競合を解決するためのものです。
- Githubで、プルリクエストがバイナリファイルで競合していることがわかりました。
- ローカルコンピューターの同じgitブランチに戻ります。
- (a)このバイナリファイルを再作成/再構築し、(b)結果のバイナリファイルを同じgitブランチにコミットします。
- 次に、この同じgitブランチをGithubに再度プッシュします。
Githubのプルリクエストで、競合が消えます。
同様の問題に遭遇しました(マージ時に競合を引き起こすいくつかのバイナリファイルを含むコミットを取得したい)が、gitを使用して完全に実行できる別のソリューションに遭遇しました(つまり、手動でファイルをコピーする必要はありません) 。ここに含めると思ったので、少なくとも次回は必要になったときに思い出すことができます。 :)手順は次のようになります。
% git fetch
これにより、最新のコミットがリモートリポジトリから取得されます(設定によってはリモートブランチ名を指定する必要がある場合があります)が、それらはマージされません。 FETCH_HEADにコミットを記録します
% git checkout FETCH_HEAD stuff/to/update
これは、必要なバイナリファイルのコピーを取得し、作業ツリーの内容をリモートブランチから取得したバージョンで上書きします。 gitはマージを試行しません。そのため、リモートブランチからのバイナリファイルの正確なコピーになります。それが完了したら、通常のように新しいコピーを追加/コミットできます。
Windows上のGitでバイナリファイルの差分/マージを管理するための2つの戦略に出会いました。
-
Tortoise gitでは、ファイル拡張子に基づいてさまざまなファイルタイプのdiff / mergeツールを構成できます。 2.35.4.3を参照してください。 Diff / Mergeの詳細設定 http://tortoisegit.org/docs/tortoisegit/tgit- dug-settings.html 。もちろん、この戦略は、利用可能な適切なdiff / mergeツールに依存しています。
-
git属性を使用して、バイナリファイルをテキストに変換するツール/コマンドを指定し、デフォルトのdiff / mergeツールでそれを実行できます。 http://git-scm.com/book/it/をご覧ください。 v2 / Customizing-Git-Git-Attributes 。この記事では、メタデータを使用して画像を比較する例を示しています。
ソフトウェアモデルのバイナリファイルを操作するための両方の戦略がありましたが、構成が簡単だったため、亀gitを使用しました。
バイナリが dll以外のもの、または画像やブレンドファイルのように直接編集できるものである場合(ゴミ箱に入れる必要はありません) /いずれかのファイルを選択)実際のマージは次のようになります:
たとえば、バイナリファイルに対応した差分ツールを検索することをお勧めします。たとえば、画像ファイル用の無料ツールなどがあります
- npm install -g imagediff IIRC from https://github.com/uber/image-diff
- またはpython https://github.com/kaikuehne/mirror.git
- 他にもあります
それらを比較します。
ファイルを比較するための差分ツールがない場合、binファイルの元のジェネレーターがある場合(つまり、エディターが存在するそれ...ブレンダー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
Git Workflow for Excel- https://www.xltrailを使用しています。 com / blog / git-workflow-for-excel アプリケーションを使用して、マージの問題に関連するほとんどのバイナリファイルを解決します。このオープンソースのアプリは、時間をかけすぎずに生産的に問題を解決するのに役立ち、混乱することなく適切なバージョンのファイルを選択できます。
私のケースはバグのようです... 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
and git status says
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>
リモートバージョンが返されます
その後、ファイルを再度編集してから、コミットしてプッシュします。これは、おそらくバイナリファイルの別のコピーでスペースを浪費することを意味します。