В чем разница между форкингом и клонированием на GitHub?

187

Я хотел бы знать разницу между выполнением Fork проекта и cloneего выполнением.

Могу ли я отправлять пул-запросы только через GitHub, если я разбудил проект?

Стив Данн
источник
2
Для людей, которые приземляются здесь, ищут объяснение "форка" с Git (не GitHub). На Git нет команды "fork". Это больше GitHub (не Git), концепция. Различие легко забывается.
ambassallo

Ответы:

113

В основном да. A fork- это просто запрос GitHub клонировать проект и зарегистрировать его под своим именем пользователя ; GitHub также отслеживает отношения между двумя репозиториями, так что вы можете визуализировать фиксации и извлечения между двумя проектами (и другими форками).

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

мишель-SLM
источник
4
Обновления требуют намного больше работы, чем клоны. Клон можно обновить с помощью простого git pull. Вилка принимает несколько команд. И не удивительно, что почти каждая вилка, на которую я смотрю, устарела. Вилы похожи на проблему хранилища Maven на стероидах. Вместо одного устаревшего репо (Maven) их тысячи (Git).
17
Похоже, @jww лучше всего придерживаться клона - зачем тогда использовать форк?
serup
@serup - причина в том, что раздвоенную копию можно редактировать, git pullтак что все еще существуют какие-то отношения, которые существуют. Если вы клонировали всю копию, она находится на вашем локальном компьютере и отключена от исходного репо.
Джон
134

Когда вы говорите, что создаете хранилище, вы в основном создаете копию хранилища под своим идентификатором GitHub. Главное, на что следует обратить внимание, это то, что любые изменения, внесенные в исходный репозиторий, будут отражены обратно в ваши разветвленные репозитории (вам нужно получить и перебазировать). Однако, если вы внесете какие-либо изменения в свой разветвленный репозиторий, вам придется явно создать запрос на извлечение в исходном репозитории. Если ваш запрос на получение одобрен администратором исходного хранилища , ваши изменения будут зафиксированы / объединены с существующей исходной базой кода. До тех пор ваши изменения будут отражены только в той копии, которую вы подписали .

Коротко:

Модель Fork & Pull позволяет любому разветвить существующий репозиторий и вносить изменения в свой личный форк, не требуя предоставления доступа к исходному репозиторию. Затем изменения должны быть перенесены в исходный репозиторий сопровождающим проекта.

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

Пара других интересных рассуждений -

Git вилки на самом деле Git клоны?

Как обновить разветвленный репозиторий GitHub?

Аникет Тхакур
источник
24
«Главное, на что следует обратить внимание, это то, что любые изменения, внесенные в исходный репозиторий, будут отражены в ваших разветвленных репозиториях». Это немного вводит в заблуждение, я думаю. AFAIK, изменения, внесенные в исходное хранилище после разветвления, автоматически не отражаются в разветвлении; Вы должны переместить эти изменения вручную. Изменения, которые произошли до разветвления, копируются на новый разветвитель, когда вы нажимаете кнопку разветвления.
Ajedi32
«Любые изменения, внесенные в исходный репозиторий, будут отражены в ваших разветвленных репозиториях» .. действительно ?? Надеюсь, не автоматически
KansaiRobot
Я работал над проектом клиента и использовал клонирование и push-модель для работы. Однажды я раздвоил его и сразу же получил сообщение о том, что нужно разворачивать полное репо. Я действительно не понимаю, как это считается неправильным?
user3075740
Изменения, внесенные в исходное хранилище после разветвления, не отражаются автоматически в разветвлении, но для этого проверьте шаг 3 этого блога: - help.github.com/articles/fork-a-repo
Suhas Chikkanna
«Любые изменения, внесенные в исходный репозиторий, будут отражены в ваших разветвленных репозиториях» - вы имеете в виду, что это невозможно после того, как мы клонируем?
переменная
26
  • Разбитый проект находится в вашем онлайн-хранилище (репо).
  • Клонированный проект находится на вашей локальной машине (я обычно клонирую после разветвления репо).

Вы можете зафиксировать в своем онлайн-репо (или зафиксировать в своем локальном репо, а затем отправить в онлайн-репо), а затем отправить запрос на извлечение.

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

Алиса
источник
13

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

При развёртывании репо на сервере нет необходимости дублировать контент, потому что оба репо будут использовать один и тот же контент [фиксированный объект] с того же сервера. «Хитрость» заключается в управлении различными пользовательскими точками зрения, так что каждый пользователь считает, что у него есть полная личная копия репо. Толкает и выбирает между вилками просто обновляет указатели пользователя.

На более низком уровне git делает то же самое внутри. Если у вас есть три разных файла, каждый из которых содержит Hello World, то git просто «разветвляет» свою единственную копию блоба Hello World и предлагает ее в каждом из трех мест по мере необходимости.

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

Филип Окли
источник
5

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

Фархан Хак
источник
5

Хотя @ AniketThakur ответ очень хороший. Никто еще не ответил на следующий вопрос.

Могу ли я отправлять пул-запросы только через GitHub, если я разбудил проект?

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

Теодор Норвелл
источник
3

В случае, если вы сделали то, на что намекал спрашивающий (забыл раскошелиться и просто локально клонировал репозиторий, внесли изменения и теперь нужно выполнить запрос на извлечение), вы можете вернуться на правильный путь:

  1. раскройте репо, на которое хотите отправить запрос на получение
  2. нажмите ваши локальные изменения на вашем пульте
  3. запрос на выдачу
Принцесса Рути
источник
2

Еще одно странное отличие GitHub в том, что изменения в форках не учитываются в вашем журнале активности, пока ваши изменения не будут перенесены в исходное хранилище. Более того, чтобы превратить вилку в правильного клона, вы, очевидно, должны обратиться в службу поддержки Github.

Из Почему мои вклады не отображаются :

Коммит был сделан в развилке

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

Откройте запрос на включение, чтобы ваши изменения были объединены с родительским репозиторием. Чтобы отсоединить вилку и превратить ее в автономный репозиторий на GitHub, обратитесь в службу поддержки GitHub . Если вилка имеет свои собственные вилки, сообщите в службу поддержки, должны ли вилки перемещаться вместе с вашим хранилищем в новую сеть или оставаться в текущей сети. Для получения дополнительной информации см. « О вилках ».

BJennings
источник
2

Короче говоря, "fork" создает копию проекта, размещенную на вашей учетной записи GitHub.

«Клон» использует программное обеспечение git на вашем компьютере для загрузки исходного кода и всей истории версий на этот компьютер

Testilla
источник