Git branch m main что это
Перейти к содержимому

Git branch m main что это

  • автор:

Основы Git, которые используется для работы с ветками

Команда git branch -M main используется для переименования текущей ветки в main.

git branch -M main 

В этой команде, branch это команда Git, которая используется для работы с ветками. Опция -M означает «переименовать», и main — это новое имя для ветки.

Эта команда полезна, например, при переходе с использования термина master для главной ветки на использование термина main, что стало общепринятой практикой в сообществе разработчиков для избегания негативной коннотации слова «master».

Важно отметить, что эту команду следует выполнять, находясь в ветке, которую вы хотите переименовать.

Команда git branch используется в системе контроля версий Git для перечисления, создания или удаления ветвей.

Если вы запустите git branch без дополнительных параметров, она просто выведет список всех ветвей в вашем текущем репозитории. Текущая ветка (то есть ветка, на которой вы сейчас находитесь) будет отмечена звездочкой и выделена.

git branch 

Результат может выглядеть так:

 develop * main feature/new-feature 

В этом примере у нас есть три ветки: develop, main и feature/new-feature. Текущая ветка — main, как указано звездочкой и выделением.

Вы также можете использовать git branch с дополнительными параметрами для создания новых веток:

git branch new-branch-name 

или удаления существующих:

git branch -d branch-name-to-delete 

D00M4ACE GitHub D00M4ACE Telegram D00M4ACE YouTube

Copyright d00m4ace © 2024

3.1 Ветвление в Git — О ветвлении в двух словах

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

Некоторые люди, говоря о модели ветвления Git, называют её «киллер-фича», что выгодно выделяет Git на фоне остальных систем контроля версий. Что в ней такого особенного? Ветвление Git очень легковесно: операция создания ветки выполняется почти мгновенно, переключение между ветками туда-сюда, обычно, также быстро. В отличие от многих других систем контроля версий, Git поощряет процесс работы, при котором ветвление и слияние выполняется часто, даже по несколько раз в день. Понимание и владение этой функциональностью дает вам уникальный и мощный инструмент, который может полностью изменить привычный процесс разработки.

О ветвлении в двух словах

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

Как вы можете помнить из Что такое Git?, Git не хранит данные в виде последовательности изменений, он использует набор снимков (snapshot).

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

Предположим, у вас есть каталог с тремя файлами и вы добавляете их все в индекс и создаёте коммит. Во время индексации вычисляется контрольная сумма каждого файла (SHA-1 как мы узнали из Что такое Git?), затем каждый файл сохраняется в репозиторий (Git называет такой файл блоб — большой бинарный объект), а контрольная сумма попадёт в индекс:

$ git add README test.rb LICENSE $ git commit -m 'Initial commit'

Когда вы создаёте коммит командой git commit , Git вычисляет контрольные суммы каждого подкаталога (в нашем случае, только основной каталог проекта) и сохраняет его в репозитории как объект дерева каталогов. Затем Git создаёт объект коммита с метаданными и указателем на основное дерево проекта для возможности воссоздать этот снимок в случае необходимости.

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

Коммит и его дерево

Рисунок 9. Коммит и его дерево

Если вы сделаете изменения и создадите ещё один коммит, то он будет содержать указатель на предыдущий коммит.

Коммит и его родители

Рисунок 10. Коммит и его родители

Ветка в Git — это простой перемещаемый указатель на один из таких коммитов. По умолчанию, имя основной ветки в Git — master . Как только вы начнёте создавать коммиты, ветка master будет всегда указывать на последний коммит. Каждый раз при создании коммита указатель ветки master будет передвигаться на следующий коммит автоматически.

Примечание

Ветка «master» в Git — это не какая-то особенная ветка. Она точно такая же, как и все остальные ветки. Она существует почти во всех репозиториях только лишь потому, что её создаёт команда git init , а большинство людей не меняют её название.

Ветка и история коммитов

Рисунок 11. Ветка и история коммитов

Создание новой ветки

Что же на самом деле происходит при создании ветки? Всего лишь создаётся новый указатель для дальнейшего перемещения. Допустим вы хотите создать новую ветку с именем testing . Вы можете это сделать командой git branch :

$ git branch testing

В результате создаётся новый указатель на текущий коммит.

Две ветки указывают на одну и ту же последовательность коммитов

Рисунок 12. Две ветки указывают на одну и ту же последовательность коммитов

Как Git определяет, в какой ветке вы находитесь? Он хранит специальный указатель HEAD . Имейте ввиду, что в Git концепция HEAD значительно отличается от других систем контроля версий, которые вы могли использовать раньше (Subversion или CVS). В Git — это указатель на текущую локальную ветку. В нашем случае мы всё ещё находимся в ветке master . Команда git branch только создаёт новую ветку, но не переключает на неё.

HEAD указывает на ветку

Рисунок 13. HEAD указывает на ветку

Вы можете легко это увидеть при помощи простой команды git log , которая покажет вам куда указывают указатели веток. Эта опция называется —decorate .

$ git log --oneline --decorate f30ab (HEAD -> master, testing) Add feature #32 - ability to add new formats to the central interface 34ac2 Fix bug #1328 - stack overflow under certain conditions 98ca9 Initial commit

Здесь можно увидеть указывающие на коммит f30ab ветки: master и testing .

Переключение веток

Для переключения на существующую ветку выполните команду git checkout . Давайте переключимся на ветку testing :

$ git checkout testing

В результате указатель HEAD переместится на ветку testing .

HEAD указывает на текущую ветку

Рисунок 14. HEAD указывает на текущую ветку

Какой в этом смысл? Давайте сделаем ещё один коммит:

$ vim test.rb $ git commit -a -m 'made a change'

Указатель на ветку HEAD переместился вперёд после коммита

Рисунок 15. Указатель на ветку HEAD переместился вперёд после коммита

Интересная ситуация: указатель на ветку testing переместился вперёд, а master указывает на тот же коммит, где вы были до переключения веток командой git checkout . Давайте переключимся назад на ветку master :

$ git checkout master

Примечание
git log не показывает все ветки по умолчанию

Если выполнить команду git log прямо сейчас, то в её выводе только что созданная ветка «testing» фигурировать не будет.

Ветка никуда не исчезла; просто Git не знает, что именно она вас интересует, и выводит наиболее полезную по его мнению информацию. Другими словами, по умолчанию git log отобразит историю коммитов только для текущей ветки.

Для просмотра истории коммитов другой ветки необходимо явно указать её имя: git log testing Чтобы посмотреть историю по всем веткам — выполните команду с дополнительным флагом: git log —all .

HEAD перемещается когда вы делаете checkout

Рисунок 16. HEAD перемещается когда вы делаете checkout

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

Примечание
Переключение веток меняет файлы в рабочем каталоге

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

Давайте сделаем ещё несколько изменений и создадим очередной коммит:

$ vim test.rb $ git commit -a -m 'made other changes'

Теперь история вашего проекта разошлась (см Разветвлённая история). Вы создали ветку и переключились на неё, поработали, а затем вернулись в основную ветку и поработали в ней. Эти изменения изолированы друг от друга: вы можете свободно переключаться туда и обратно, а когда понадобится — объединить их. И всё это делается простыми командами: branch , checkout и commit .

Разветвлённая история

Рисунок 17. Разветвлённая история

Все описанные действия можно визуализировать с помощью команды git log . Для отображения истории коммитов, текущего положения указателей веток и истории ветвления выполните команду git log —oneline —decorate —graph —all .

$ git log --oneline --decorate --graph --all * c2b9e (HEAD, master) Made other changes | * 87ab2 (testing) Made a change |/ * f30ab Add feature #32 - ability to add new formats to the central interface * 34ac2 Fix bug #1328 - stack overflow under certain conditions * 98ca9 initial commit of my project

Ветка в Git — это простой файл, содержащий 40 символов контрольной суммы SHA-1 коммита, на который она указывает; поэтому операции с ветками являются дешёвыми с точки зрения потребления ресурсов или времени. Создание новой ветки в Git происходит так же быстро и просто как запись 41 байта в файл (40 знаков и перевод строки).

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

Давайте посмотрим, почему и вам имеет смысл делать так же.

Примечание
Одновременное создание новой ветки и переключение на неё

Как правило, при создании новой ветки вы хотите сразу на неё переключиться — это можно сделать используя команду git checkout -b .

Примечание

Начиная с Git версии 2.23, вы можете использовать git switch вместо git checkout , чтобы:

  • Переключиться на существующую ветку: git switch testing-branch .
  • Создать новую ветку и переключиться на неё: git switch -c new-branch . Флаг -c означает создание, но также можно использовать полный формат:` —create`.
  • Вернуться к предыдущей извлечённой ветке: git switch — .

3.2 Ветвление в Git — Основы ветвления и слияния

Давайте рассмотрим простой пример рабочего процесса, который может быть полезен в вашем проекте. Ваша работа построена так:

  1. Вы работаете над сайтом.
  2. Вы создаете ветку для реализации новой функциональности в соответствии с пользовательской историей.
  3. Вы работаете в этой ветке.

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

  1. Переключиться на основную ветку.
  2. Создать ветку для добавления исправления.
  3. После тестирования слить ветку, содержащую исправление, с основной веткой.
  4. Переключиться назад в ветку для реализации пользовательской истории и продолжить работать.

Основы ветвления

Предположим, вы работаете над проектом и уже имеете несколько коммитов.

Простая история коммитов

Рисунок 18. Простая история коммитов

Вы выбрали задачу #53 из какая-там-у-вас-система-отслеживания-задач. Чтобы создать ветку и сразу переключиться на неё, можно выполнить команду git checkout с параметром -b :

$ git checkout -b iss53 Switched to a new branch "iss53"

Это то же самое, что и:

$ git branch iss53 $ git checkout iss53

Создание нового указателя ветки

Рисунок 19. Создание нового указателя ветки

Вы работаете над сайтом и делаете коммиты. Это приводит к тому, что ветка iss53 движется вперед, так как вы переключились на неё ранее ( HEAD указывает на неё).

$ vim index.html $ git commit -a -m 'Create new footer [issue 53]'

Ветка iss53 двигается вперед

Рисунок 20. Ветка iss53 движется вперед

И тут вы получаете сообщение об обнаружении на сайте уязвимости, и эту уязвимость устранить нужно немедленно. Благодаря Git вам не придётся ни пытаться реализовать исправление вместе с изменениями, которые вы сделали в ходе разработки iss53 , ни прилагать усилия для отката этих изменений и возвращения к исходному состоянию перед началом разработки исправления. Все, что вам нужно — переключиться на ветку master .

Имейте в виду, что если рабочий каталог или индекс содержат незафиксированные изменения, конфликтующие с веткой, на которую вы хотите переключиться, то Git не позволит переключить ветки. Лучше всего переключаться из чистого рабочего состояния проекта: все изменённые файлы добавить в индекс и сделать коммит. Есть способы обойти это (припрятать изменения (stash) или добавить их в последний коммит (amend)), но об этом мы поговорим позже в разделе Припрятывание и очистка главы 7. Теперь предположим, что вы зафиксировали все свои изменения и можете переключиться на ветку master :

$ git checkout master Switched to branch 'master'

С этого момента ваш рабочий каталог имеет точно такой же вид, какой был перед началом работы над задачей #53, и вы можете сосредоточиться на работе над исправлением. Важно запомнить: когда вы переключаете ветки, Git возвращает состояние рабочего каталога к тому виду, какой он имел в момент последнего коммита в переключаемую ветку. Он добавляет, удаляет и изменяет файлы автоматически, чтобы состояние рабочего каталога соответствовало тому, когда был сделан последний коммит.

Теперь вы можете перейти к написанию исправления. Давайте создадим новую ветку, в которой реализуем исправление.

$ git checkout -b hotfix Switched to a new branch 'hotfix' $ vim index.html $ git commit -a -m 'Fix broken email address' [hotfix 1fb7853] Fix broken email address 1 file changed, 2 insertions(+)

Ветка hotfix основана на ветке `master`

Рисунок 21. Ветка hotfix основана на ветке master

Вы можете прогнать тесты, чтобы убедиться, что ваше уязвимость в самом деле исправлена. И если это так — выполнить слияние ветки hotfix с веткой master для включения изменений в продукт. Это делается командой git merge :

$ git checkout master $ git merge hotfix Updating f42c576..3a0874c Fast-forward index.html | 2 ++ 1 file changed, 2 insertions(+)

Заметили фразу «fast-forward» в этом слиянии? Git просто переместил указатель ветки вперед, потому что коммит C4 , на который указывает слитая ветка hotfix , был прямым потомком коммита C2 , на котором вы находились до этого. Другими словами, если коммит сливается с тем, до которого можно добраться, двигаясь по истории вперёд, Git упрощает слияние, просто перенося указатель ветки вперед, потому что в этом случае нет никаких разнонаправленных изменений, которые нужно было бы свести воедино. Это называется «fast-forward».

Теперь ваши изменения включены в коммит, на который указывает ветка master , и исправление можно внедрять.

`master` перемотан до `hotfix`

Рисунок 22. master перемотан до hotfix

После внедрения вашего архиважного исправления вы готовы вернуться к работе над тем, что были вынуждены отложить. Но сначала нужно удалить ветку hotfix , потому что она больше не нужна — ветка master указывает на то же самое место. Для удаления ветки выполните команду git branch с параметром -d :

$ git branch -d hotfix Deleted branch hotfix (3a0874c).

Теперь вы можете переключиться обратно на ветку iss53 и продолжить работу над задачей #53:

$ git checkout iss53 Switched to branch "iss53" $ vim index.html $ git commit -a -m 'Finish the new footer [issue 53]' [iss53 ad82d7a] Finish the new footer [issue 53] 1 file changed, 1 insertion(+)

Продолжение работы над `iss53`

Рисунок 23. Продолжение работы над iss53

Стоит обратить внимание на то, что все изменения из ветки hotfix не включены в вашу ветку iss53 . Если их нужно включить, вы можете влить ветку master в вашу ветку iss53 командой git merge master , а можете отложить слияние этих изменений до завершения работы, и затем влить ветку iss53 в master .

Основы слияния

Предположим, вы решили, что работа по проблеме #53 закончена и её можно влить в ветку master . Для этого нужно выполнить слияние ветки iss53 точно так же, как вы делали это с веткой hotfix ранее. Все, что нужно сделать — переключиться на ветку, в которую вы хотите включить изменения, и выполнить команду git merge :

$ git checkout master Switched to branch 'master' $ git merge iss53 Merge made by the 'recursive' strategy. index.html | 1 + 1 file changed, 1 insertion(+)

Результат этой операции отличается от результата слияния ветки hotfix . В данном случае процесс разработки ответвился в более ранней точке. Так как коммит, на котором мы находимся, не является прямым родителем ветки, с которой мы выполняем слияние, Git придётся немного потрудиться. В этом случае Git выполняет простое трёхстороннее слияние, используя последние коммиты объединяемых веток и общего для них родительского коммита.

Использование трёх снимков при слиянии

Рисунок 24. Использование трёх снимков при слиянии

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

Коммит слияния

Рисунок 25. Коммит слияния

Теперь, когда изменения слиты, ветка iss53 больше не нужна. Вы можете закрыть задачу в системе отслеживания ошибок и удалить ветку:

$ git branch -d iss53

Основные конфликты слияния

Иногда процесс не проходит гладко. Если вы изменили одну и ту же часть одного и того же файла по-разному в двух объединяемых ветках, Git не сможет их чисто объединить. Если ваше исправление ошибки #53 потребовало изменить ту же часть файла что и hotfix , вы получите примерно такое сообщение о конфликте слияния:

$ git merge iss53 Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.

Git не создал коммит слияния автоматически. Он остановил процесс до тех пор, пока вы не разрешите конфликт. Чтобы в любой момент после появления конфликта увидеть, какие файлы не объединены, вы можете запустить git status :

$ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add . " to mark resolution) both modified: index.html no changes added to commit (use "git add" and/or "git commit -a")

Всё, где есть неразрешённые конфликты слияния, перечисляется как неслитое. В конфликтующие файлы Git добавляет специальные маркеры конфликтов, чтобы вы могли исправить их вручную. В вашем файле появился раздел, выглядящий примерно так:

contact : email.support@github.com
=======
please contact us at support@github.com
>>>>>>> iss53:index.html

Это означает, что версия из HEAD (вашей ветки master , поскольку именно её вы извлекли перед запуском команды слияния) — это верхняя часть блока (всё, что над ======= ), а версия из вашей ветки iss53 представлена в нижней части. Чтобы разрешить конфликт, придётся выбрать один из вариантов, либо объединить содержимое по-своему. Например, вы можете разрешить конфликт, заменив весь блок следующим:

 
please contact us at email.support@github.com

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

Если вы хотите использовать графический инструмент для разрешения конфликтов, можно запустить git mergetool , который проведет вас по всем конфликтам:

$ git mergetool This message is displayed because 'merge.tool' is not configured. See 'git mergetool --tool-help' or 'git help config' for more details. 'git mergetool' will now attempt to use one of the following tools: opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge Merging: index.html Normal merge conflict for 'index.html': : modified file : modified file Hit return to start merge resolution tool (opendiff):

Если вы хотите использовать инструмент слияния не по умолчанию (в данном случае Git выбрал opendiff , поскольку команда запускалась на Mac), список всех поддерживаемых инструментов представлен вверху после фразы «one of the following tools». Просто введите название инструмента, который хотите использовать.

Примечание

Мы рассмотрим более продвинутые инструменты для разрешения сложных конфликтов слияния в разделе Продвинутое слияние главы 7.

После выхода из инструмента слияния Git спросит об успешности процесса. Если вы ответите скрипту утвердительно, то он добавит файл в индекс, чтобы отметить его как разрешённый. Теперь можно снова запустить git status , чтобы убедиться в отсутствии конфликтов:

$ git status On branch master All conflicts fixed but you are still merging. (use "git commit" to conclude merge) Changes to be committed: modified: index.html

Если это вас устраивает и вы убедились, что все файлы, где были конфликты, добавлены в индекс — выполните команду git commit для создания коммита слияния. Комментарий к коммиту слияния по умолчанию выглядит примерно так:

Merge branch 'iss53' Conflicts: index.html # # It looks like you may be committing a merge. # If this is not correct, please remove the file # .git/MERGE_HEAD # and try again. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # All conflicts fixed but you are still merging. # # Changes to be committed: # modified: index.html #

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

Git: коммиты, ветки и перемещение между ними

Вот мы и добрались, пожалуй, до самой важной процедуры — сохранения изменений или коммит. Для того чтобы понять, что такое коммит — нужно дать еще немного теории об объектах git. В git существуют четыре объекта:

  1. Blob — объект, содержащий длину содержимого файла и само содержимое;
  2. Tree — объект, содержащий данные о состоянии директорий и поддиректорий проекта;
  3. Commit — ссылка на корневое дерево. Так как объект Tree хранит в себе иерархию нижележащих объектов, корень проекта — содержит всю иерархию проекта, поэтому на него ссылается коммит;
  4. Annotated Tag — логическая разметка для маркирования состояний объектов в git.

У всех git-объектов есть уникальные хеш-номера, закодированные алгоритмом SHA1. Они служат в качестве ссылок, чтобы одни git-объекты могли ссылаться на другие git-объекты, формируя тем самым дерево. Git интерпретирует структуру директорий вашего проекта, как дерево состоящие из blob и tree объектов, связанных между собой хеш-линками, а коммит ссылает на корень дерева.

Каждый раз, когда вы сохраняете в репозитории состояние проекта — git отстраивает новое дерево с новыми объектами в нём с уникальными хеш-значениями. Вот пример git-структуры простого проекта, состоящего из двух директорий и пяти файлов:

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

Внутренние устройство коммита

Давайте, более детально разберемся в том, из чего состоит коммит. Коммит состоит из шести элементов:

  1. Указатель коммита — SHA1-хеш, который идентифицирует коммит;
  2. Email и имя автора — данные вносятся автоматически на основании параметров git config;
  3. Описание коммита — здесь указываются изменения, которые были внесены, версия коммита и иные данные, которые помогут понять, что коммит содержит;
  4. Дерево — это хеш-ссылка на корневое дерево проекта, которое содержит структуру всего проекта;
  5. Родительский коммит — это хеш-ссылка на предыдущий коммит;
  6. HEAD — указатель на текущую версию проекта, которая находится в рабочей директории проекта.

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

Итак, теперь, когда мы имеем представление о том, что такое коммит и как он работает — можно создавать первый коммит с помощью команды git commit -m “< message >» . Можно конечно и не указывать ключ -m, но тогда вам придётся работать с текстовым редактором в терминале — это не всегда удобно, поэтому проще использовать ключ -m.

После выполнения коммита в терминал будет выведен отчет о том, какие файлы были добавлены в репозиторий:

Просмотреть историю коммитов и сведений о них можно с помощью команды git log. Команда вернет список коммитов, их хеш-ссылки, описание коммитов и указатель HEAD:

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

Одна из основных фишек git — это перемещение между коммитами. Посмотрим, как это можно сделать.

Перемещение между коммитами

Напомним, что git сохраняет изменения в файле в репозитории целиком, что позволяет перемещаться между коммитами командой git checkout [commit hesh]. Узнать хеш коммита можно командой git log. Перемещаться между коммитами можно для просмотра удаленных частей кода или восстановления удаленных файлов.

Вообще, откреплять HEAD от ветки не рекомендуется, но это можно сделать для восстановления удаленных файлов. Откатываться назад и коммитить там — нельзя. Оно получится, но вы не увидите изменений в основной ветке. Перемещение между коммитами сделано только для ознакомления с состоянием файлов в прошлом, а вот перемещение между ветками — это базовая и очень полезная фишка git.

Познакомимся с концепцией ветвей в git.

Ветви

Ветка, в терминологии git, — это ссылка на последний коммит. Указатель HEAD ссылается на ветку, ветка ссылается на последний коммит. Ветки нужны для независимой работы разработчиков над своими зонами ответственности. Например, ваш проект имеет бэкенд и фронтенд части и, очевидно, над ними работают разные команды. В репозитории заводятся 2 разные ветки проекта: main и dev. Графически, эту структуру можно представить так:

Main — основная ветка проекта, в которой находится код рабочего (продакшн) проекта, а в ветке dev — ведется разработка нового функционала, чтобы разграничить команды, в ветке dev можно создать еще 2 ветки: frontend и backend. Теперь команды могут независимо друг от друга разрабатывать новый функционал, тестировать его, а после влить в основную ветку. Мы же сделали немного по другому: в ветке flask — мы будем разрабатывать web-часть нашего проекта, а в ветке cli — терминальную часть проекта.

Существуют общепринятые правила именования веток. Так, основная ветка проекта называется main. В gitHUB по умолчанию используется именно такое название, однако в git до сих пор по умолчанию основная ветка называется master. Исправить ситуацию можно двумя путями:

  • Указать в конфигурационном файле git дефолтное название ветки. Сделать это можно командой git config —global init.defaultBranch main.
  • Переименовать вручную ветку master в main, командой git branch -m master main.

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

Создание новых веток

Отлично, мы переименовали ветку master в main командой git branch -m master main . Теперь создадим несколько новых веток согласно нашей схеме проекта с помощью команд git branch [branch name]: git branch flask , git branch cli . Теперь выполним команду git branch -a , чтобы просмотреть список доступных веток:

Из вывода команды git branch -a видно, что теперь у нас есть три ветки и мы сейчас находимся в ветке main, чтобы перейти в другую ветку нужно использовать команду git checkout [branch name] . Можно воспользоваться комбинированной командой git branch -b [branch name] для создания и автоматического перемещения в новую ветку.

Теперь с помощью команды git log посмотрим историю изменений. Мы увидим, что HEAD ссылается на ту ветку, где мы сейчас находимся, но также появились ещё две новые ветки: flask и cli, которые также связаны с последним коммитом:

Теперь, когда мы будем разрабатывать и тестировать web-часть нашего приложения — мы это будем делать в ветке flask, в основной ветке эти файлы отражаться не будут. После того как мы закончим разработку web-части нам необходимо слить ветки flask и main.

Слияние веток

Слияние веток или merge (мердж) — это создание коммита в основной ветке, который содержит ссылки на два родительских коммита: последний коммит в основной ветке и последний коммит в ветке, где разрабатывался функционал, который нужно интегрировать в основную ветку.

Графически процесс слияния веток можно представить так:

Технически тут происходит следующие: берутся все изменения веток flask и main, создается специальный мердж коммит в ветке main у которого прописаны два родительских коммита: коммит 9 из основной ветки и коммит 5 из ветки flask. Так при создании мердж коммита сохраняется история предыдущих коммитов в обеих ветках и при вызове команды git log вы будете видеть коммиты в обеих ветках.

Сливаются ветки командой git merge -m «commit text» [feature branch] , при этом вы должны находится в основной ветке, в которую нужно влить фиче-ветку. Если конфликтов слияния нет — вы увидите следующий вывод в терминале, в котором будет содержаться информация о стратегии слияния и файлах, которые были добавлены в репозиторий:

После успешного слияния можно выполнить команду git log и убедиться в том, что теперь коммиты фиче-ветки видны в основной ветке:

После слияния веток, фиче-ветка больше не нужна и её можно удалить командой git branch -d [branch name] . Вы можете столкнуться с проблемами слияния веток, когда изменения в один и тот же файлы вносились в разных ветках — тогда git выведет ошибку слияния и вам нужно будет вручную устранять расхождения в разных версиях файла в разных ветках.

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

Базовые команды git и работа с его объектами

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

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

Команды работы с репозиторием:

  • git init — инициализация репозитория;
  • git status — просмотр актуального состояния репозитория git. Эта команда показывает, какие файлы были изменены, какие файлы находятся в индексе, а какие файлы вообще не трекаются гитом;
  • git add [file name] — добавление файла или файлов в индекс, подготовка их для коммита. Если нужно добавить все файлы из директории используется оператор точка — git add .;
  • git commit -m “[ message ]» — создать коммит и указать его описание;
  • git log — просмотреть сделанные коммиты и информацию о них;
  • git checkout [commit hash ] — перейти в нужную версию проекта или коммит по его хешу, который отражается в выводе команды git log
  • git cat-file -t [hash git-object] — посмотреть тип git-объекта по хешу;
  • git cat-file -p [hash git-object] — прочитать содержимое файлов git-объектов по хешу.

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

  • git branch [branch name] — создать ветку;
  • git branch -a — просмотреть все доступные ветки;
  • git branch -m [branch name] [branch name] — переименовать ветку;
  • git checkout [branch name ] — перейти в другую ветку;
  • git branch -b [branch name] — создать новую ветку и переместиться в неё;
  • git branch -d [branch name] — удалить ветку по имени;
  • git merge -m «commit text» [feature branch] — слить ветки, используя стандартную стратегию git-слияния.

Команды настройки git:

  • git config —global init.defaultBranch [branch name] — задать название метки по умолчанию;
  • git config —global user.name [имя пользователя] — задать имя пользователя глобально, для всех репозиториев на локальной машине;
  • git config —global user.email [электронная почта пользователя] — задать электронную почту пользователя глобально, для всех репозиториев на локальной машине.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *