2012-04-14 5 views
29

Я совместно работаю над проектом с кем-то, поэтому мы решили использовать git. К сожалению, мы часто закодировать в местах, не имеющий интернета, так что мы в конечном итоге с чем-то вроде этого:Почему Git создала компиляцию без изменений файла?

origin/master: A---B---C 
         \ 
mylocalmaster:   D---E---F 
         \ 
hismaster:    G---H---I 

Теперь, говорят, что он толкает его фиксации и получает это:

origin/master: A---B---C---G---H---I 
         \ 
master (local):   D---E---F 

Все, что я хочу сделать это раздвигать фиксации, чтобы получить это как в моем местном репо и онлайн один:

A---B---C---D---E---F---G---H---I 

это похоже на работу, когда я git push, но возникает проблема, когда я делаю git fetch, а затем git merge. Все, что я пытаюсь сделать, это получить , его совершает мой локальный репо, но в итоге я получаю сообщение об объединении с сообщением Merge remote-tracking branch 'origin/master'.

Я не хочу иметь эту бессмысленную фиксацию, так как есть никаких противоречивых кодов в наших коммитах. Мы работаем над совершенно разными файлами, поэтому нет причин для этого. Как я могу предотвратить git от создания этого слияния?

+1

Когда вы делаете git push в этой ситуации, вы должны получить сообщение об ошибке. Кажется, он не работает нормально. – bames53

+0

С тех пор как я пришел на эту страницу, пытаясь узнать, как * force * git создать коммандную фиксацию без каких-либо изменений в файле, я остановлюсь здесь на том, что ответ на это - команда git commit-tree. См. 'Man git-commit-tree'. – Wildcard

+0

@Wildcard Из любопытства, в какой ситуации вы хотели бы создать коммандную фиксацию, которую 'git merge -no-ff' не решит? –

ответ

29

Вы можете не создавать слияния совершает, используя перебазироваться вместо merge.

Как @Dougal сказал, если вы сделаете git fetch, вы можете выполнить git rebase после этого, чтобы изменить базу ваших изменений на выбранный HEAD.

Обычно вы создаете ненужные слияния слияния, вытаскивая из удаленного репозитория. В этом случае вы можете добавить --rebase вариант:

git pull --rebase 

или добавить правильный вариант Git конфигурационный файл (локально):

git config branch.<branch-name-here>.rebase true 

или для всех новых хранилищ и филиалов:

git config branch.autosetuprebase always --global 

Тем не менее, пересоздание создает более чистую, более линейную историю полезно создавать транзакции слияния, где происходят массовые изменения s в обоих ветвях (используйте для этого git merge).

+0

И ответ на ваш первый вопрос - почему? Объемы слияния создаются по умолчанию, чтобы избежать путаницы для новичков Git, потому что это концептуально более простая ситуация, и люди ожидают, что слияние произойдет, когда они сольются. –

+2

Я не хочу создавать эти коммиты, потому что я ничего не сливаю. Если я позволю git создать миллион этих коммитов, которые ничего не делают, это просто закроет мою историю фиксации без причины. –

+5

Ну, на самом деле, в этом случае требуется объединить фиксации из-за модели данных git. Хешет фиксации включает знания обо всех своих родительских коммитах. Это, как только вы меняете одно коммит в строке коммитов, все последующие коммиты получают новый хеш - они становятся отличными от того, что они изначально были. Согласование слияния принимает неизменные коммиты и ссылается на обе строки (следовательно, у него есть два родителя). Если вы переустанавливаете, вы изменяете свои фиксации, чтобы напрямую ссылаться на удаленные коммиты в качестве своих родителей. Это не имеет никакого отношения к фактическим различиям, но только при отслеживании истории. –

9

Используйте git rebase (после git fetch), чтобы ваши коммиты применялись против него, а не против предыдущего мастера. То есть, перейдите к ABCGHIDEF в ваш пример. (Вы не можете сделать ABCDEFGHI без необходимости делать push -f, потому что ABCGHI уже в origin/master и вы должны переопределить.)

+0

Спасибо. Я знал, что это так глупо, но я не совсем понял. –

Смежные вопросы