Являются ли Git-вилки Git-клонами? - PullRequest
783 голосов
/ 09 июня 2011

Я постоянно слышу, как люди говорят, что они раздувают код в Git. Git "fork" звучит подозрительно, как Git "clone" плюс некоторая (бессмысленная) психологическая готовность отказаться от будущих слияний. В Git нет команды fork, верно?

GitHub делает вилки немного более реальными, накладывая на них корреспонденцию. То есть, вы нажимаете кнопку вилки, а затем, когда вы нажимаете кнопку запроса на извлечение, система достаточно умна, чтобы отправить электронное письмо владельцу. Следовательно, это немного танцует вокруг владения хранилищем и разрешений.

Да / Нет? Есть опасения, что GitHub расширяет Git в этом направлении? Или какие-нибудь слухи о поглощении Git функциональности?

Ответы [ 10 ]

893 голосов
/ 09 июня 2011

Fork в контексте GitHub не расширяет Git.
Это позволяет только клонировать на стороне сервера.

Когда вы клонируете репозиторий GitHub на своей локальной рабочей станции, вы не можете внести свой вклад обратно в вышестоящий репозиторий, если вы явно не объявлены как «участник». Это потому, что ваш клон является отдельным экземпляром этого проекта. Если вы хотите внести свой вклад в проект, вы можете использовать разветвление для этого следующим образом:

  • клонируйте этот репозиторий GitHub на вашу учетную запись GitHub (то есть «ответвление», часть , клон на стороне сервера)
  • участник коммитов в этот репозиторий GitHub (он находится в вашей собственной учетной записи GitHub, поэтому вы имеете полное право на него перейти)
  • сигнализирует о любом интересном вкладе в исходный репозиторий GitHub (то есть часть «запроса на извлечение» посредством изменений, которые вы внесли в свой собственный репозиторий GitHub)

Проверьте также « Совместная работа GitHub ».

Если вы хотите сохранить ссылку на исходный репозиторий (также называемый восходящим), вам нужно добавить удаленную ссылку на этот оригинальный репозиторий.
Смотрите " В чем разница между источником и восходящим потоком на GitHub? "

fork and upstream

И с Git 2.20 (Q4 2018) и более, выборка с вилки более эффективна, с дельта островами .

130 голосов
/ 09 июня 2011

Я продолжаю слышать, как люди говорят, что они раздувают код в git. Git "fork" звучит подозрительно, как git "clone" плюс некоторая (бессмысленная) психологическая готовность отказаться от будущих слияний. В git нет команды fork, верно?

«Форкинг» - это концепция, а не команда, специально поддерживаемая любой системой управления версиями.

Самый простой вид разветвления - это синоним ветвления. Каждый раз, когда вы создаете ветку, независимо от вашей VCS, вы «разветвляетесь». Эти вилки обычно довольно легко объединить.

Разветвление, о котором вы говорите, когда отдельная сторона берет полную копию кода и уходит, обязательно происходит за пределами VCS в централизованной системе, такой как Subversion. Распределенная VCS, такая как Git, имеет гораздо лучшую поддержку для разветвления всей кодовой базы и эффективного запуска нового проекта.

Git (не GitHub) изначально поддерживает «разветвление» всего репо (т.е. его клонирование) несколькими способами:

  • когда вы клонируете, для вас создается пульт под названием origin
  • по умолчанию все ветви в клоне будут отслеживать их origin эквивалентов
  • Извлечение и объединение изменений из исходного проекта, из которого вы ответили, тривиально просто

Git делает внесение изменений обратно в источник разветвления таким же простым, как просьба кого-то из исходного проекта отозвать у вас или запрос доступа для записи, чтобы отодвинуть изменения обратно самостоятельно. Это та часть, которую GitHub упрощает и стандартизирует.

Какой-нибудь страх над Github, расширяющим git в этом направлении? Или какие-нибудь слухи о том, что Git поглощает функциональность?

Нет беспокойства, потому что ваше предположение неверно. GitHub «расширяет» функциональность разветвления Git с помощью приятного графического интерфейса и стандартизированного способа выдачи запросов на получение, но он не добавляет функциональность в Git. Концепция полного репо-форкинг заложена прямо в распределенном контроле версий на фундаментальном уровне. Вы можете отказаться от GitHub в любой момент и при этом продолжать отправлять / извлекать проекты, которые вы «разветвляли».

78 голосов
/ 10 июня 2011

Да, вилка - это клон. Это произошло потому, что вы не можете выдвигать копии других без их разрешения . Они делают для вас копию ( fork ), где у вас также будет разрешение на запись.

В будущем, если фактический владелец или другие пользователи с вилкой, как ваши изменения, они могут вернуть его в свой собственный репозиторий. В качестве альтернативы вы можете отправить им «запрос-ответ».

37 голосов
/ 09 июня 2011

«Форк» в данном контексте означает «Сделайте копию их кода, чтобы я мог добавлять свои собственные модификации».Больше нечего сказать.Каждый клон - это, по сути, вилка, и решение о том, извлечь ли изменения из вилки, зависит от оригинала.

25 голосов
/ 09 июня 2011

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

10 голосов
/ 11 июня 2014

Форкинг делается, когда вы решите внести свой вклад в какой-то проект.Вы сделаете копию всего проекта вместе с его журналами истории.Эта копия полностью создается в вашем хранилище, и после внесения этих изменений вы отправляете запрос на извлечение.Теперь владелец исходного кода должен принять ваш запрос на извлечение и включить изменения в исходный код.

Git clone - это действительная команда, которая позволяет пользователям получить копию исходного кода.git clone [URL] Это должно создать копию [URL] в вашем локальном хранилище.

10 голосов
/ 04 июня 2013

Я думаю, что fork - это копия другого репозитория, но с изменениями вашего аккаунта.например, если вы напрямую клонируете другой репозиторий локально, источник удаленного объекта все еще использует учетную запись, от которой вы клонируете.Вы не можете зафиксировать и внести свой код.Это просто чистая копия кодов.В противном случае, если вы разветвите репозиторий, он клонирует репо с обновлением настроек вашей учетной записи в вашей учетной записи github.И затем клонируя репо в контексте вашей учетной записи, вы можете зафиксировать свои коды.

7 голосов
/ 23 апреля 2015

Помимо того, что клонирование происходит с сервера на ваш компьютер, а разветвление создает копию на самом сервере, важное отличие состоит в том, что когда мы клонируем, мы фактически получаем все ветви, метки и т. Д.

Но когда мы разветвляемся, мы получаем только текущие файлы в основной ветке, ничего кроме этого.Это означает, что мы не получаем другие ветви и т. Д.

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

Форк не является командой в Git;это просто концепция, которую реализует GitHub.Помните, что Git был разработан для работы в одноранговой среде без необходимости синхронизировать материал с какой-либо мастер-копией.Сервер - это просто другой узел, но мы рассматриваем его как мастер-копию.

5 голосов
/ 26 августа 2017

Здесь есть недоразумение относительно того, что такое «вилка».На самом деле, ответвление - это не что иное, как набор веток для каждого пользователя.Когда вы нажимаете на форк, вы действительно нажимаете на исходный репозиторий, потому что это ЕДИНСТВЕННЫЙ репозиторий.

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

Это имеет большой смысл, но это далеко не очевидно (я обнаружил это случайно недавно).

Когда Джон разветвляет репозиторий SuperProject, кажется, что на самом деле происходит то, что все ветви в исходном репозитории реплицируются с такими именами, как "John.master", "John.new_gui_project" и т. Д.

GitHub "скрывает "Иоанн"от нас и дает нам иллюзию, что у нас есть своя собственная «копия» хранилища на GitHub, но мы этого не делаем и даже не нужны.

Так что ветвь моей ветки «master» фактически называется «Korporal».master ", но пользовательский интерфейс GitHub никогда не раскрывает этого, показывая мне только« master ».

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

По этой причине я думаю, что для Microsoft было бы очень легко внедрить вилки Git в свое предложение Visual Studio Team Services.

3 голосов
/ 04 октября 2018

Проще говоря,

Когда вы говорите, что разветвляете хранилище, вы в основном создаете копию исходного хранилища под своим идентификатором GitHub в своей учетной записи GitHub.

и

Когда вы говорите, что клонируете хранилище, вы создаете локальную копию исходного хранилища в своей системе (ПК / ноутбук) напрямую, не имея копии в своей учетной записи GitHub.

...