Git: концепции Fork / Remote / Clone

#git #github

#git #github

Вопрос:

Я пытаюсь понять / визуализировать элементы, которые поставляются с разветвлением репозитория. Моя начальная ссылка — это страница справки.

1-й вопрос:

Когда я разветвлял репозиторий, например, Spoon-Knife на GitHub (т. Е. Нажимал кнопку Fork на их сайте), означает ли это, что Spoon-Knife копируется в мою учетную запись GitHub? Действительно ли произошла реальная копия или это просто концепция?

2-й вопрос:

Следующий шаг на странице справки — выполнить клонирование:

$ git clone git@github.com:username/Spoon-Knife.git

Эта команда создала копию исходного кода на моем локальном компьютере. Клонировался ли он из разветвленного / скопированного репозитория в моей учетной записи GitHub (пожалуйста, смотрите мой первый вопрос)? Или из оригинального репозитория Spoon-Knife?

3-й вопрос:

Шаг по настройке удаленных устройств:

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

Итак, есть origin какой-то «прокси» между нашей локальной копией и копией репозитория в моей учетной записи GitHub? А как насчет upstream ?

Заранее благодарю за вашу помощь.

Ответ №1:

  1. Все, что вы делаете при «fork», — это эффективно создаете ветку в их репозитории git, в которую вы можете заходить.

  2. Ваша локальная копия, в которую вы клонируете, просто клонирована и связана с веткой, созданной вами на git-hub. Помните, что ветвь — это просто указатель на объект фиксации, поэтому, когда вы «разветвляете», вы просто добавляете имя ветви в их репозиторий, которое указывает на текущий заголовок их master.

  3. Удаленные устройства в git — это просто имена репозиториев по внешнему адресу. Ваш «origin» по умолчанию настраивается git и представляет собой просто именованный пульт дистанционного управления. «upstream» — это просто другое название и указывает на исходный мастер, с которого вы изначально разветвлялись, чтобы вы могли извлекать изменения между master и вашей собственной веткой. Вы можете просматривать свои удаленные устройства с помощью git remote -v и легко добавлять их для отслеживания любой ветки в любом внешне доступном репозитории git.

Комментарии:

1. Великолепное объяснение для # 1 и # 2. Спасибо! Итак, origin создается автоматически после того, как я разветвляюсь?

2. Когда я извлекаю новые изменения из оригинала / master, извлекаю ли я их в origin или непосредственно в свою локальную копию?

3. origin создается при клонировании. удаленный сервер — это не что иное, как имя и указатель, например, если вы попробуете следующее: git init --bare Base; git clone Base dev1; cd dev1; git remote вы получите origin в качестве имени и пути к базовому репозиторию, на который указывает dev1, в случае git-hub это будет ссылка ssh, в моем примере простой путь, но оба они просто указывают git, откуда получать информацию. пульты дистанционного управления просто отслеживают репозитории других пользователей, и origin это не что иное, как имя по умолчанию, которое git использует при использовании git clone .

4. что касается вашего второго вопроса в комментариях о «переносе их в origin». Нет, вы переносите их в свой локальный филиал. Как я уже говорил, думайте о remote как о указателе на чужой репозиторий, у него есть имя (например, «origin») и значение (например, путь или ссылка ssh, или git: reference и т.д.)

Ответ №2:

Вам нужно различать понятия fork и clone.

  • клонирование — это концепция Git, которая существовала до GitHub: когда вы клонируете репозиторий, вы копируете всю историю и данные в нем в свой собственный недавно созданный репозиторий. Кроме того, в новом репозитории автоматически создается удаленный файл под названием origin, который указывает на репозиторий, из которого вы клонировали.

  • fork — это концепция GitHub, о которой основной Git не знает. Когда вы форкаете проект GitHub, вы создаете свой собственный проект GitHub, идентичный оригиналу, со всеми функциями GitHub, такими как график форка, автоматически обновляемый. За кулисами форк также включает в себя клонирование репозитория Git в исходном проекте и создание нового репозитория Git в вашем только что созданном проекте.

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

Комментарии:

1. Спасибо, @Daniel! Чтобы прояснить ваш последний абзац: если я клонирую из своего проекта GitHub, origin указывает на мое репозиторий GitHub, правильно? Похоже, что remote — это локальный указатель, который указывает на удаленный репозиторий.

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

3. @Siku-Siku. Com правильно, remote — это локальный указатель на другой репозиторий. Что касается вашего второго вопроса, у вас есть оба варианта: чтобы обновить ваш проект на GitHub, используйте кнопку «Быстрая перемотка» в GitHub (возможно, только если вы еще не сделали никаких коммитов для своего проекта). Чтобы обновить репозиторий на вашем компьютере, добавьте репозиторий исходного проекта в качестве удаленного ( восходящий поток выше) и извлеките из него. Затем вы также можете перейти к своему проекту на GitHub, если хотите.

Ответ №3:

1-й вопрос:

Вы скопировали это. На самом деле это своего рода клон. Теперь у вас есть копия проекта (фактически одной из его ветвей) в вашей учетной записи github.

2-й вопрос:

Команда git clone клонирует репозиторий, который вы ей предоставляете. Итак, $ git clone git@github.com:username/Spoon-Knife.git клонируйте Spoon-Knife из username репозитория. Если это ваша учетная запись, значит, это копия вашей копии репозитория Spoon-Knife 🙂

3-й вопрос:

origin это не прокси, это просто имя другого репозитория. Например, следующая команда добавляет репозиторий с именем local_srv :

 git remote add local_srv /path/to/local/srv
  

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

В вашем случае origin это ваше репозиторий github (я называю remote github ), и вы можете добавить upstream remote в исходный репозиторий Spoon-Knife. Итак, вы работаете в своем проекте локально, переходите в свою учетную запись github (например, git push origin master ) и получаете новые обновления проекта Spoon-Knife с помощью git pull upstream master .

Примечание: Здесь я использовал только master, но вы можете заменить его веткой, которая вам нравится.

Комментарии:

1. Спасибо, @Geoffroy! Когда я впервые разветвлял проект, он был origin создан автоматически? Или это побочный продукт команды clone?

2. ДА. Вы можете использовать git remote , чтобы просмотреть текущий список удаленных устройств 🙂

Ответ №4:

С помощью git каждый репозиторий получает полную историю. Фактически (за исключением некоторой оптимизации с обменом данными между локальными репозиториями), каждый репозиторий является клоном другого репозитория. Или в git hub говорят о fork (это одно и то же).

Итак, у вас есть три репозитория: исходный репозиторий разработчика, клон на git hub (они называют это fork) и локальный клон этого клона. Название origin — это просто сокращенное название для ссылки на ваш репозиторий на git hub (ваш первый клон). Без этого сокращения вам пришлось бы предоставлять репозиторию полный URI на каждом шаге.

У репозитория может быть много таких сокращенных имен для другого репозитория. Рекомендуется, чтобы все они были клонами одного и того же исходного репозитория, чтобы история представляла собой простой ориентированный ациклический граф с одним корнем.

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

Ответ №5:

Когда я разветвлял репозиторий, например, Spoon-Knife на GitHub, означает ли это, что Spoon-Knife копируется в мою учетную запись GitHub?

ДА.

Действительно ли произошла реальная копия или это просто концепция?

Это подробная информация о реализации на Github. Для вас это не должно иметь значения. (Я почти уверен, что они совместно используют хранилище).

Он клонировался из разветвленного / скопированного репозитория в моей учетной записи GitHub? Или из оригинального репозитория Spoon-Knife

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

Итак, является ли origin каким-то «прокси» между нашей локальной копией и копией репозитория в моей учетной записи GitHub? А как насчет восходящего потока?

На самом деле нет. «origin» — это просто идентификатор репозитория на GitHub, чтобы вам было проще с ним взаимодействовать. «upstream» будет работать так же. Вам не нужно настраивать эти пульты дистанционного управления, но наличие их для всех репозиториев, с которыми вы часто работаете (нажимать или извлекать изменения), упрощает вам задачу. Названия «origin» и «upstream» также являются просто условностями (которым вы должны следовать), в них нет никакой «магии».

Комментарии:

1. Спасибо, Тило. Что касается вашего последнего ответа, можем ли мы указать его на исходный репозиторий? Если да, то, похоже, нам действительно не нужно делать fork.

2. Форк нужен только тогда, когда вы хотите внести изменения. Вам не обязательно иметь этот fork на Github (вы можете иметь его только локально или в другом сервисе), но Github чертовски удобен, особенно потому, что тогда вы можете создавать из всех хороших веб-страниц и социальных функций для отправки и просмотра наборов изменений.

3. Ах … теперь это имеет больше смысла: разветвляется только тогда, когда мне нужно внести изменения. Я думаю, поскольку многие люди / сайты говорят «Разветвляйте меня на GitHub», это ослепило меня перед разветвлением, хотя иногда я хочу только получить исходный код. (:

4. Подождите … итак, можем ли мы клонировать непосредственно из исходного репозитория?

5. Да, вы можете напрямую клонировать любой репозиторий, к которому у вас есть доступ для чтения, на Github или в другом месте. Чтобы получить локальную копию исходного кода репозитория GitHub, вы можете его клонировать.

Ответ №6:

3 репозитория

 original - {GitHub}/octocat/Spoon-Knife  
forked   - {GitHub}/   mine/Spoon-Knife  
local    -  {local}        /Spoon-Knife
  
  1. Когда вы «разветвляете», у вас есть фактическая копия в том смысле, что у вас есть доступ для чтения / записи к ней.
    Однако лучше всего рассматривать это как способ эффективного «создания ветки в исходном репозитории git, в который вы можете записывать».

  2. Действие «fork» скопировало файл original в вашу учетную запись GitHub. Вы можете напрямую переходить от local clone к forked (НЕ original ).

  3. Проще говоря, remote — это имя репозитория по внешнему адресу.
    «origin» — указывает на forked («origin» — remote имя по умолчанию)
    «upstream» — указывает на original , чтобы вы могли извлекать изменения в своих репозиториях

Вы можете просматривать свои удаленные устройства с помощью git remote -v и легко добавлять их для отслеживания любой ветки в любом внешне доступном репозитории git.

Частично заимствовано из ответа Марка.