Как git-merge работает с двоичными файлами
Рассмотрим такую ситуацию:
o---o---o slave
/
o---o---B---o---o master
У меня есть куча двоичных файлов. Некоторые из них не изменились ни в slave, ни в master, некоторые другие изменились на slave.
Во время слияния:
git checkout master
git merge slave
ГИТ показал мне вот что:
warning: Cannot merge binary files: foo.bin (HEAD vs. foo)
Auto-merging: foo.bin
CONFLICT (content): Merge conflict in foo.bin
Automatic merge failed; fix conflicts and then commit the result.
Анализ:
foo изменился с обеих сторон. Я согласен, что ГИТ попросит меня разрешить конфликт. Правда, bar менялся только на master и ГИТ меня ни о чем не спрашивал. Он решил взять сдачу от master, пока я хотел его рассмотреть slave вместо этого.
Как я могу лучше контролировать, как Git объединяет двоичные файлы?
1 ответ:
Git ничего не спрашивал, потому что вы внесли изменение в
foo, и вы должны знать, что это изменение произойдет сразу после слияния, если никто не изменял этот файл в веткеslave.Давайте рассмотрим этот простой пример:
o-- slave / \ o--o--o master ^ originВы можете воспроизвести его следующим образом:
git init dd if=/dev/urandom of=foo bs=100k count=1 dd if=/dev/urandom of=bar bs=100k count=1 git add . git commit -m "Added binary files foo and bar" git branch origin git checkout -b slave dd if=/dev/urandom of=foo bs=100k count=1 git commit -m "Modified foo" . git checkout master dd if=/dev/urandom of=bar bs=100k count=1 git commit -m "Modified bar" .Как только вы прочтете do do the merge, вы, вероятно, сделаете:
Вы заметили, что ГИТ заметил перемену в фу, но ничего не сказал о баре. Это потому, что бар не изменился на ветвьgit checkout master git merge slave Merge made by the 'recursive' strategy. foo | Bin 102400 -> 102400 bytes 1 file changed, 0 insertions(+), 0 deletions(-)slave.Если вы хотите сохранить бар от
slave. Вы должны предотвратить завершение слияния git за вас. Вы можете сделать это:git checkout master git merge slave --no-commit git checkout slave bar # I want to keep bar from slave git commit -m "Commit successuful"Позже вы можете проверить, все ли в порядке:
Я надеюсь, что это немного прояснит ситуацию...git diff --stat master~1 origin git diff --stat slave origin git diff --stat master slave
Comments