3

この質問は、特定のファイルで競合するマージに対して常にローカル バージョンを選択するように git に指示するにはどうすればよいですか?と非常によく似ています。重要な違いがあります。

上記の質問に対するVonCの回答の優れた手順に従いましたが、ほとんどすべてが機能しています。ただし、私の状況では、ファイルの受信バージョンのみに変更があります (ローカルバージョンと受信バージョンの両方ではありません)。

1 つのブランチだけが変更されるため、マージは実際には必要ありません。この場合、git はわざわざマージ ドライバを実行せず、単にローカルバージョンを着信バージョンで上書きしているように見えます。これは、まさに私のカスタム マージ ドライバが防止するはずだったものです。

マージ中に特定のファイルを変更してはならないことを本質的にgitに伝える方法はありますか(VonCの答えがうまくいかないように見える上記の状況下でも)?

4

1 に答える 1

2

Git が何もないと判断したときに、他の人が競合を強制しようとして失敗したようです。

この SO の質問 " Git merge - manual merge - force conflic with WHOLE old and new file version " は、コメントで締めくくられています。

私が最も恐れているのは、「それは不可能です。それはgitの仕組みだからです」という答えです。

そして、「GITワークフローの提案が必要」には、試してみることが言及されています:

*.xml merge=Unset私の.gitattributesファイルに。または、自動マージを失敗
させようとするカスタム マージ ドライバ~/.gitconfig

言い換えれば、それは正しいアプローチではないかもしれません。

マージによって導入されたすべての変更がここにあってはならないことが確実な場合は、次を試すことができます。

git clone yourRepo aCloneRepo
cd aCloneRepo
git merge --no-commit --no-ff origin/source_branch
# simply overwrite any change file by the ones in ..\yourRepo
git add .
git commit -m "merge"

コミットするものが何もない場合でも、最後の " git merge" は機能することに注意してください (変更されたすべてのファイルの内容を復元するため)。 マージは新しいコミットに記録されます。git status

それはあなたに与えるでしょう:

C:\Users\VonC\prog\git\tests\mergekeep\r4>git lg
*   a6a1588 - (HEAD, master) merge (2 minutes ago) <VonC>
|\
| * 1bcd75d - (origin/b) addition (2 hours ago) <VonC>
|/
* 9d2e8fb - (origin/master, origin/HEAD) first file (2 hours ago) <VonC>

ただし、ローカルファイルは変更されていません。

ブランチをマージしようとすると、次のようになります。

C:\Users\VonC\prog\git\tests\mergekeep\r4>git merge origin/b
Already up-to-date.

ただし、その回避策は面倒で、クローンと、ある作業ツリーから別の作業ツリーへの手動コピーまたは再同期が必要です。
さまざまな git reset コマンドやgit update-indexなどの配管コマンドを試してみましたが、あまり成功しませんでした。

于 2012-04-08T15:04:17.527 に答える