Робота з гілками

список гілок:
git branch
Подивитися останні коміти
git branch -v
Створити нову гілку 'iss53' і перейти в неї
$ git branch iss53
$ git checkout iss53
Або скорочено:
$ git checkout -b iss53
Switched to a new branch "iss53"
Правимо файли, тестуємо... Коммітимо:
$ git commit -a -m 'added chahges for [issue 53]'
Коли робота закінчена і перевірена працездатність, перемикаємося на основну гілку і зливаемо зміни:
$ git checkout main
Switched to branch 'main'
$ git merge iss53
Якщо гілка 'iss53' більше не потрібна - видаляємо її.
$ git branch -d iss53
Перенести зміни з поточної гілки в іншу
Якщо ми почали робити зміни, а потім зрозуміли, що краще треба було це робити в іншій гілці... або Якщо ми зробили зміни, забувши забрати останні оновлення з сервера... Тобто, є змінені файли в гілці main
. Їх ще не додали для відстеження (під час запуску команди git status
вони підсвічуються червоним).
Переносимо зміни з гілки main
в іншу, наприклад temp
. Створюємо її, та переходимо в неї, додаємо змінені файли для відстеження в цій гілці, комітимо:
git checkout -b temp
git add --all
git commit -m "move changes to temp"
На цьому кроці ми в temp
зі збереженими зміненими файлами, а main
- очистилася від змін. Ми можемо продовжити та закінчити роботу в temp
. Можемо повернутися в main
, щоб отримати оновлення з сервера, а потім злити з тими що перенесли в temp
:
git checkout main
git pull origin main
git merge temp
Опции --merged
и --no-merged
могут отфильтровать этот список для вывода только тех веток, которые слиты или ещё не слиты в текущую ветку. Чтобы посмотреть те ветки, которые вы уже слили с текущей, можете выполнить команду git branch --merged
:
$ git branch --merged
iss53
* master
Ветка iss53
присутствует в этом списке потому что вы ранее слили её в master
. Те ветки из этого списка, перед которыми нет символа *
, можно смело удалять командой git branch -d
; наработки из этих веток уже включены в другую ветку, так что ничего не потеряется.
Чтобы увидеть все ветки, содержащие наработки, которые вы пока ещё не слили в текущую ветку, выполните команду git branch --no-merged
:
$ git branch --no-merged
testing
Вы увидите оставшуюся ветку. Так как она содержит ещё не слитые наработки, попытка удалить её командой git branch -d
приведёт к ошибке:
$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.
Если вы действительно хотите удалить ветку вместе со всеми наработками, используйте опцию -D
, как указано в подсказке.
Подсказка
Если в качестве аргумента не указан коммит или ветка, то опции --merged
и --no-merged
покажут что уже слито или не слито с вашей текущей веткой соответственно.
Вы всегда можете указать дополнительный аргумент для вывода той же информации, но относительно указанной ветки предварительно не извлекая и не переходя на неё.
$ git checkout testing
$ git branch --no-merged master
topicA
featureB
Переименование ветки
Внимание
Не переименовывайте ветки, которые всё ещё используются другими участниками. Не переименовывайте ветку в master/main/mainline, не прочитав раздел «Изменение имени главной ветки».
Предположим, у вас есть ветка с именем bad-branch-name
, и вы хотите изменить её на corrected-branch-name
, сохранив при этом всю историю. Вместе с этим, вы также хотите изменить имя ветки на удалённом сервере (GitHub, GitLab или другой сервер). Как это сделать?
Переименуйте ветку локально с помощью команды git branch --move
:
$ git branch --move bad-branch-name corrected-branch-name
Ветка bad-branch-name
будет переименована в corrected-branch-name
, но это изменение пока только локальное. Чтобы все остальные увидели исправленную ветку в удалённом репозитории, отправьте её туда:
$ git push --set-upstream origin corrected-branch-name
Теперь проверим, где мы сейчас находимся:
$ git branch --all
* corrected-branch-name
main
remotes/origin/bad-branch-name
remotes/origin/corrected-branch-name
remotes/origin/main
Обратите внимание, что текущая ветка corrected-branch-name
, которая также присутствует и на удалённом сервере. Однако, старая ветка всё ещё по-прежнему там, но её можно удалить с помощью команды:
$ git push origin --delete bad-branch-name
Теперь старое имя ветки полностью заменено исправленным.
Изменение имени главной ветки
Предупреждение
Изменение имени ветки, например master/main/mainline/default, сломает интеграции, службы, вспомогательные утилиты и скрипты сборки, которые использует ваш репозиторий. Прежде чем сделать это, обязательно проконсультируйтесь с коллегами. Также убедитесь, что вы выполнили тщательный поиск в своём репозитории и обновили все ссылки на старое имя ветки в вашем коде или скриптах.
Переименуйте локальную ветку master
в main
с помощью следующей команды:
$ git branch --move master main
После этого, локальной ветки master
больше не существует, потому что она была переименована в ветку main
.
Чтобы все остальные могли видеть новую ветку main
, вам нужно отправить её в общий репозиторий. Это делает переименованную ветку доступной в удалённом репозитории.
$ git push --set-upstream origin main
В итоге, состояние репозитория становится следующим:
$ git branch --all
* main
remotes/origin/HEAD -> origin/master
remotes/origin/main
remotes/origin/master
Ваша локальная ветка master
исчезла, так как она заменена веткой main
. Ветка main
доступна в удалённом репозитории. Старая ветка master
всё ещё присутствует в удалённом репозитории. Остальные участники будут продолжать использовать ветку master
в качестве основы для своей работы, пока вы не совершите ряд дополнительных действий.
Теперь, для завершения перехода на новую ветку перед вами стоят следующие задачи:
Все проекты, которые зависят от текущего, должны будут обновить свой код и/или конфигурацию.
Обновите конфигурацию всех запускаемых тестов.
Исправьте скрипты сборки и публикации артефактов.
Поправьте настройки репозитория на сервере: задайте новую ветку по умолчанию, обновите правила слияния, а также прочие настройки, которые зависят от имени веток.
Обновите документацию, исправив ссылки, указывающие на старую ветку.
Слейте или отмените запросы на слияние изменений, нацеленные на старую ветку.
После того, как вы выполнили все эти задачи и уверены, что ветка main
работает так же, как ветка master
, вы можете удалить ветку master
:
$ git push origin --delete master
Объяснение полезных Git команд с помощью визуализации
Merge
Fast-forward (--ff)
No-fast-foward (--no-ff)
Merge конфликты
Rebase
Interactive Rebase Reset
Soft reset
Hard reset
Revert
Cherry-pick
Fetch
Pull
Reflog
(git-scm.com/book 🔗)
Last updated