Как 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 объединяет двоичные файлы?

799   1  
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

    Ничего не найдено.