[git] Работа с ветками - rsajob/docs GitHub Wiki

Связывание веток

Отправить локальную ветку в удалённый репозиторий
git push origin feature # связь между ними не создаётся
git push -u origin feature # -u - привязать локальную ветку к удалённой
Выкачиваем и отслеживаем ветку из удалённого репозитория
 git checkout --track origin/feature
 git checkout --track -b my-feature origin/_feature # имя локальной ветки делаем my-feature
Cвязать существующую локальную ветку с существующей удаленной:
git branch -u upstream/feature feature

или

git branch --set-upstream feature origin/feature

Создание/Удаление/Редактирование веток

Создать новую ветку и переключится на неё
git branch feature
Переключится на ветку
git checkout feature
Создать новую ветку, переключится на неё и перенести в неё все не закомитеные текущие изменения

Например приступая к работе с новой фичей (или исправляя баг), ответвляемся (щас стоим на мастере)

git checkout -b new_branch
Удаляем ветку
git branch -d feature # В локальном репозитории
git push origin :feature # В удалённом репозитории

Если ветка в удалённом репозитории не удаляется из-за того что она по умолчанию, то нужно в начале переключить удалённый репозиторий на новую ветку, для этого надо в удалённом репозитории сделать (т.е. зайти непосредственно на сервер где лежит удалённый репозиторий):

git symbolic-ref HEAD refs/heads/mybranch

Бывает что в удалёном репозитории ветки удалены а в локальном они продолжают отслеживаться. Если сделать комманду

git remote show origin

то в разделе Remote branches: могут находится ветки подобно этому

Remote branches:
    master                          tracked
    refs/remotes/origin/old_br stale (use 'git remote prune' to remove)

поэтому для удаления этих не актуальных веток нужно сделать

git remote prune origin

При просмотре git br -a иногда есть такая ветка remotes/origin/HEAD -> origin/master или чтото подобное. Она появляется обычно после того как сдалть clone. Я пока толком не разобрался для чего она нужна, её можно удалить так:

git remote set-head origin -d

Комманда для возврата на место remotes/origin/HEAD

git remote set-head origin -a
Переименовать текущую ветку:
git branch -m new_name
git branch -M new_name (-M позволяет проигнорировать, что new_name уже есть, перекрывает её)
Переименовать любой бранч:
git branch -m current_name new_name

Ситуация немного усложняется в случае если вы уже запушили ветку на удаленный сервер, переименовываем ее так:

git checkout -b <new-branch-name>
git push origin <new-branch-name>
git push origin :<old-branch-name>
  • создаем новую ветку
  • пушим ее на удаленный сервер
  • удаляем старую ветку

Слияние

Например нужно слить ветку feature, в которой несколько коммитов в мастер так чтобы это был один коммит в мастере.

git co master
git merge --squash feature

при этом в индекс положаться все изменения которые были сделаны (всё сольётся в кучу) но не будет закоммичено. остаётся всё закоммитить одним коммитом.

Вот реально хорошая статься как ребайсить ветки с удалёнными репозиториями: Git Rebase: руководство по использованию

Работа с индексом

Добавить всё в индекс
git add .
Добавить всё в индекс (даже deleted)
git add -u
Удалить файл из индекса, оставив его при этом в вашем рабочем каталоге.
git rm --cached file_or_dir