Управление ветками
Теперь, когда вы уже попробовали создавать, объединять и удалять ветки, пора познакомиться с некоторыми инструментами для управления ветками, которые вам пригодятся, когда вы начнёте использовать ветки постоянно.
Команда git branch
делает несколько больше, чем просто создаёт и удаляет ветки.
При запуске без параметров, вы получите простой список имеющихся у вас веток:
$ git branch
iss53
* master
testing
Обратите внимание на символ *
, стоящий перед веткой master
: он указывает на ветку, на которой вы находитесь в настоящий момент (т. е. ветку, на которую указывает HEAD
).
Это означает, что если вы сейчас сделаете коммит, ветка master
переместится вперёд в соответствии с вашими последними изменениями.
Чтобы посмотреть последний коммит на каждой из веток, выполните команду git branch -v
:
$ git branch -v
iss53 93b412c Fix javascript issue
* master 7a98805 Merge branch 'iss53'
testing 782fd34 Add scott to the author list in the readme
Опции --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
, как указано в подсказке.
Подсказка |
Если в качестве аргумента не указан коммит или ветка, то опции Вы всегда можете указать дополнительный аргумент для вывода той же информации, но относительно указанной ветки предварительно не извлекая и не переходя на неё.
|
Переименование ветки
Внимание |
Не переименовывайте ветки, которые всё ещё используются другими участниками. |
Предположим, у вас есть ветка с именем 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 нужно выполнить команду (вместо mybranch необходимо поставить название ветки, которую вы хотите удалить):
git branch -d mybranch
Обратите внимание на то, что ветка, которую вы удаляете, не должна быть вашей текущей веткой, в которой вы работаете, иначе отобразится ошибка вида:
error: Cannot delete branch ’mybranch’ checked out at ’/path/to
Поэтому, если вам нужно удалить текущую ветку, то сначала нужно переключиться на какую-либо другую ветку, а только потом выполнять удаление.
Если вдруг возникает ошибка: The branch ’mybranch’ is not fully merged. If you are sure you want to delete it и вы по прежнему хотите удалить ветку, то для принудительного удаления ветки можно воспользоваться опцией -D:
git branch -D mybranch
Удаление удаленной ветки
Чтобы удалить удаленную (remote) ветку используется команда (вместо origin и mybranch необходимо поставить свои данные):
git push origin --delete mybranch
Вместо —delete можно просто писать -d:
git push origin -d mybranch
Смотрите также:
- Как изменить файлы в старом коммите (не последнем)
- Как добавить все файлы в коммит, кроме одного
- Как создать ветку из предыдущего коммита
- Команда Git stash. Как прятать изменения в Git
- Как показать файлы, которые будут добавлены в текущий коммит
- Как переименовать ветку
- Как показать текущую ветку
- Как создать новую ветку
It is common for a git repo to have different branches. They are a good way to work on different features and fixes while isolating the new code from the main codebase. Repos often have a master branch or a main branch for the main codebase and developers create other branches with names of their choice (or as required by the organization) to work on different features or fixes. Most of the time you might have to delete a git branch, because of some irreversible changes, security issues, or when a particular feature of the related project has been built. In most cases, it is simple to delete a git branch. In this article, I’ll guide you through the entire process of how to delete a git branch securely. To get started I have already created a new branch in my repo using:
git checkout -b <branch-name>
Here <branch-name> is test. To check which is the current working branch you can use the git branch command.
we can see that we are in the test branch
and the following is a snapshot of my Github repository with the test branch in the remote.
Delete a Branch Locally
Git won’t allow you to delete the branch you are currently working on. So you must make sure to checkout to a branch that you are NOT deleting. For this use the command:
git checkout <branch-name>
Here we will check out our main branch from my test branch.
Now in order to delete the test branch locally, we use the command :
git branch -d <branch-name>
We will delete my test branch as an example.
Note: The -d option will delete the branch only if it has already been pushed and merged with the remote branch. If you want to forcefully delete a branch you will have to use the -D option instead. The -D flag is synonymous with –delete –force. This will forcefully delete the branch even if it hasn’t been pushed or merged with the remote. the full command is:
git branch -D <branch-name>
With this, we can successfully delete a local branch.
Delete a Branch Remotely
You can’t use the git branch command to delete a remote branch. Instead, you have to use the git push command with the –delete flag, followed by the name of the branch that we want to delete. You also need to specify the remote name (origin in this case) after “git push”. The command is as follows:
git push <remote-name> --delete <branch-name>
Here I will delete my test branch in my remote repository as shown below.
This command will delete the branch remotely. You can also use the shorthand:
git push <remote-name> :<branch-name>
As you can see my remote branch is no more in my GitHub repo:
With this, we have successfully deleted our remote branch. A common error faced by many in this step is:
error: unable to push to unqualified destination: remoteBranchName The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to ‘git@repository_name’
This means that someone has already deleted the branch that you want to delete. If this happens you can use the following command to synchronize your branch list in the local environment:
git fetch -p
The -p flag here means “prune”. After fetching the branches which no longer exist in remote will be deleted in your local working environment.
Last Updated :
23 Jun, 2021
Like Article
Save Article
The short answers
If you want more detailed explanations of the following commands, then see the long answers in the next section.
Deleting a remote branch
git push origin --delete <branch> # Git version 1.7.0 or newer
git push origin -d <branch> # Shorter version (Git 1.7.0 or newer)
git push origin :<branch> # Git versions older than 1.7.0
Deleting a local branch
git branch --delete <branch>
git branch -d <branch> # Shorter version
git branch -D <branch> # Force-delete un-merged branches
Deleting a local remote-tracking branch
git branch --delete --remotes <remote>/<branch>
git branch -dr <remote>/<branch> # Shorter
git fetch <remote> --prune # Delete multiple obsolete remote-tracking branches
git fetch <remote> -p # Shorter
The long answer: there are three different branches to delete!
When you’re dealing with deleting branches both locally and remotely, keep in mind that there are three different branches involved:
- The local branch
X
. - The remote origin branch
X
. - The local remote-tracking branch
origin/X
that tracks the remote branchX
.
The original poster used:
git branch -rd origin/bugfix
Which only deleted his local remote-tracking branch origin/bugfix
, and not the actual remote branch bugfix
on origin
.
To delete that actual remote branch, you need
git push origin --delete bugfix
Additional details
The following sections describe additional details to consider when deleting your remote and remote-tracking branches.
Pushing to delete remote branches also removes remote-tracking branches
Note that deleting the remote branch X
from the command line using a git push
will also remove the local remote-tracking branch origin/X
, so it is not necessary to prune the obsolete remote-tracking branch with git fetch --prune
or git fetch -p
. However, it wouldn’t hurt if you did it anyway.
You can verify that the remote-tracking branch origin/X
was also deleted by running the following:
# View just remote-tracking branches
git branch --remotes
git branch -r
# View both strictly local as well as remote-tracking branches
git branch --all
git branch -a
Pruning the obsolete local remote-tracking branch origin/X
If you didn’t delete your remote branch X
from the command line (like above), then your local repository will still contain (a now obsolete) remote-tracking branch origin/X
. This can happen if you deleted a remote branch directly through GitHub’s web interface, for example.
A typical way to remove these obsolete remote-tracking branches (since Git version 1.6.6) is to simply run git fetch
with the --prune
or shorter -p
. Note that this removes all obsolete local remote-tracking branches for any remote branches that no longer exist on the remote:
git fetch origin --prune
git fetch origin -p # Shorter
Here is the relevant quote from the 1.6.6 release notes (emphasis mine):
«git fetch» learned
--all
and--multiple
options, to run fetch from
many repositories, and--prune
option to remove remote tracking
branches that went stale. These make «git remote update» and «git
remote prune» less necessary (there is no plan to remove «remote
update» nor «remote prune», though).
Alternative to above automatic pruning for obsolete remote-tracking branches
Alternatively, instead of pruning your obsolete local remote-tracking branches through git fetch -p
, you can avoid making the extra network operation by just manually removing the branch(es) with the --remotes
or -r
flags:
git branch --delete --remotes origin/X
git branch -dr origin/X # Shorter
See Also
- git-branch(1) Manual Page.
- git-fetch(1) Manual Page.
- Pro Git § 3.5 Git Branching — Remote Branches.
В этом посте мы обсудим, как удалить локальные и удаленные ветки в git с помощью команды git-branch
команда.
1. Удалить локальные ветки
Чтобы удалить локальную ветку, мы можем использовать git-branch команда с -d
или же -D
вариант.
git branch (-d | -D) <branchname>
а. -d
option это псевдоним для --delete
, который удаляет ветвь только в том случае, если она была полностью объединена с вышестоящей ветвью.
git branch -d <branchname>
Это показано ниже, где удаляется локальная ветвь ним который был полностью объединен в свою восходящую ветвь.
б. -D
option это псевдоним для --delete --force
, которые позволяют удалять ветку независимо от ее статуса слияния.
git branch -D <branchname> # -D is same as -d -f
Ниже показано принудительное удаление локальной ветки. vlang который не был объединен в своей вышестоящей ветке.
2. Удалить удаленные ветки
Чтобы удалить удаленные ветки с помощью git-branch
команда, укажите -r
вариант вместе с -d
вариант.
git branch -d -r <branchname>
Обратите внимание, что git-branch
Команда может принимать несколько ветвей для удаления.
Удалять удаленные ветки имеет смысл только в том случае, если они больше не существуют в удаленном репозитории или если git fetch настроен не извлекать их. Вы можете использовать чернослив подкоманда git-remote
для очистки устаревших удаленных веток.
git remote prune origin
В качестве альтернативы используйте get-fetch команда с --all
возможность получать изменения со всех пультов и поставлять -p
возможность удалить любые удаленные ссылки, которые больше не существуют на удаленном сервере.
git fetch —all -p
Как перечислить все локальные/удаленные ветки?
Чтобы получить список как удаленных, так и локальных ветвей, мы можем использовать -a
вариант. Чтобы получить только удаленные ветки, используйте -r
вариант.
б. -D
option это псевдоним для --delete --force
, которые позволяют удалять ветку независимо от ее статуса слияния.
git branch -D <branchname> # -D is same as -d -f
Ниже показано принудительное удаление локальной ветки. vlang который не был объединен в своей вышестоящей ветке.
2. Удалить удаленные ветки
Чтобы удалить удаленные ветки с помощью git-branch
команда, укажите -r
вариант вместе с -d
вариант.
git branch -d -r <branchname>
Обратите внимание, что git-branch
Команда может принимать несколько ветвей для удаления.
Удалять удаленные ветки имеет смысл только в том случае, если они больше не существуют в удаленном репозитории или если git fetch настроен не извлекать их. Вы можете использовать чернослив подкоманда git-remote
для очистки устаревших удаленных веток.
git remote prune origin
В качестве альтернативы используйте get-fetch команда с --all
возможность получать изменения со всех пультов и поставлять -p
возможность удалить любые удаленные ссылки, которые больше не существуют на удаленном сервере.
git fetch —all -p
Как перечислить все локальные/удаленные ветки?
Чтобы получить список как удаленных, так и локальных ветвей, мы можем использовать -a
вариант. Чтобы получить только удаленные ветки, используйте -r
вариант.
Это все об удалении локальных и удаленных веток Git.
Также см:
Удалить ветки удаленного отслеживания в Git