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>
Кроме того, мы поняли, что удаление ветки на локальном или удаленном сервере не повлияет на ветки на другой стороне.