Перейти к основному содержимому

Удалить ветку Git локально и удаленно

· 7 мин. чтения

1. Обзор

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

В этом руководстве мы рассмотрим, как удалять ветки Git.

2. Подготовка репозитория Git

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

Для начала клонируем репозиторий myRepo ( https://github.com/sk1418/myRepo ) с GitHub для тестирования:

$ git clone git@github.com:sk1418/myRepo.git
Cloning into 'myRepo'...
...
remote: Total 6 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done

Во-вторых, давайте войдем в локальный каталог myRepo и проверим ветки:

$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master

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

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

3. Удаление локальной ветки

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

Команда Git git branch имеет два параметра для удаления локальной ветки: -d и -D .

Далее давайте рассмотрим их подробнее и на примере поймем разницу между этими двумя вариантами.

3.1. Удаление локальной ветки с параметром -d

Для начала попробуем создать локальную ветку:

$ git checkout -b feature
Switched to a new branch 'feature'

Далее, давайте удалим ветвь функции , используя опцию -d :

$ git branch -d feature
error: Cannot delete branch 'feature' checked out at '/tmp/test/myRepo'

К сожалению, как мы видим, у нас есть сообщение об ошибке. Это потому, что мы в настоящее время находимся на функциональной ветке:

$ git branch
* feature
master

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

$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
$ git branch -d feature
Deleted branch feature (was 3aac499)

$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master

Как мы видим, мы успешно удалили локальную ветвь функции .

3.2. Удаление локальной ветки с опцией -D

Во-первых, давайте снова создадим ветвь функции . Но на этот раз мы собираемся внести некоторые изменения и зафиксировать их:

$ git checkout -b feature
Switched to a new branch 'feature'

# ... modify the README.md file ...
$ echo "new feature" >> README.md
$ git status
On branch feature
Changes not staged for commit:
...
modified: README.md

no changes added to commit (use "git add" and/or "git commit -a")

$ git ci -am'add "feature" to the readme'
[feature 4a87db9] add "feature" to the readme
1 file changed, 1 insertion(+)

Теперь Git откажется удалять ветку функции , если мы по-прежнему используем параметр -d :

$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

$ git branch -d feature
error: The branch 'feature' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature'.

Это связано с тем, что удаляемая ветвь ( feature ) опережает ветку по умолчанию ( master ) :

$ git log --graph --abbrev-commit 
* commit 4a87db9 (HEAD -> feature)
| Author: ...
| Date: ...|
| add "feature" to the readme
|
* commit 3aac499 (origin/master, origin/HEAD, master)
| Author: ...
| Date: ...|
| the first commit
|
* commit e1ccb56
Author: ...
Date: ...
Initial commit

Есть два способа решить проблему. Во-первых, мы можем объединить ветку feature с master , а затем снова выполнить « git branch -d feature ».

Однако, если мы хотим отказаться от неслитых коммитов, как предлагалось в сообщении об ошибке, мы можем запустить « git branch -D feature », чтобы выполнить принудительное удаление:

$ git branch -D feature
Deleted branch feature (was 4a87db9)

$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master.

3.3. git branch -d/-D не будет удалять удаленную ветку

До сих пор мы удаляли локальную ветку, используя ветку git с параметрами -d и -D . Стоит отметить, что независимо от того, удаляем ли мы с помощью -d или -D , эта команда удалит только локальную ветвь. Никакая удаленная ветка не будет удалена, даже если удаленная локальная ветка отслеживает удаленную ветку .

Далее, давайте разберемся в этом на примере. Опять же, давайте создадим функциональную ветку, внесем некоторые изменения и отправим коммит в удаленный репозиторий:

$ git checkout -b feature
Switched to a new branch 'feature'

# add a new file
$ echo "a wonderful new file" > wonderful.txt

$ git add . && git ci -am'add wonderful.txt'
[feature 2dd012d] add wonderful.txt
1 file changed, 1 insertion(+)
create mode 100644 wonderful.txt
$ git push
...
To github.com:sk1418/myRepo.git
* [new branch] feature -> feature

Как видно из приведенного выше вывода, мы создали новый файл, замечательный.txt, в ветке функций и отправили фиксацию в удаленный репозиторий.

Таким образом, локальная ветвь функций отслеживает ветвь удаленных функций :

$ git remote show origin | grep feature
feature tracked
feature pushes to feature (up to date)

Поскольку мы не объединили функцию с master , давайте удалим локальную ветвь функции с опцией -D :

$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

$ git branch -D feature
Deleted branch feature (was 2dd012d).

$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/feature
remotes/origin/master

Как мы видим в выводе команды git branch -a , ветвь локальной функции исчезла. Но ветка /remotes/origin/feature не удаляется.

Теперь, если мы снова проверим ветку функций , сделанные нами изменения все еще там:

$ git checkout feature
Switched to branch 'feature'
Your branch is up to date with 'origin/feature'.
$ cat wonderful.txt
a wonderful new file

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

4. Удаление удаленной ветки

Мы можем использовать команду git push origin :<branchName> для удаления удаленной ветки, если наша версия Git ниже 1.7.0. Однако эта команда не выглядит как операция удаления. Поэтому, начиная с версии 1.7.0, Git представил команду git push origin -d <branchName> для удаления удаленной ветки . Судя по всему, эту команду легче понять и запомнить, чем старую версию.

Только что мы удалили функцию локальной ветки и увидели, что ветвь удаленной функции все еще существует. Итак, теперь давайте используем упомянутую команду для удаления ветки удаленной функции .

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

$ git checkout feature 
branch 'feature' set up to track 'origin/feature'.
Switched to a new branch 'feature'
$ git branch -a
* feature
master
remotes/origin/HEAD -> origin/master
remotes/origin/feature
remotes/origin/master

Итак, теперь у нас есть локальная и удаленная ветки функций . Кроме того, в настоящее время мы находимся на ветке локальных функций .

Далее давайте удалим ветку удаленной функции :

$ git push origin -d feature
To github.com:sk1418/myRepo.git
- [deleted] feature
$ git branch -a
* feature
master
remotes/origin/HEAD -> origin/master
remotes/origin/master

Как мы видим, после выполнения команды git push -d feature ветвь удаленной функции была удалена. Тем не менее, локальная ветвь функций все еще существует. То есть удаление удаленной ветки не повлияет на локальные ветки отслеживания . Поэтому, если мы запустим git push сейчас, локальная ветка функций снова будет отправлена на удаленную.

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

5. Вывод

В этой статье мы рассмотрели, как удалить локальные и удаленные ветки Git с помощью команд.

Давайте кратко суммируем их:

  • Удалить локальную ветку: git branch -d/-D <branchName> ( опция -D предназначена для принудительного удаления)
  • Удалить удаленную ветку: git push origin -d <branchName> или git push origin :<branchName>

Кроме того, мы поняли, что удаление ветки на локальном или удаленном сервере не повлияет на ветки на другой стороне.