Являются ли вилки Git клонами Git?

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

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

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


person Brian    schedule 08.06.2011    source источник
comment
Да, это просто тип клона, который отслеживается базой данных github.   -  person Paŭlo Ebermann    schedule 09.06.2011
comment
Разве GitHub не делает что-то особенное, чтобы избежать удвоения требований к хранилищу (на собственных серверах GitHub)?   -  person Keith Thompson    schedule 10.05.2012
comment
Еще не упомянуто: при удалении частного репо удаляются все его вилки. Удаление общедоступного репо сохраняет вилки, но продвигает одну вилку в качестве нового родительского репо. Если ваш босс делает ваше публичное репо приватным, он ломает все существующие вилки, и вы не сможете отправлять запросы на перенос от них к частному репо. справка .github.com / article /   -  person Plato    schedule 25.02.2016
comment
Я считаю (без доказательств, поскольку GitHub нам этого не показывает), что реальный механизм здесь - это альтернативы Git. Другими словами, вилка - это зеркальный клон, в котором используется --reference. Совершенно не ясно, как именно обрабатываются публичные репозитории и удаления (переместить альтернативы в произвольно выбранный продвинутый репо? Указать все вилки на какую-то общую альтернативу, которая не является частью исходной вилки?), Но использование альтернатив объясняет различное наблюдаемое поведение.   -  person torek    schedule 01.11.2019


Ответы (10)


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

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

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

Также проверьте «Collaborative GitHub Workflow».

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

форк и восходящий поток

А с Git 2.20 (Q4 2018) и более поздних версий выборка из вилки стала более эффективной, с дельта-островами .

person VonC    schedule 09.06.2011
comment
Когда вы клонируете репозиторий GitHub на своей локальной рабочей станции, вы не можете вносить свой вклад в репозиторий восходящего потока, если вы явно не заявлены как участник. --- Разве это не так с разветвлением? Пожалуйста, объясни. - person chharvey; 03.08.2013
comment
@ TestSubject528491 нет, с вилкой, это означает, что вы клонируете вышестоящее репо как свое репо на стороне сервера GitHub. Затем вы можете локально клонировать это новое репозиторий форка на свой компьютер и свободно отправлять его обратно, поскольку вы являетесь создателем и владельцем этого форка. - person VonC; 03.08.2013
comment
Для меня ключевым моментом является то, что вы не можете отправить PR со своей локальной копии , если вы не заявлены как участник. Я так привык отправлять PR из моего местного репо, но это потому, что я всегда отмечен как участник. Если вы думаете об этом, чтобы отправить PR, вам нужно отправить ветку в удаленное репо, а затем создать PR. Я думаю, это имеет смысл, если вы не хотите, чтобы случайные люди создавали ветки в вашем репо. И что вы бы предпочли, чтобы они разветвляли его и отправляли PR таким образом. - person Adam Zerner; 22.02.2016
comment
Я видел второй восходящий удаленный подход в другом месте, но не проще ли вытащить напрямую с GitHub - Original на GitHub - Fork? Второй удаленный подход, похоже, не работал в моих настройках Eclipse и eGit, не удалось отправить на мой репозиторий GitHub - Fork (нечего нажимать). - person William T. Mallard; 29.09.2016
comment
Неважно, информация здесь ссылка дала мне некоторое представление. Как участник, имеет смысл вытащить из GitHub - Original в GitHub - Fork, затем из - Fork на локальный компьютер, но если вы владелец, вы, вероятно, захотите сначала извлечь напрямую из my - Fork, чтобы просмотреть, запустить тесты и т. Д. перед нажатием на - Оригинал. - person William T. Mallard; 29.09.2016
comment
Когда вы клонируете репозиторий GitHub на своей локальной рабочей станции, вы не можете вносить свой вклад в репозиторий восходящего потока, если вы явно не объявлены в качестве участника - это предложение звучит так, будто изменения в вилке можно свободно вернуть к оригиналу без будучи соавтором. - person Darko Maksimovic; 16.08.2017
comment
@DarkoMaksimovic За этим предложением следует Так что клон (на вашу локальную рабочую станцию) не является вилкой. Это просто клон. Это должно быть достаточно ясно. Учитывая, что у вас есть форк (поскольку это ваше репо), вы можете вернуться к нему. - person VonC; 16.08.2017
comment
@VonC Это предложение также звучит так, как я сказал. Позвольте мне быть более ясным: я не говорю, что похоже, что вы можете свободно вносить изменения в свою вилку, потому что вы можете, и это было бы нормально. Вместо этого это звучит так: если вы разветвляете репо и добавляете изменения в эту вилку, то эти изменения можно легко вернуть обратно в исходное репо. Просто прочтите это с учетом этого, и вы увидите, что это похоже на это. Я бы посоветовал вместо второго процитированного вами предложения добавить что-то вроде ... Вы можете вносить изменения только в свою собственную вилку, а не в исходное репо, если вы не являетесь участником - person Darko Maksimovic; 17.08.2017
comment
@DarkoMaksimovic Хорошо, я вижу: вы можете отредактировать ответ напрямую: я проверю редактирование и одобряю его :) - person VonC; 17.08.2017
comment
@DarkoMaksimovic Да, спасибо. Я немедленно одобрил вашу правку. - person VonC; 20.08.2017
comment
Вилка - это clone --bare или clone --mirror? - person theonlygusti; 25.09.2019
comment
Зеркало @theonlygusti на стороне сервера (GitHub). - person VonC; 25.09.2019
comment
Исходная диаграмма в В чем разница между origin и upstream на GitHub? правильно отображает однонаправленную стрелку от GitHub - Original to Local Machine :) - person Ricardo; 06.10.2019
comment
@ Рикардо Спасибо. Я исправил изображение в этом ответе. - person VonC; 06.10.2019

Я все время слышу, как люди говорят, что разветвляют код в 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 в любой момент и по-прежнему продолжать выталкивать / вытягивать проекты, которые вы «разделили».

person meagar    schedule 09.06.2011
comment
Спасибо за отличный ответ. Я просто хочу уточнить, это означает, что вне контекста github я мог бы клонировать несколько X project на своей машине. Если я внесу изменения в свой локальный файл и у меня нет доступа на запись к источнику, я отправлю электронное письмо автору проекта с просьбой выполнить извлечение. Он создаст пульт с именем gideon, который будет URL-адресом моего локального клона, и он сможет тянуть, верно? - person gideon; 16.09.2013
comment
Если вы хотите внести свои изменения в проект, вы можете сохранить их в файлы, например. с помощью git format-patch и прикрепите их к электронному письму кому-то, у кого есть доступ на запись, или вы можете получить свой собственный хостинг, подтолкнуть свою работу к нему и отправить URL-адрес по электронной почте, например. с помощью команды git request-pull. Репозиторий на рабочих станциях обычно недоступен напрямую в Интернете. - person bdsl; 25.01.2016
comment
Но да, если ваша рабочая станция оказывается доступной через Интернет для автора проекта, вы можете просто отправить им URL-адрес, и они могут добавить его как удаленный компьютер и извлечь с него. - person bdsl; 25.01.2016
comment
Re: angst, единственное, что для меня - это то, что нет ссылки или кнопки, по которой можно было бы щелкнуть, чтобы создать кнопку с перспективой извлечения из моего репо, где GitHub сообщает вам, что вы на 50 коммитов позади. Теперь ничего страшного, поскольку я знаю, что они используют термин Pull Request, чтобы также включать запросы на вытягивание из восходящего потока в вашу вилку GitHub. Git - это сложно. - person William T. Mallard; 29.09.2016

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

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

person ssapkota    schedule 09.06.2011
comment
Могу ли я просто клонировать репозиторий на свой локальный компьютер, создать ветку, а затем отправить запрос на перенос первоначальному владельцу? Кажется излишним иметь несколько копий репозиториев, размещенных по всему GitHub, просто для облегчения обновления кода. - person Casey; 01.09.2015
comment
@Casey Вы можете отправить запрос на перенос через GitHub только из самого GitHub, и вы можете отправить запрос на перенос только из ветки, которая существует на GitHub. Если вы не являетесь соавтором данного репозитория, у вас нет возможности создать ветку, из которой вы можете инициировать запрос на вытягивание GitHub. Ничто не мешает вам делать это по электронной почте старомодным способом, но GitHub не играет в этом никакой роли. - person Beau Simensen; 06.09.2015
comment
@Casey, причина в том, что обычно у других нет доступа по URL к вашей рабочей станции. GitHub fork означает, что есть копия вашей работы на сервере GitHub, к которой вы можете push и к которой у других есть доступ по URL-адресу, чтобы они могли pull. pull request - это просто стандартный способ получить им URL-адрес вашей копии (на GitHub), чтобы они могли легко загрузить его в свой репозиторий. - person Jesse Chisholm; 14.06.2016
comment
Я считаю, что это должен быть правильный / принятый ответ. Представьте себе беспорядок в сцене, где команда из 15-20 разработчиков создает ветки и отправляет их в исходную точку, а 15-20 разработчиков имеют собственную копию того же репозитория и создают столько же ветвей, вносят изменения и отправляют ее обратно. Тогда Автор исходного репозитория может извлекать только те изменения, которые он хочет. - person Kishor Pawar; 19.07.2016

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

person Daenyth    schedule 08.06.2011
comment
В частности: сделайте копию их кода on the GitHub server, чтобы я мог добавить свои собственные изменения and others can have URL access to my version. Большинство локальных рабочих станций не предлагают доступ по URL-адресам, чтобы кто-либо мог их извлечь. Но если вы нажмете на свою вилку на сервере, тогда у них может быть URL-адрес для вытягивания. - person Jesse Chisholm; 14.06.2016
comment
Речь идет не о разветвлении вообще, а именно о разветвлении GitHub. - person reinierpost; 08.06.2017

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

person Sam Johnson    schedule 09.06.2011

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

person Daniel Shen    schedule 04.06.2013

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

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

person aliasav    schedule 11.06.2014

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

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

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

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

GitHub «скрывает» объект «Джон». от нас и создает иллюзию, что у нас есть собственная «копия» репозитория на GitHub, но у нас ее нет, и она даже не нужна.

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

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

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

person Hugh    schedule 26.08.2017
comment
Уважаемый Хью, половина вашего ответа на самом деле неверна - форк - это клон целого репозитория из одной учетной записи пользователя в другую учетную запись пользователя вместе со всеми ветвями и историей. Когда вы совершаете форк, ничего не меняется в исходном репозитории, из которого вы разветвлялись. Но помимо этих нескольких недопониманий с вашей стороны относительно того, что такое форк, теперь есть и хорошие новости: службы Visual Studio Team теперь включают функциональность форка. ;) - person Sorin Postelnicu; 12.01.2018
comment
Источник @SorinPostelnicu? Я склонен верить здесь Хью из-за личного опыта поведения вилок, несовместимого с тем, что они являются простым клоном репозитория. Например, когда верхний поток удаляется, вилки удаляются (как было упомянуто в комментарии к вопросу OP), и иногда восходящий поток завершал объединение вещей в ветки моих вилок при принятии запроса на перенос, при этом я ничего не делал. - person potato; 15.02.2018
comment
Похоже, что это действительно так. В конце концов, для GitHub было бы невероятно глупо создавать буквально git clone совершенно новый репозиторий (даже пустой) каждый раз, когда кто-то нажимает кнопку вилки - это было бы невероятной тратой хранилища и, вероятно, вектором атаки. - person Greg A. Woods; 24.03.2018

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

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

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

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

person Deepak G M    schedule 23.04.2015
comment
Хм? Вилка захватывает все ветви, но вы должны знать, где искать (подсказка: git branch -a). - person tripleee; 12.01.2016

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

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

а также

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

person anoNewb    schedule 04.10.2018