Несколько примечаний о том, как работает git (не технические):
Когда вы перебазируете, git берет нужные коммиты и «повторяет» их поверх чистой истории. Это сделано для того, чтобы в истории не отображались:
Description: tree -> mywork -> merge -> mywork -> merge -> mywork -> merge
Commit SHA1: aaaa -> bbbb -> cccc -> dddd -> eeee -> ffff -> gggg
После перебазирования это может выглядеть так (или аналогично):
Description: tree -> rebase
Commit SHA1: aaaa -> hhhh
Проблема в том, что новый коммит, который вы пытаетесь отправить, является НЕ потомком коммита на кончике ветки, на которую вы нажимаете.
Теперь вы знаете, что та же информация содержится в коммитах, но за это отвечает git, а не просто перезаписывает те коммиты (bbbb-gggg в приведенном выше примере).
Общая модель репо
Если вы используете общий репозиторий, подобные вещи могут сильно запутать. Позвольте мне объяснить почему. Допустим, другой разработчик отключил ветку, и у него есть коммиты aaaa -> gggg в своей ветке. Затем они совершают фиксацию iiii
Тем временем вы переустановили и принудительно подтолкнули, в результате чего дерево выглядело следующим образом:
Description: tree -> rebase
Commit SHA1: aaaa -> hhhh
Когда другой разработчик пытается нажать, он получает сообщение «без перемотки вперед». Когда он выполняет слияние, обе истории ПОВТОРНО СВЯЗАНЫ, и получается беспорядок.
Примерно так (беспорядочно):
Description: tree -> rebase -> mywork -> merge -> mywork -> merge -> mywork -> merge -> devwork -> merge
Commit SHA1: aaaa -> hhhh -> bbbb -> cccc -> dddd -> eeee -> ffff -> gggg -> iiii -> jjjj
Другими словами, если другие тянут И толкают, лучше придерживаться git merge или ИЗБЕГАЙТЕ НАЖАТИЯ до тех пор, пока не произойдет перебазирование (и только перебазируете свою работу).
Модель общедоступного репозитория
Возможно, вы используете другую (более мерзкую) модель, в которой просто хотите, чтобы люди могли получать информацию из вашего репо. В этом случае git push --force не так уж и плохо, потому что тогда они могут справиться с этим. Они могут переустановить свои изменения, чтобы они находились в верхней части ваших изменений, прежде чем передавать вам свои исправления. Это предотвращает перепутывание вашего репо.
Однако для вас может быть лучший способ. git push --mirror
http://www.kernel.org/pub/software/scm/git/docs/git-push.html
Вместо того, чтобы именовать каждую ссылку для отправки, указывает, что все ссылки в $ GIT_DIR / refs / (которые включают, но не ограничиваются, refs / Heads /, refs / remotes / и refs / tags /) должны быть отражены в удаленном репозитории. Вновь созданные локальные ссылки будут отправлены на удаленный конец, локально обновленные ссылки будут принудительно обновлены на удаленном конце, а удаленные ссылки будут удалены с удаленного конца. Это значение по умолчанию, если установлена опция конфигурации remote..mirror.
Одна из замечательных особенностей git заключается в том, что он очень гибкий и позволяет использовать множество различных рабочих процессов. Но ее реальная сила заключается в том, что это распределенная модель, поэтому я считаю, что при ее использовании можно получить максимальную рентабельность инвестиций.
person
gahooa
schedule
18.02.2009