В чем разница между git branch, fork, fetch, merge, rebase и clone?

Я хочу понять разницу между веткой, вилкой и клоном в Git?

Точно так же, что это значит, когда я делаю git fetch, а не git pull?

Кроме того, что означает rebase по сравнению с merge?

Как я могу объединить отдельные коммиты вместе?

Как они используются, для чего они используются и что они представляют?

Какое место занимает GitHub?


person jackiekazil    schedule 25.07.2010    source источник
comment
Вы можете изменить принятый ответ на ответ Майкла Дарранта?   -  person siride    schedule 31.12.2012
comment
Он, конечно, может, но это, должно быть, его выбор, и, честно говоря, большинство людей, прибывающих сюда (например, я), хотят чего-то более лаконичного, в точности как ответ, который он выбрал, который в то время был один самостоятельно =)   -  person user1271772    schedule 11.08.2013


Ответы (5)


Клон - это просто копия репозитория. На первый взгляд, его результат эквивалентен svn checkout, где вы загружаете исходный код из другого репозитория. Разница между централизованными VCS, такими как Subversion, и DVCS, такими как Git, заключается в том, что в Git, когда вы клонируете, вы фактически копируете весь исходный репозиторий, включая всю историю и ветки. Теперь у вас есть новый репозиторий на вашем компьютере, и все сделанные вами коммиты попадают в этот репозиторий. Никто не увидит никаких изменений, пока вы не отправите эти коммиты в другой репозиторий (или исходный) или пока кто-то не извлечет коммиты из вашего репозитория, если он общедоступен.

Ветвь - это то, что находится в репозитории. Концептуально он представляет собой нить развития. Обычно у вас есть основная ветка, но у вас также может быть ветка, в которой вы работаете над некоторой функцией xyz, а другая - для исправления ошибки abc. Когда вы проверили ветку, любые сделанные вами коммиты останутся в этой ветке и не будут переданы другим веткам до тех пор, пока вы не объедините их или не переустановите их в нужную ветку. Конечно, Git кажется немного странным, когда дело касается веток, пока вы не посмотрите на базовую модель реализации ветвей. Вместо того, чтобы объяснять это самому (я уже сказал слишком много, мне кажется), я свяжусь с объяснением "информатики" того, как Git моделирует ветвления и коммиты, взятым с веб-сайта Git:

http://eagain.net/articles/git-for-computer-scientists/

Форк на самом деле не является концепцией Git, это скорее политическая / социальная идея. То есть, если некоторых людей не устраивает то, как развивается проект, они могут взять исходный код и работать над ним самостоятельно, отдельно от исходных разработчиков. Это будет считаться вилкой. Git упрощает разветвление, потому что у каждого уже есть собственная «основная» копия исходного кода, так что это так же просто, как разорвать связи с исходными разработчиками проекта и не требует экспорта истории из общего репозитория, как это может быть связано с SVN .

РЕДАКТИРОВАТЬ: поскольку мне не было известно о современном определении «вилки», используемом такими сайтами, как GitHub, взгляните на комментарии, а также на Ответ Майкла Дарранта ниже моего для получения дополнительной информации.

person siride    schedule 25.07.2010
comment
Форк не обязательно означает, что разработчик недоволен основным репо. Обычно это означает, что другой разработчик имеет доступ для чтения, но не для записи, к этому репо. Разработчик может разветвить репо, внести изменения, но, поскольку он не может писать в основное репо, он должен отправить свои изменения в виде патча. Таким образом, разветвление также является средством поощрения совместной работы без предоставления доступа на запись. - person brycemcd; 25.07.2010
comment
Полагаю, это правда. Я когда-либо видел вилку, используемую только в контексте создания новой, потенциально конкурирующей версии проекта. - person siride; 26.07.2010
comment
Вы могли бы сказать, что форк - это ветвь, которая, как ожидается, не будет объединена в восходящем направлении. - person masonk; 26.07.2010
comment
Это та же идея, что и форк GitHub, или есть какие-то метаданные, связанные с форком, которые поощряют форк, а не клонирование + создание собственного репозитория GitHub? - person Joe; 04.08.2011
comment
@Joe: Я ничего не знаю о GitHub, потому что я им не пользуюсь. - person siride; 04.08.2011
comment
Насколько я понимаю, fork на github означает новый репозиторий на github, скопированный с исходного. clone загрузит содержимое репозитория на ваш локальный компьютер (независимо от того, разделили вы его или нет). - person Ovesh; 17.11.2011
comment
На github также используется форк для опробования примеров. См. github.com/kevinsawicki/github-maven-example На первом этапе - вилка этот пример. - person Huluvu424242; 21.01.2012
comment
Git Hub использует вилку, поскольку подразумевается вилка. Это новый репозиторий, хранящийся на github, отдельно от оригинала. Однако github также упрощает реализацию запросов на вытягивание. Запросы на вытягивание по существу просят владельца исходного репозитория вытащить изменения из вашей вилки репо обратно в источник. Таким образом, каждый может использовать систему управления версиями и иметь историю всех изменений, включая свои, но не всем нужен доступ на запись к исходному репо. - person mklauber; 16.03.2012
comment
Я обновил свой ответ, чтобы люди смотрели на ответ Майкла Дарранта, чтобы узнать больше о модели github. - person siride; 17.03.2012
comment
Пожалуйста, перестаньте голосовать за этот ответ. Я не заслуживаю всех этих очков. - person siride; 21.11.2012
comment
Вы не объяснили, в чем разница между: fetch, merge, rebase. - person Alex Bitek; 17.12.2012
comment
@BadDesign: это потому, что я ответил на этот вопрос до того, как эти части были добавлены. Изначально это было просто клонирование, ветвь и вилка. Как бы то ни было, выборка, слияние и перебазирование - это разные вещи, поэтому они на самом деле не относятся к этому вопросу. - person siride; 17.12.2012
comment
Я изменил название, чтобы сделать вопросы и ответы более исчерпывающими и выступить в качестве центрального источника информации для большинства процессов git. Я не хотел преуменьшить ответ Сирида или иным образом запутать, хотя я могу понять, почему это произошло, и мои извинения. Вопрос и оба ответа по-прежнему набирают много голосов, поэтому я думаю, что пока оставлю изменения. - person Michael Durrant; 31.12.2012
comment
@MichaelDurrant: было бы неплохо, если бы OP сделал ваш принятый ответ. Я не заинтересован в поддержании своего ответа или соревновании с вашим отличным и хорошо написанным ответом. - person siride; 31.12.2012

Git

Этот ответ включает GitHub, о чем многие спрашивали.

Локальные репозитории

Git (локально) имеет каталог (.git), в который вы фиксируете свои файлы, и это ваш «локальный репозиторий». Это отличается от таких систем, как SVN, где вы сразу же добавляете и фиксируете удаленный репозиторий.

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

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


ветви

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

Форк: с помощью ветки вы контролируете и управляете веткой, тогда как с помощью вилки кто-то другой контролирует принятие кода обратно.

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

Стандартный способ передать ветку в master - это сделать merge. Ветви также можно перебазировать, чтобы «очистить» историю. Это не влияет на текущее состояние и сделано для «более чистой» истории.

По сути, идея состоит в том, что вы отошли от определенной точки (обычно от мастера). С тех пор, как вы разветвились, сам «мастер» переместился вперед из этой точки ветвления. Он будет «чище» (легче решать проблемы и легче понять историю), если все изменения, которые вы сделали в ветке, сопоставляются с текущим состоянием мастера со всеми его последними изменениями. Итак, процесс следующий: сохраните изменения; получить «новый» мастер, а затем повторно применить (это часть rebase) изменения против него. Имейте в виду, что перебазирование, как и слияние, может привести к конфликтам, которые вам придется разрешать вручную (т. Е. Редактировать и исправлять).

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

Отслеживание веток

Это ветви с именем origin/branch_name (а не просто branch_name). Когда вы отправляете и загружаете код в удаленные репозитории или из них, это фактически механизм, с помощью которого это происходит. Например, когда вы git push ветку с именем building_groups, ваша ветка сначала переходит в origin/building_groups, а затем в удаленный репозиторий. Точно так же, если вы выполните git fetch building_groups, полученный файл будет помещен в вашу ветку origin/building_groups. Затем вы можете объединить эту ветку с вашей локальной копией. Наша практика состоит в том, чтобы всегда выполнять git fetch и ручное слияние, а не просто git pull (который выполняет оба вышеперечисленных за один шаг).

Получение новых веток.

Получение новых веток: в начальной точке клона у вас будут все ветки. Однако, если другие разработчики добавляют ветки и отправляют их на удаленный компьютер, должен быть способ «узнать» об этих ветвях и их именах, чтобы иметь возможность извлекать их локально. Это делается через git fetch, который будет получать все новые и измененные ветки в локальный репозиторий с помощью ветвей отслеживания (например, origin/). После fetched можно git branch --remote перечислить ветви отслеживания и git checkout [branch] фактически переключиться на любую заданную.

Слияние

Слияние - это процесс объединения изменений кода из разных ветвей или из разных версий одной и той же ветки (например, когда локальная ветвь и удаленная ветка не синхронизированы). Если кто-то разработал работу в ветке, и работа завершена, готова и протестирована, то ее можно объединить в master ветку. Это делается git checkout master, чтобы переключиться на ветвь master, затем git merge your_branch. Слияние объединит все разные файлы и даже разные изменения в одних и тех же файлах. Это означает, что он фактически изменит код внутри файлов, чтобы объединить все изменения.

При выполнении checkout из master также рекомендуется выполнить git pull origin master, чтобы самая последняя версия удаленного мастера была объединена с вашим локальным мастером. Если удаленный мастер изменился, то есть moved forward, вы увидите информацию, которая отражает это во время этого git pull. Если это так (мастер изменен), вам рекомендуется git checkout your_branch, а затем rebase его освоить, чтобы ваши изменения фактически «воспроизводились» поверх «нового» мастера. Затем вы продолжите обновлять мастер, как показано в следующем абзаце.

Если конфликтов нет, тогда в мастер будут добавлены новые изменения. Если есть конфликты, это означает, что в одних и тех же файлах есть изменения в аналогичных строках кода, которые он не может автоматически объединить. В этом случае git merge new_branch сообщит, что необходимо разрешить конфликт (ы). Вы «разрешаете» их, редактируя файлы (в которых будут оба изменения), выбирая нужные изменения, буквально удаляя строки с нежелательными изменениями и затем сохраняя файл. Изменения отмечены разделителями, например ======== и <<<<<<<<.

Как только вы разрешите любые конфликты, вы снова git add и git commit эти изменения, чтобы продолжить слияние (во время этого процесса вы получите обратную связь от git, которая поможет вам).

Когда процесс не работает должным образом, вы обнаружите, что git merge --abort очень удобен для сброса настроек.

Интерактивное ребазирование и сжатие / переупорядочивание / удаление коммитов

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

Ключевым фактором, который следует оценить при рассмотрении того, следует ли это делать, является то, относятся ли несколько коммитов к одному и тому же файлу или файлов более одного (в этом случае лучше раздавить коммиты). Это делается с помощью интерактивного инструмента перебазирования. Этот инструмент позволяет фиксировать коммиты, удалять коммиты, перефразировать сообщения и т. Д. Например, git rebase -i HEAD~10 (примечание: это ~, а не -) вызывает следующее:

интерактивное перемещение в Git

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

Вилки

Есть два основных подхода к совместной работе в репозиториях Git. Первый, подробно описанный выше, напрямую через ветки, которые люди тянут и отправляют из / в. У этих соавторов свои ключи SSH зарегистрированы в удаленном репозитории. Это позволит им отправлять прямо в этот репозиторий. Обратной стороной является необходимость ведения списка пользователей. Другой подход - разветвление - позволяет любому «разветвить» репозиторий, в основном создавая локальную копию в своей собственной учетной записи репозитория Git. Затем они могут внести изменения и по завершении отправить «pull request» (на самом деле это скорее «push» от них и «pull» запрос для фактического сопровождающего репозитория), чтобы код был принят.

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


GitHub

GitHub (удаленный репозиторий) - это удаленный источник, в который вы обычно отправляете и извлекаете эти зафиксированные изменения, если у вас есть (или добавлены) такой репозиторий, поэтому локальный и удаленный фактически совершенно разные. Другой способ представить себе удаленный репозиторий - это структура каталогов .git, которая находится на удаленном сервере.

Когда вы "разветвляете" - в графическом интерфейсе веб-браузера GitHub вы можете нажать на эту кнопку Изображение кнопки вилки- вы создаете копию («клон») кода в своей учетной записи GitHub. Это может быть немного тонким в первый раз, поэтому убедитесь, что вы смотрите, в чьем репозитории указана база кода - либо первоначальный владелец, либо `` разветвленный '', и вы, например, вот так:

Изображение имени разветвленного репозитория

Когда у вас есть локальная копия, вы можете вносить изменения по своему усмотрению (вытаскивая и отправляя их на локальный компьютер). Когда вы закончите, вы отправляете «запрос на перенос» первоначальному владельцу / администратору репозитория (звучит неплохо, но на самом деле вы просто нажимаете на это:  Изображение кнопки запроса на вытягивание ), и они" втягивают "ее.

Чаще всего команда, работающая над кодом вместе, «клонирует» репозиторий (щелкните значок «копировать» на главном экране репозитория). Затем введите локально git clone и вставьте. Это настроит вас локально, и вы также можете нажать и перетащить в (общее) расположение GitHub.

Клоны

Как указано в разделе на GitHub, клон - это копия репозитория. Когда у вас есть удаленный репозиторий, вы вводите команду git clone против его URL-адреса, а затем получаете локальную копию или клон репозитория. В этом клоне есть все, файлы, основная ветвь, другие ветки, все существующие коммиты и весь шебанг. Именно с этим клоном вы делаете свои добавления и коммиты, а затем сам удаленный репозиторий - это то, на что вы подталкиваете эти коммиты. Именно эта локальная / удаленная концепция делает Git (и подобные ему системы, такие как Mercurial) DVCS (Распределенная система контроля версий) в отличие от более традиционных CVS (систем управления версиями кода), таких как SVN, PVCS, CVS и т. Д., Когда вы делаете коммит непосредственно в удаленный репозиторий.

Визуализация

Визуализацию основных концепций можно увидеть на
http://marklodato.github.com/visual-git-guide/index-en.html и
http://ndpsoftware.com/git-cheatsheet.html#loc=index

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

Вы также можете использовать его для добавления, фиксации и управления своими изменениями!

Изображение интерфейса gitg / gitx

Хотя gitg / gitx довольно минимален, количество инструментов с графическим интерфейсом продолжает расширяться. Многие пользователи Mac используют форк gitx от Brotherbard, а для Linux отличный вариант - smart-git с интуитивно понятным, но мощным интерфейсом:

Изображение графического интерфейса smart-git

Обратите внимание, что даже с помощью инструмента с графическим интерфейсом вы, вероятно, будете выполнять множество команд в командной строке.

Для этого у меня есть следующие псевдонимы в моем ~/.bash_aliases файле (который вызывается из моего ~/.bashrc файла для каждого сеанса терминала):

# git
alias g='git status'
alias gcob='git checkout -b '
alias gcom='git checkout master'
alias gd='git diff'
alias gf='git fetch'
alias gfrm='git fetch; git reset --hard origin/master'
alias gg='git grep '
alias gits='alias | grep "^alias g.*git.*$"'
alias gl='git log'
alias gl1='git log --oneline'
alias glf='git log --name-status'
alias glp='git log -p'
alias gpull='git pull '
alias gpush='git push '

И в моем ~/.gitconfig файле есть следующие псевдонимы git - зачем они?
Так что завершение ветки (с помощью клавиши TAB) работает!

Итак, это:

[alias]
  co = checkout
  cob = checkout -b

Пример использования: git co [branch] ‹- завершение табуляции для веток будет работать.

Инструмент обучения графическому интерфейсу пользователя

Вы можете найти https://learngitbranching.js.org/ полезным для изучения некоторых базовых концепций. Снимок экрана:  введите описание изображения здесь
Видео: https://youtu.be/23JqqcLPss0

## Наконец, 7 ключевых спасателей!

  1. Вы вносите изменения, добавляете и фиксируете их (но не нажимайте), а затем о! вы понимаете, что вы хозяин!

     git reset [filename(s)]
     git checkout -b [name_for_a_new_branch]
     git add [file(s)]
     git commit -m "A useful message"
    
     Voila!  You've moved that 'master' commit to its own branch !
    
  2. Вы испортили некоторые файлы, работая в локальной ветке, и просто хотите вернуться к тому, что у вас было в последний раз, когда вы сделали git pull:

     git reset --hard origin/master  # You will need to be comfortable doing this!
    
  3. Вы начинаете вносить изменения локально, вы редактируете полдюжины файлов, а затем, черт возьми, вы все еще находитесь в главной (или другой) ветке:

     git checkout -b new_branch_name  # just create a new branch
     git add .                      # add the changes files
     git commit -m"your message"    # and commit them
    
  4. Вы испортили один конкретный файл в своей текущей ветке и хотите в основном `` сбросить '' этот файл (потерять изменения) до того, как это было в последний раз, когда вы вытаскивали его из удаленного репозитория:

     git checkout your/directories/filename
    

    На самом деле это сбрасывает файл (как и многие команды Git, он не очень хорошо назван из-за того, что он здесь делает).

  5. Вы вносите некоторые изменения локально, вы хотите быть уверенными, что не потеряете их, пока делаете git reset или rebase: я часто делаю вручную копию всего проекта (cp -r ../my_project ~/), когда не уверен, что могу что-то напутать в Git или потеряете важные изменения.

  6. Вы выполняете перебазирование, но все идет не так:

     git rebase --abort # To abandon interactive rebase and merge issues
    
  7. Добавьте свою ветку Git в приглашение PS1 (см. https://unix.stackexchange.com/a/127800/10043), например

    Изображение приглашения

    Филиал selenium_rspec_conversion.

person Community    schedule 09.02.2012
comment
20.02.12 Добавлена ​​информация о слиянии и перебазировании - person Michael Durrant; 21.05.2012
comment
16.06.12 Добавлен раздел о клонах, чтобы сделать его более полным. - person Michael Durrant; 17.06.2012
comment
19.07.2012 Добавил инфу о ребейзинге. - person Michael Durrant; 25.07.2012
comment
25.07.2012 Добавлена ​​информация о fetch добавлении новых веток в локальный репозиторий. - person Michael Durrant; 25.07.2012
comment
8/8/2012 Дальнейшее улучшение информации по извлечению / слиянию / извлечению. - person Michael Durrant; 06.08.2012
comment
02.09.2012 Добавил кучу инфы по слиянию. - person Michael Durrant; 02.09.2012
comment
9/5 Добавлена ​​информация о сквошинге, включая скриншот. - person Michael Durrant; 06.09.2012
comment
15/11 немного подробнее об извлечении и отслеживании веток - person Michael Durrant; 16.11.2012
comment
Прямо перед разделом «Клоны» есть предложение, которое гласит. Затем введите локально git clone [paste]. Это настроит вас локально, и вы сможете нажать и перетащить каталог в общий каталог github. Что означает каталог push и pull? - person RoyalleBlue; 29.07.2013
comment
Столько текста !! Я буду придерживаться своей простой Subversion :-) - person Jonny; 23.08.2013
comment
Хм? Пользователь Subversion может также написать книгу об использовании Subversion. Я считаю, что Subversion - это устаревшая технология с меньшей функциональностью. Я лично считаю git очень простым в использовании. ymmv - person Michael Durrant; 23.08.2013
comment
Почему бы не использовать git stash вместо cp -r? - person Harvey; 30.08.2013
comment
Вау, Майкл! SO - это обмен знаниями. Спасибо за отличную работу, однозначно +1 - person Michiel; 17.06.2014
comment
Добавлена ​​информация о наличии ветки git в командной строке PS1. - person Michael Durrant; 17.10.2015
comment
Предложение Этот клон имеет все, файлы, главную ветку, другие ветки, все существующие коммиты, весь шебанг, не совсем верно. IMHO, git clone не извлекает все удаленные ветки, а только главную, обычно называемую master. Этот ответ может помочь клонировать все удаленные ветки. Пожалуйста, исправьте, если я ошибаюсь. Спасибо - person dkjain; 10.02.2018
comment
На самом деле я чувствую, что это так. Я имею в виду, что он может изначально не настраивать их локально, а просто иметь их под удаленным, но вы можете отключиться от Интернета и по-прежнему использовать git для проверки любой ветки локально, которая существует с удаленного, на основе последнего времени, когда вы вытаскивали с удаленного. Это когда git великолепен как dvcs, если я правильно понимаю. - person Michael Durrant; 10.02.2018
comment
то есть использование git checkout без -b работает, если ветка существует в «вашей копии» пульта дистанционного управления, в противном случае выдает ошибку (без -b, чтобы создать фактическую новую, которая, конечно, есть). - person Michael Durrant; 10.02.2018
comment
Таким образом, ветка может не «отображаться» локально с git branch, но она действительно существует «локально». Если вы используете git branch -a, вы увидите все ветки с «распакованными» под remotes/. Если вы затем выполните git chckout branch, тогда ветвь будет фактически создана («распакованная форма git») локально. Тогда git branch покажет эту локальную ветку! - person Michael Durrant; 27.04.2019
comment
Обновлена ​​информация о псевдонимах bash и git. - person Michael Durrant; 01.06.2019
comment
@Harvey git stash было бы правильным подходом. Почему-то у меня никогда не было достаточно родного языка, чтобы он стал инструментом, к которому я стремлюсь - person Michael Durrant; 01.06.2019

Вот изображение Оливером Стилом того, как все это сочетается:

введите описание изображения здесь

person Contango    schedule 22.01.2013
comment
Это изображение можно обновить, добавив git clone, который, я уверен, в любом случае знаком большинству людей. - person Contango; 15.02.2013
comment
@Gravitas, мне очень нравится эта графика, но она не сообщает мне, когда файлы перезаписываются и когда они объединяются. Не могли бы вы сообщить мне, что для этих команд? Возможно, команды перезаписи вверху и команды слияния под дисками? Спасибо. - person zylstra; 28.09.2013
comment
Насколько я понимаю, git pull будет извлекать с пульта все, что вы просите (то есть, какую бы магистраль вы ни запрашивали), и мгновенно объединяет это с веткой, в которой вы находитесь, когда вы делаете запрос. Pull - это высокоуровневый запрос, который по умолчанию запускает «выборку», затем «слияние» или перебазирование с помощью «–rebase». Вы могли бы обойтись без этого, это просто удобство. - person Contango; 27.06.2015
comment
Где именно на этой диаграмме будет находиться git clone? Также git merge? Я новичок в git, но мне нравится эта картинка. - person Mishelle; 07.07.2015
comment
Я посмотрю, смогу ли я сделать обновленную версию схемы. - person Contango; 07.07.2015

Вилка против. Клонировать - два слова, оба означающие копию

См. Эту диаграмму. (Источник: http://www.dataschool.io/content/images/2014/Mar/github1.png).

.-------------------------.     1. Fork     .-------------------------.
| Your GitHub repo        | <-------------- | Joe's GitHub repo       |
| github.com/you/coolgame |                 | github.com/joe/coolgame |
| ----------------------- | 7. Pull Request | ----------------------- |
| master -> c224ff7       | --------------> | master -> c224ff7 (c)   |
| anidea -> 884faa1 (a)   |                 | anidea -> 884faa1 (b)   |
'-------------------------'                 '-------------------------'
    |                 ^
    | 2. Clone        |
    |                 |
    |                 |
    |                 |
    |                 |
    |                 | 6. Push (anidea => origin/anidea)
    v                 |
.-------------------------.
| Your computer           |  3. Create branch 'anidea'
| $HOME/coolgame          |
| ----------------------- |  4. Update a file
| master -> c224ff7       |
| anidea -> 884faa1       |  5. Commit (to 'anidea')
'-------------------------'

(a) - after you have pushed it
(b) - after Joe has accepted it
(c) - eventually Joe might merge 'anidea' (make 'master -> 884faa1')

Вилка

  • Копия вашего удаленного репо (облака), которая связывает его с Joe's
  • Копию, которую вы затем можете клонировать в свое локальное репо и F *% $ - вверх
  • Когда вы закончите, вы можете вернуться к своему пульту
  • Затем вы можете спросить Джо, хочет ли он использовать его в своем проекте, щелкнув запрос на включение

Клонировать

  • копия на вашем локальном репо (жесткий диск)
person Timothy L.J. Stewart    schedule 02.09.2016
comment
Обратите внимание, что реальное преимущество DVCS в том, что вам не требуется какое-либо конкретное разрешение на доступ к репозиторию Джо для этого. Если Джо хочет, чтобы вы чаще вносили свой вклад, он мог бы предоставить вам права доступа для push-уведомлений: вы могли бы нажать anidea прямо на его репо и избавить вас от рутинной работы по поддержанию вашего форка в актуальном состоянии. OTOH, если вам не удастся прийти к соглашению с Джо, вы можете просто продолжить разработку и использовать свою вилку (и посмотреть, сможете ли вы заставить его изменить свое мнение позже). - person Alois Mahdal; 06.12.2017

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

Приятно осознавать, что технически клонирование репо и разветвление репо - это одно и то же. Делать:

git clone $some_other_repo

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

Git, как VCS, на самом деле все о клонировании разветвлении. Помимо «простого просмотра» с использованием удаленного пользовательского интерфейса, такого как cgit, очень мало общего с репозиторием git, который не включает разветвление клонирования репо в какой-то момент.

Тем не мение,

  • когда кто-то говорит Я форк репо X, это означает, что он создал клон репо где-то еще с намерением предоставить его другим, например, чтобы показать некоторые эксперименты, или применить другой механизм контроля доступа (например, разрешить сотрудничать людям без доступа к Github, но с внутренней учетной записью компании).

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

    Тот факт, что он, скорее всего, будет содержать другой набор веток, тегов или коммитов, скорее всего, является причиной, по которой они сделали это в первую очередь.

    (То, что Github делает, когда вы нажимаете «форк», - это просто клонирование с добавлением сахара: он клонирует репо для вас, помещает его под вашу учетную запись, записывает откуда-то «разветвленный», добавляет удаленный объект с именем «upstream» и, что наиболее важно, играет красивую анимацию.)

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

Прелесть Git в том, что в нем все это идеально сочетается: все эти репозитории имеют общую часть цепочки фиксации block, поэтому можно безопасно (см. Примечание ниже) объединять изменения между всеми этими репозиторий по своему усмотрению.


Примечание: «безопасно», пока вы не переписываете общую часть цепочки и пока изменения не конфликтуют.

person Alois Mahdal    schedule 23.07.2015