Git — вытягивание изменений из клона обратно в мастер

Я клонировал мастер Git и внес много изменений в клон. С тех пор я зафиксировал эти изменения в клоне и теперь хочу, чтобы мастер был точной копией того, что есть на клоне.

Я пробовал Git нажать на клон, чтобы передать изменения мастеру, но ничего из того, что я делаю, не обновляет мастер.

Как сделать мастер точную копию того что есть на клоне? Каков рабочий процесс команды обновления клона и синхронизации мастера с клоном?


person Newbie Git    schedule 13.11.2008    source источник


Ответы (3)


Существует 2 вида репозитория git: голый и не голый. Не голый репозиторий — это любой репозиторий, у которого есть «рабочая копия», то есть некоторая часть репозитория, извлеченная в данный момент.

Вы можете выполнить отправку в нечистый репозиторий, но он не обновит извлеченную рабочую копию, даже если извлеченная ветвь совпадает с отправленной вами ветвью. Это связано с тем, что проверенная копия может содержать незафиксированные изменения, и git никогда не уничтожит изменения без вашего явного запроса (обычно такие команды имеют аргумент --hard)

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

Как правило, похоже, что подход, который вы хотите, на самом деле не принят гиттерами, потому что он действительно не соответствует менталитету распределенного репозитория. Вы сами несете ответственность за то, чтобы ваша копия репозитория была обновлена.

person Gareth    schedule 13.11.2008
comment
Гарет, Спасибо за это объяснение. Является ли каноническим решением то, что вам нужен третий репозиторий, к которому не привязано дерево? Разве это не возвращение к концепции центрального репозитория svn? - person David Nehme; 13.11.2008
comment
Git гораздо больше построен на вытягивании, чем на проталкивании. Конечно, с помощью Git можно эмулировать централизованную систему, чем мы и занимаемся в нашем офисе. Для нас преимущества Git заключаются в простоте ветвления, а не в децентрализованном характере системы управления версиями. - person Gareth; 13.11.2008

Если вы создали свой собственный клон, к которому легко получить доступ из мастера, то вы можете легко перенести изменения из клона в мастер. Только что:

git pull /path/to/clone

Это перенесет изменения из HEAD клона в HEAD мастера.

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

  • общий репозиторий, который клон отправляет, а мастер извлекает из него (например, github или просто где-то голый репозиторий)
  • git-bundle для перемещения набора изменений как файл
  • git-format-patch и git-am для отправки изменений по электронной почте.
person Greg Hewgill    schedule 13.11.2008

Мне нравятся ответы Гарета и Грега. Я бы просто добавил, что мне очень удобно использовать голый репозиторий для синхронизации работы с другими. Это позволяет любому отправлять/извлекать свои изменения (включая ветки) в голый репозиторий, а затем другие могут извлекать/извлекать/объединять по своему усмотрению. Это не то же самое, что иметь один центральный репозиторий, поскольку каждый клон является полноценным репозиторием.

person Pat Notz    schedule 13.11.2008