web-dev-qa-db-ja.com

任意のmergetoolでHEADを使用してすべての競合を解決する方法

そのため、何らかの理由で、新しくマージされたホットフィックスと多くの競合が発生しています。実際に[手動で]変更されたファイルは競合しません。競合はすべて、修正中に変更されなかったファイルにあり、明らかに空白の問題です。後でその問題を解明しようと思いますが、今度は修正プログラムをマージして展開する必要があります。

HEAD version?を使用するためにすべての競合を解決するにはどうすればよいですか?ファイルごとに移動したくありません。はい、それは悪い習慣ですが、競合はすべて空白であり、私は知っています= HEADは正しい—すべてのテストに合格し、本番環境で問題なく実行されています。

何か案は?

OSXを使用しています。

21
leonsas
git merge -Xours Origin/master

Origin/masterとマージし(git pull Origin masterと同じこと)、ローカルブランチからバージョンを取得することにより、競合を解決します。

すでに悪いマージの途中にいる場合は、最初にgit reset --hard HEADを使用してすべてを先頭にリセットできます。

その場合は、

git reset --hard HEAD
git merge -Xours Origin/master

これで問題が解決するはずです!

(言及する価値もあります。-Xtheirsは同じことを行いますが、競合がある場合は上流バージョンを使用します。)


また、競合が発生する可能性が最も高いのは、アップストリームバージョンがWindowsスタイルの行末を使用しており、ローカルマシンでファイルを編集したプログラムがMacスタイルまたはLinuxスタイルの行末を使用しているためです。

Gitで設定できるオプションでは、常にWindowsスタイルまたはLinuxスタイルの行末をコミットしますが、作業ディレクトリでは常にMacスタイルまたはLinuxスタイルをチェックアウトします。

詳細については、このリンクを参照してください: https://help.github.com/articles/dealing-with-line-endings

46
NHDaly

ローカルブランチで競合がある場合は、次のコマンドを実行するだけです。

git checkout --conflict=merge .
git checkout --ours .

ローカルブランチを使用して競合を解決します。

6
Yametekudasai

私は...するだろう:

$ git checkout master   # or where ever you want to merge the hotfix into
$ git merge --no-commit -Xours <hotfix-branch>
$ git status    # make sure the only change is the file you wanted
$ git diff      # make sure they changes are what you wanted
$ git commit -m "<your merge message"

これはデフォルトの再帰的戦略を使用して競合しないファイルをプルしますが、マスター/ HEADバージョンを使用するだけで競合するファイルを解決します。ドキュメント:

$ git merge --help
....

   recursive
       ... This is the default merge strategy when pulling or merging one branch.

       The recursive strategy can take the following options:

       ours
           This option forces conflicting hunks to be auto-resolved cleanly
           by favoring our version. Changes from the other tree that do not
           conflict with our side are reflected to the merge result. ....
5
Bert F