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

Я хочу удалить ветку как локально, так и удаленно.

Неудачные попытки удалить удаленную ветку

$ git branch -d remotes/origin/bugfix
error: branch 'remotes/origin/bugfix' not found.

$ git branch -d origin/bugfix
error: branch 'origin/bugfix' not found.

$ git branch -rd origin/bugfix
Deleted remote branch origin/bugfix (was 2a14ef7).

$ git push
Everything up-to-date

$ git pull
From github.com:gituser/gitproject

* [new branch] bugfix -> origin/bugfix
Already up-to-date.

Что мне следует сделать по-другому, чтобы успешно удалить ветку remotes/origin/bugfix как локально, так и удаленно?


person Matthew Rankin    schedule 05.01.2010    source источник
comment
Примечание модератора: если вы собираетесь ответить на этот вопрос, обратите внимание, что уже опубликовано 40 ответов. Будет ли ваш новый ответ иметь какое-то существенное значение?   -  person Robert Harvey    schedule 11.06.2014
comment
Примечание. Для Git 2.5+ (второй квартал 2015 г.) точное сообщение будет deleted remote-tracking branch: см. github.com/git/git/commit/   -  person VonC    schedule 25.05.2015
comment
Возможно, вас заинтересует этот сценарий, который упрощает разницу между удалением локальной и удаленной веток: tlbx.app/blog/delete-any-git-branch-the-easy-way   -  person Mig    schedule 12.09.2019
comment
@RobertHarvey сейчас всего 39   -  person Adam    schedule 28.11.2019
comment
@Adam: 81. 42 ответа были удалены по разным причинам. Необъяснимая одержимость публики определенной темой - одна из величайших загадок жизни.   -  person Robert Harvey    schedule 30.11.2019
comment
Пропустите несколько первых ответов и просто перейдите к самому лучшему: stackoverflow.com/a/23961231/4561887. Чтобы удалить ветку git, на самом деле нужно удалить 3 разных ветки! Этот ответ проясняет этот факт.   -  person Gabriel Staples    schedule 03.04.2020
comment
@GabrielStaples Без контекста ваш комментарий сбивает с толку. Неправильны ли как-то самые лучшие ответы?   -  person Nathan    schedule 19.06.2020
comment
@ Натан, нет, они не ошибаются, но они не учат тому, чего вы не знаете, что не знаете, а тот, на который я ссылаюсь, делает это критическое неизвестное неизвестное становится известным неизвестным, а затем известным известным. Я не знал, что у вас есть 1) локальная ветка, 2) локально сохраненная ветка удаленного отслеживания и 3) удаленная ветка, пока я не прочитал этот ответ. До этого я думал, что есть только локальная ветка и удаленная ветка. Локально сохраненная ветвь удаленного отслеживания была unknown unknown. Переход от этого к известному известному - вот что делает этот ответ лучшим.   -  person Gabriel Staples    schedule 19.11.2020
comment
Я хотел добавить примечание, что нельзя удалить ветку, над которой сейчас работаете. Я сделал эту ошибку новичка, поэтому подумал, может ли это помочь. :)   -  person cRAN    schedule 09.02.2021
comment
Обычное примечание пользователя: если вы намерены проголосовать за комментарий Роберта Харви, обратите внимание, что уже добавлено 1215 голосов. Принесет ли ваш новый голос какой-нибудь существенный вклад? :) ... Теперь 1216! Это лот.   -  person Panzercrisis    schedule 26.05.2021
comment
Очень хороший блог на freecodecamp   -  person RBT    schedule 04.06.2021


Ответы (40)


Управляющее резюме

$ git push -d <remote_name> <branch_name>
$ git branch -d <branch_name>

Обратите внимание, что в большинстве случаев удаленное имя origin. В таком случае вам придется использовать такую ​​команду.

$ git push -d origin <branch_name>

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

Чтобы удалить локальную ветку, используйте одно из следующих действий:

$ git branch -d branch_name
$ git branch -D branch_name

Примечание. Параметр -d - это псевдоним для --delete, который удаляет ветвь только в том случае, если она уже была полностью объединена с восходящей ветвью. Вы также можете использовать -D, который является псевдонимом для --delete --force, который удаляет ветку независимо от ее объединенного статуса. [Источник: man git-branch]
Также обратите внимание, что git branch -d branch_name завершится ошибкой, если вы в данный момент находитесь в ветке, которую хотите удалить. Сообщение начинается с error: Cannot delete the branch 'branch_name'. Если это так, сначала переключитесь на другую ветку, например: git checkout main.

Удалить удаленную ветку [Обновлено 8 сентября 2017 г.]

Начиная с Git v1.7.0, вы можете удалите удаленную ветку с помощью

$ git push <remote_name> --delete <branch_name>

что может быть легче запомнить, чем

$ git push <remote_name> :<branch_name>

который был добавлен в Git v1.5.0 в удалить удаленную ветку или тег.

Начиная с Git v2.8.0, вы также можете используйте git push с опцией -d в качестве псевдонима для --delete.

Таким образом, версия Git, которую вы установили, будет определять, нужно ли вам использовать более простой или более сложный синтаксис.

Удалить удаленную ветку [Исходный ответ от 5 января 2010 г.]

Из главы 3 Pro Git Скотт Чакон:

Удаление удаленных филиалов

Предположим, вы закончили с удаленной веткой - скажем, вы и ваши соавторы закончили работу над функцией и объединили ее с основной веткой удаленного (или любой другой веткой, в которой находится ваша стабильная строка кода). Вы можете удалить удаленную ветку, используя довольно тупой синтаксис git push [remotename] :[branch]. Если вы хотите удалить ветку server-fix с сервера, выполните следующее:

$ git push origin :serverfix
To [email protected]:schacon/simplegit.git
 - [deleted]         serverfix

Бум. На вашем сервере больше нет веток. Возможно, вы захотите выслушать эту страницу, потому что вам понадобится эта команда, и вы, вероятно, забудете синтаксис. Чтобы запомнить эту команду, можно вспомнить синтаксис git push [remotename] [localbranch]:[remotebranch], который мы рассмотрели немного ранее. Если вы опустите часть [localbranch], вы, по сути, скажете: «Ничего не возьми с моей стороны и сделай это [remotebranch]».

Выдал git push origin: bugfix, и все прекрасно заработало. Скотт Чакон был прав: я хочу собачье ухо эту страницу (или практически собачье ухо отвечая на это в Stack Overflow).

Затем вы должны выполнить это на других машинах

# Fetch changes from all remotes and locally delete 
# remote deleted branches/tags etc
# --prune will do the job :-;
git fetch --all --prune

распространять изменения.

person Matthew Rankin    schedule 05.01.2010
comment
Не забудьте сделать git fetch --all --prune на других машинах после удаления удаленной ветви на сервере. ||| После удаления локальной ветки с помощью git branch -d и удаления удаленной ветки с помощью git push origin --delete другие машины могут все еще иметь устаревшие ветки отслеживания (чтобы увидеть, как они работают git branch -a). Чтобы избавиться от них, сделайте git fetch --all --prune. - person Trevor Boyd Smith; 27.05.2015
comment
в дополнение к git branch -a @ TrevorBoydSmith для просмотра всех ветвей, вы также можете использовать git branch -r для просмотра только удаленных веток. см. также git remote show origin - источник: gitready.com/intermediate/2009/ 13 февраля / list-remote-branch.html - person Sandra; 09.09.2015
comment
Мне пришлось запустить git branch -D Branch_Name, чтобы избавиться от локальной ветки - person Kellen Stuart; 10.03.2016
comment
@KolobCanyon Вам нужно использовать -D только в том случае, если ветка не была объединена с другой веткой. - person BTRUE; 05.04.2016
comment
Вопрос был в следующем: Что мне нужно сделать по-другому, чтобы успешно удалить ветку remotes / origin / bugfix как локально, так и на GitHub? После выполнения команд в обновленном ответе местное отделение все еще присутствует. Было бы неплохо, если бы принятый ответ был полным ответом. Совершенно удивительно, насколько сложно Git выполняет простые задачи ... - person jww; 07.06.2016
comment
Чтобы лучше понять синтаксис git push origin: ‹branch_name›, перейдите по ссылке stackoverflow.com/questions/1519006/ - person Alex; 16.08.2017
comment
Обратите внимание, что -d как псевдоним для --delete также работает с push-вызовом. Так что git push origin -d <branch_name> тоже работает - person Sheldon; 24.08.2017
comment
Почему мне нужно указывать удаленный при нажатии? - person Alex78191; 19.09.2017
comment
@ Alex78191 Потому что вы, возможно, не захотите подталкивать свою ветку ко всем своим пультам. Однако я использую этот псевдоним, когда хочу отправить всю свою ветку на все свои пульты. stackoverflow.com/a/18674313/1308453 - person Philip Rego; 26.10.2017
comment
@Sheldon Какую версию git вы используете? Для меня (git 2.7.4) -d не работает для push. - person luator; 01.12.2017
comment
@luator Я использую 2.8.1, и приношу свои извинения, -d в качестве псевдонима для --delete был добавлен в 2.8.0, см. здесь: legacy-developer.atlassian.com/blog/2016/03/ - person Sheldon; 01.12.2017
comment
Вы также можете использовать инструмент дерева исходных текстов, если не хотите запоминать команды git. - person user1101733; 22.02.2018
comment
У меня работал только $ git push <remote_name> :<branch_name>. - person Christophe Roussy; 22.05.2018
comment
--delete, возможно, будет легче запомнить, но уже слишком поздно, если вы уже понимаете push remote :deadbr, плюс в последнем есть приятная вещь, заключающаяся в том, что он также работает с тегами. - person Alois Mahdal; 10.07.2018
comment
В кратком изложении у вас есть git push --delete <remote_name> <branch_name>, но в первом разделе Удалить удаленное обновление ветки у вас есть git push <remote_name> --delete <branch_name>. т.е. параметры находятся в другом порядке. Могу я предложить сделать их такими же, чтобы избежать путаницы. - person Caltor; 29.11.2018
comment
Я запустил первую строку резюме, а вторая не нужна (?). Филиал пропал как локально, так и удаленно. - person Daniel Springer; 27.12.2018
comment
@DanielSpringer Такого быть не должно. Он удалит удаленную ветку origin/mybranch в вашем репо и на сервере, но не удалит никакие локальные ветки отслеживания (mybranch). - person Timmmm; 24.01.2019
comment
@Timmmm либо я запускал его раньше и забыл, либо ... не знаю: P - person Daniel Springer; 24.01.2019
comment
Обратите внимание, что это может не сработать с ! [remote rejected] <branch_name> (refusing to delete the current branch: refs/heads/<branch_name>) error: failed to push some refs to '[email protected]:<org_name>/<project_name>.git', если вы установили эту ветку в Github в качестве ветки по умолчанию. Если да, перейдите в свой проект в Github - ›Настройки -› Филиалы, а затем измените ветку по умолчанию на другую. Тогда повторение вашей команды для удаления ветки будет работать. - person stwr667; 14.02.2019
comment
В этом ответе показано, как удалить ветку на конкретном пульте дистанционного управления. Для единообразия шаг сокращения также должен быть ограничен этим конкретным пультом дистанционного управления. Отбросьте параметр --all и укажите удаленный: git fetch --prune <remote_name>. - person Robin A. Meade; 20.09.2019
comment
Это можно передать в другие команды, такие как grep, чтобы отфильтровать ветки, которые вы не хотите удалять git branch --merged | grep -v "\$BRANCHNAME\b" | xargs git branch -d - person Andy Macleod; 06.05.2020
comment
Я просто хотел удалить запись из списка git remote -v (исправляю: 2 записи, а именно восходящие) и наткнулся на этот пост. Что ж, мое решение - удалить удаленную ветку из .git/config редактирования этого файла. Я добавил их случайно с git remote add .. - person Timo; 21.11.2020
comment
Если репозиторий удален, и вам нужно удалить локальную ветвь, отслеживающую удаленную ветку, используйте git branch -d -r <remote>/<branch> - person Dror Bar; 28.01.2021
comment
Нужно ли отправлять изменения после удаления удаленной ветки? - person a.ak; 02.03.2021

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

Чтобы удалить локальную ветвь со своего компьютера:

git branch -d {the_local_branch} (используйте -D вместо принудительного удаления ветки без проверки объединенного статуса)

Чтобы удалить удаленную ветку с сервера:

git push origin --delete {the_remote_branch}

Ссылка: Git: удалить ветку (локальную или удаленный)

person Eric Brotto    schedule 12.06.2012
comment
@megido well -D принудительно удаляет, -d выдает предупреждение, если оно еще не слито. - person TankorSmash; 06.11.2014
comment
Если ваша локальная ветка не объединена с мастером и запустила 'git branch -d your_branch, вы получите ошибку типа error: The branch 'your_branch' is not fully merged. If you are sure you want to delete it, run 'git branch -D your_branch'. - person geeks; 31.10.2015
comment
Я бы предложил использовать -d вместо -D, потому что это безопаснее. Если -d завершается неудачно из-за несоединенных коммитов, вам необходимо оценить это, и если это определенно нормально для удаления, используйте -D. - person rooby; 02.02.2016
comment
Другие с клонами репозитория, где удаленные ветки были удалены, должны запускать git remote prune <name> (например, git remote prune origin), чтобы локально удалить устаревшие ветки, которые больше не существуют на удаленном компьютере. - person code_dredd; 19.04.2016
comment
Если ваша ветка в вашей вилке (не всегда origin), используйте правильный репозиторий. например git push myRepo: mrbranchtodelete - person Dhanuka777; 19.05.2016
comment
Я хотел бы добавить, что -d выдает предупреждение, если он не объединен с текущим HEAD. Если вам нужна ясность, я рекомендую эту команду git branch -a --merged origin/master Она перечислит все ветки, как локальные, так и удаленные; которые были объединены в мастер. Дополнительная информация здесь - person Eric; 10.02.2017
comment
@ Eric-Brotto Чтобы ваш ответ был полным, вам нужно добавить команду git fetch -p для получения изменений на других машинах - person SebMa; 22.03.2020
comment
›Ну -D принудительно удаляет, -d выдает предупреждение, если оно еще не слито. \ N \ n Довольно плохое название, если вы спросите меня. Должен быть -df или -d --force. - person Charming Robot; 05.07.2020
comment
Если репозиторий удален и вам нужно удалить локальную ветку, отслеживающую удаленную ветку, используйте git branch -d -r <remote>/<branch> - person Dror Bar; 28.01.2021

короткие ответы

Если вам нужны более подробные объяснения следующих команд, см. Подробные ответы в следующем разделе.

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

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

Удаление локального филиала

git branch --delete <branch>
git branch -d <branch> # Shorter version
git branch -D <branch> # Force-delete un-merged branches

Удаление локальной ветки удаленного отслеживания

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

длинный ответ: нужно удалить три разных ветки!

Когда вы имеете дело с удалением веток как локально, так и удаленно, имейте в виду, что задействованы три разных ветки:

  1. Местное отделение X.
  2. Ветвь удаленного происхождения X.
  3. Локальная ветвь удаленного отслеживания origin/X, которая отслеживает удаленную ветку X.

Визуализация трех ветвей

В оригинальном плакате использовались:

git branch -rd origin/bugfix

При этом была удалена только его локальная ветвь удаленного отслеживания origin/bugfix, а не фактическая удаленная ветка bugfix на origin.

Диаграмма 2

Чтобы удалить эту удаленную ветку, вам потребуется

git push origin --delete bugfix

Диаграмма 3

Дополнительные детали

В следующих разделах описываются дополнительные сведения, которые следует учитывать при удалении веток удаленного и удаленного отслеживания.

Нажатие на удаление удаленных веток также удаляет ветки удаленного отслеживания

Обратите внимание, что удаление удаленной ветви X из командной строки с помощью git push также удалит локальную ветвь удаленного отслеживания origin/X, поэтому нет необходимости обрезать устаревшую ветвь удаленного отслеживания с помощью git fetch --prune или git fetch -p. Впрочем, это не повредит, если вы все равно это сделаете.

Вы можете убедиться, что ветка удаленного отслеживания origin/X также была удалена, выполнив следующее:

# 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

Удаление устаревшего локального источника ветки удаленного отслеживания / X

Если вы не удалили удаленную ветку X из командной строки (как указано выше), то ваш локальный репозиторий по-прежнему будет содержать (теперь уже устаревшую) ветку удаленного отслеживания origin/X. Это может произойти, например, если вы удалили удаленную ветку напрямую через веб-интерфейс GitHub.

Типичный способ удалить эти устаревшие ветки удаленного отслеживания (начиная с Git версии 1.6.6) - просто запустить git fetch с --prune или короче -p. Обратите внимание, что при этом удаляются все устаревшие локальные ветки удаленного отслеживания для всех удаленных ветвей, которые больше не существуют на удаленном компьютере:

git fetch origin --prune
git fetch origin -p # Shorter

Вот соответствующая цитата из Примечания к выпуску 1.6.6 (выделено мной):

"git fetch" изучил --all и --multipleoptions для запуска выборки из многих репозиториев и --prune параметр для удаления ветвей удаленного отслеживания, которые устарели. Они делают "git remote update" и "git remote prune" менее необходим (однако нет плана удалять "удаленное обновление" или "удаленное удаление").

Альтернатива вышеуказанной автоматической обрезке для устаревших веток удаленного отслеживания

В качестве альтернативы, вместо удаления устаревших локальных ветвей удаленного отслеживания с помощью git fetch -p, вы можете избежать дополнительных сетевых операций, просто вручную удалив ветки с помощью флагов --remote или -r:

git branch --delete --remotes origin/X
git branch -dr origin/X # Shorter

Смотрите также

person Community    schedule 30.05.2014
comment
Из вашей иллюстрации я вижу, что есть репо локального клона и репо удаленного происхождения. Итак, есть как минимум две физические ветви. Где третью ветку удалять? Является ли третья ветка только указателем, указывающим на фиксацию в локальном репозитории клонов? - person huggie; 18.02.2016
comment
@huggie, это в значительной степени правильно. Ветви в Git - это просто закладки, прикрепленные к коммитам. Итак, на моих графиках выше есть закладки X и origin/X в локальном клоне (2 ветки), а затем есть X на удаленном компьютере (создание 3 веток). - person ; 23.02.2016
comment
+1 для ветви удаленного отслеживания. Эта ветка вызывает проблемы, когда вы клонируете чужую ветку. Он продолжает отслеживать ваши коммиты и спрашивает, хотите ли вы отправить его в ветку этого человека. - person Kermit_ice_tea; 21.06.2017
comment
Ради будущих читателей: @Kermit_ice_tea говорит выше о локальной ветке (как описано в этом ответе), а не о ветке удаленного отслеживания. Когда для локальной ветви настроена восходящая ветвь, она по умолчанию извлекает и отправляет в эту удаленную ветвь. локальная ветвь, на которой установлена ​​восходящая ветвь: называется ветвью отслеживания, поэтому его легко спутать с ветвями удаленного отслеживания из-за схожей терминологии. - person David P; 05.03.2020
comment
Я прочитал все ответы здесь, и это, безусловно, лучший ответ, который я читал до сих пор! - (и, вероятно, лучший на этой странице, точка). Это особенно верно, потому что это единственный ответ, который заявляет об этом ДЕЙСТВИТЕЛЬНО ВАЖНОМ факте, о котором я никогда раньше не знал: есть 3 разные ветки, которые нужно удалить! Я понятия не имел! Все это теперь имеет гораздо больше смысла, и теперь это проливает так много света на все другие ответы здесь. Спасибо! - person Gabriel Staples; 03.04.2020
comment
Что произойдет, если вы запустите git fetch --prune без указания удаленной ветви? Подрезает ли он все пульты? - person Gabriel Staples; 05.01.2021
comment
Следует отметить, что запуск git push origin --delete <branch>, насколько я могу судить, ТАКЖЕ удаляет локально сохраненную ветвь удаленного отслеживания с именем origin/branch. Итак, чтобы удалить удаленную ветвь И локально сохраненную ветку удаленного отслеживания с помощью одной команды, просто используйте git push origin --delete <branch>. Затем вам просто нужно удалить локальную ветвь с помощью git branch -D branch. Это касается удаления всех 3 веток с помощью всего 2 команд. - person Gabriel Staples; 05.01.2021
comment
Отличный ответ - я ценю, как изображения объясняют почему! Вы можете подумать о том, чтобы сделать короткий ответ еще короче (например, перечислите только короткие версии команд, выберите одну из -d и -D и обратите внимание на другую в соответствии с @Eric Brotto). Альтернативные формы можно найти ниже. - person Duncan MacIntyre; 01.06.2021

Шаги по удалению ветки:

Чтобы удалить удаленную ветку:

git push origin --delete <your_branch>

Чтобы удалить локальную ветку, у вас есть три способа:

1: git branch -D <branch_name>

2: git branch --delete --force <branch_name>  # Same as -D

3: git branch --delete  <branch_name>         # Error on unmerge

Объясните: Хорошо, просто объясните, что здесь происходит!

Просто выполните git push origin --delete, чтобы удалить только удаленную ветку, добавьте имя ветки в конце, и это удалит, и отправьте ее на удаленный в в то же время...

Кроме того, git branch -D, которые просто удаляют локальную ветку только! ...

-D означает --delete --force, который удалит ветку, даже если она не слита (принудительное удаление), но вы также можете использовать -d, что означает --delete, который выдает ошибку, соответствующую статусу слияния ветки ...

Я также создаю изображение ниже, чтобы показать шаги:

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

person Alireza    schedule 27.06.2017
comment
git branch -a будет отображать локальные и удаленные ветви. Это поможет вам представить диаграмму. - person LoranceChen; 27.07.2017
comment
обратите внимание, что если вы устанавливаете ветку, которую хотите удалить, вам необходимо проверить ветку, отличную от той, которую вам нужно удалить (например, master), прежде чем удалять локальную ветку. - person BaDr Amer; 28.05.2018
comment
Когда ветки удаляются в источнике, ваш локальный репозиторий не заметит этого. У вас по-прежнему будут локально кэшированные версии этих веток (что на самом деле хорошо), но git branch -a по-прежнему будет перечислять их как удаленные ветки. Вы можете очистить эту информацию локально следующим образом: git remote prune origin Ваши локальные копии удаленных веток при этом не удаляются. Тот же эффект достигается при использовании git fetch --prune - person vibs2006; 08.05.2019
comment
Изображение отвлекающее, очень большое и ничего не добавляет к ответу. Надеюсь, это не станет трендом на SO. - person jmiserez; 06.09.2019

Вы также можете использовать следующее, чтобы удалить удаленную ветку

git push --delete origin serverfix

Что делает то же самое, что и

git push origin :serverfix

но может быть легче запомнить.

person pagetribe    schedule 27.10.2011
comment
... и безопаснее использовать: O - person cst1992; 29.11.2017
comment
Вы забыли об удалении локальной ветки, что можно сделать: git branch -d <local_branch> или git branch -D <local_branch> для принудительного удаления - person Amit Dash; 14.02.2018

Совет: при удалении веток с помощью

git branch -d <branchname> # Deletes local branch

or

git push origin :<branchname> # Deletes remote branch

удаляются только ссылки. Несмотря на то, что ветка фактически удалена на удаленном компьютере, ссылки на нее все еще существуют в локальных репозиториях членов вашей команды. Это означает, что для других членов команды удаленные ветки все еще видны, когда они делают git branch -a.

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

git remote prune <repository>

Обычно это git remote prune origin.

person pfrenssen    schedule 07.11.2012
comment
Следует уточнить, что указанная выше git push операция удаляет локальную ветвь и удаленную ветку. - person Annika Backstrom; 21.05.2013
comment
Обратите внимание, что git remote prune - несколько устаревший способ удаления устаревших ветвей удаленного отслеживания, более новый способ сделать это - использовать git fetch --prune или git fetch -p. - person ; 11.06.2014
comment
@RRMadhav, действительно, вы не увидите удаленную ветку после ее удаления, поскольку ссылка на удаленную ветку будет удалена для вас локально. Любой член вашей команды, который проверил эту ветку, по-прежнему будет иметь эту ссылку и все равно будет видеть ее, если не удалит ветку. - person pfrenssen; 05.12.2014

Если вы хотите удалить ветку, сначала сделайте заказ в ветку, отличную от ветки, которую нужно удалить.

git checkout other_than_branch_to_be_deleted

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

git branch -D branch_to_be_deleted

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

git push origin --delete branch_to_be_deleted
person Praveen Hiremath    schedule 07.10.2014

Все очень просто:

Чтобы удалить удаленную ветку

git push -d origin <branch-name>

Or

git push origin :<branch-name>

- Вы также можете удалять теги с этим синтаксисом

Чтобы принудительно удалить локальную ветвь

git branch -D <branch-name>

Примечание. выполните git fetch --all --prune на других машинах после удаления удаленной ветви, чтобы удалить устаревшие ветви отслеживания.

Пример

удалить местную ветку

git branch -D my-local-branch

удалить удаленную ветку

git push origin :my-remote-branch

Удачного кодирования :)

person Vivek Maru    schedule 07.12.2017
comment
Мне нужно было использовать --delete вместо -d для удаления удаленной ветки. - person ZakJ; 11.12.2017
comment
Параметр -d является псевдонимом для --delete, и если --delete работает, то -d также должен работать, если вы принудительно хотите удалить ветку, вы можете использовать -D вместо -d или --delete. - person Vivek Maru; 18.12.2017

Это просто: просто выполните следующую команду:

Чтобы удалить ветку Git как локально, так и удаленно, сначала удалите локальную ветку с помощью этой команды:

git branch -d example

(Здесь example - название ветки.)

И после этого удалите удаленную ветку с помощью этой команды:

git push origin :example
person Syeful Islam    schedule 15.02.2015

Другой подход:

git push --prune origin

ПРЕДУПРЕЖДЕНИЕ: удаляются все удаленные ветки, которые не существуют локально. Или, в более широком смысле,

git push --mirror

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

person imanuelcostigan    schedule 18.11.2012
comment
git push --prune origin ничего не сделал для меня на gitlab: git clone git: //repo.git; git branch -d -r origin / some-branch; git push --prune origin; дает: Все актуальное; git fetch; возвращает локально удаленные ветки; git push --mirror; теперь их действительно нет! - person eMBee; 08.10.2015

В моих настройках Bash я использую следующее:

alias git-shoot="git push origin --delete"

Тогда вы можете позвонить:

git-shoot branchname
person crizCraig    schedule 02.04.2013
comment
В итоге я просто добавил псевдоним стрелять в свой .gitconfig Shoot = push origin --delete - person hdost; 04.12.2014
comment
Если ваше происхождение - Atlassian Stash, а ветвь задана по умолчанию, вы получите сообщение об ошибке. По умолчанию удаление текущей ветки запрещено .... Мне пришлось изменить ветку по умолчанию в Stash, чтобы она указывала на другую ветку, прежде чем я можно удалить. - person neoscribe; 12.12.2014
comment
Это совершенно просто, поскольку вы это сделали, но fyi git также позволяет вам создавать собственные команды. Поместите git push origin --delete $1 в файл по вашему пути с именем git-shoot, и git shoot branchname тоже будет работать. - person mahemoff; 14.10.2015
comment
это хорошее решение - person yourson; 01.01.2021

Удалить локально:

Чтобы удалить локальную ветку, вы можете использовать:

git branch -d <branch_name>

Чтобы удалить ветку принудительно, используйте -D вместо -d.

git branch -D <branch_name>

Удаленное удаление:

Есть два варианта:

git push origin :branchname

git push origin --delete branchname

Я бы посоветовал вам использовать второй способ, так как он более интуитивно понятен.

person Rahul Gupta    schedule 23.05.2015

Если вы хотите выполнить оба этих шага с помощью одной команды, вы можете создать для нее псевдоним, добавив приведенный ниже код в свой ~/.gitconfig:

[alias]
    rmbranch = "!f(){ git branch -d ${1} && git push origin --delete ${1}; };f"

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

git config --global alias.rmbranch \
'!f(){ git branch -d ${1} && git push origin --delete ${1}; };f'

ПРИМЕЧАНИЕ: при использовании -d (строчная буква d) ветвь будет удалена только в том случае, если она была объединена. Чтобы выполнить удаление, вам нужно будет использовать -D (буква D в верхнем регистре).

person Ryan Kohn    schedule 15.01.2013
comment
Это то, что я искал. Мой собственный псевдоним функции оболочки не работал (Unexpected EOF), и я не мог понять почему, но это отлично работает! Единственное изменение, которое я сделал, - это замена && на ;, так что даже если первая команда не удалась, вторая все равно будет выполняться (иногда существует только локальная или только удаленная). - person user1021726; 16.12.2014

С января 2013 года GitHub включил кнопку Удалить ветку рядом с каждой веткой на вашей странице «Ветви».

Соответствующее сообщение в блоге: Создание и удаление веток

person Nacho Coloma    schedule 29.04.2013
comment
Я начал использовать Github только в этом году, поэтому мне было интересно, почему это был такой высоко оцененный вопрос и почему ни один из лучших ответов не предлагал просто удалить его из веб-интерфейса Github! Интересно, что это только недавнее дополнение. - person Cam Jackson; 11.09.2013
comment
Я собирался указать на это. Обратите внимание, что кнопка не удалит вашу локальную ветку ... см. Этот ответ, чтобы узнать, как это сделать: stackoverflow.com/a/10999165 / 901641 - person ArtOfWarfare; 29.10.2013

Чтобы удалить свою ветку локально и удаленно

  • Оформить заказ на главную ветку - git checkout master

  • Удалите удаленную ветку - git push origin --delete <branch-name>

  • Удалите местное отделение - git branch --delete <branch-name>

person mfathy00    schedule 03.01.2016

Вы также можете сделать это с помощью git remote prune origin

$ git remote prune origin
Pruning origin
URL: [email protected]/yourrepo.git
 * [pruned] origin/some-branchs

Он обрезает и удаляет ветки удаленного отслеживания из git branch -r списка.

person nickleefly    schedule 12.03.2013

В дополнение к другим ответам я часто использую инструмент git_remote_branch. Это дополнительная установка, но она дает вам удобный способ взаимодействия с удаленными ветвями. В этом случае удалить:

grb delete branch

Я обнаружил, что также довольно часто использую команды publish и track.

person u2622    schedule 24.03.2012
comment
это хорошее решение - person yourson; 01.01.2021

однострочная команда для удаления как локального, так и удаленного:

D=branch-name; git branch -D $D; git push origin :$D

Или добавьте указанный ниже псевдоним в свой ~ / .gitconfig. Использование: git kill branch-name

[alias]
    kill = "!f(){ git branch -D \"$1\";  git push origin --delete \"$1\"; };f"
person Vinnie James    schedule 17.11.2016
comment
⚠️ Используйте git branch -D в скрипте осторожно, поскольку он принудительно удаляет ветку без проверки того, что она была объединена. Используйте -d на всякий случай. - person caesarsol; 13.03.2017

Удаление ветвей

Предположим, наша работа над контактной формой филиала завершена и мы уже интегрировали ее в мастер. Поскольку он нам больше не нужен, мы можем удалить его (локально):

$ git branch -d contact-form

И для удаления удаленной ветки:

git push origin --delete contact-form
person Ulysses Alves    schedule 30.10.2015

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

git push origin :<branchname>

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

git branch -D <branchname>

Удалить шаги локальной ветки:

  1. оформить заказ в другой филиал
  2. удалить местную ветку
person jayxhj    schedule 31.12.2015
comment
Требуется ли после удаления удаленной ветки git push? - person Samitha Chathuranga; 17.02.2016
comment
@SamithaChathuranga нет, git push origin :<branchname> уже подталкивает пустую ветку к удаленному (следовательно, удаляет удаленную ветку) - person Michał Szajbe; 10.06.2017

Просто скажите:

git branch -d <branch-name>
git push origin :<branch-name>
person piyushmandovra    schedule 23.04.2015
comment
Это работает, если это ваша собственная ветка. Но если вы обрезаете все ненужные ветки в репо (некоторые из которых не ваши), этого будет недостаточно. - person Kermit_ice_tea; 01.07.2016

git push origin --delete <branch Name>

легче запомнить чем

git push origin :branchName
person Smila    schedule 02.05.2015

Чтобы удалить локально - (нормально)

git branch -d my_branch

Если ваша ветка находится в процессе перебазирования / слияния и это не было сделано должным образом, это означает, что вы получите сообщение об ошибке Rebase/Merge in progress, поэтому в этом случае вы не сможете удалить свою ветку.

Так что либо нужно решать ребазинг / слияние. В противном случае вы можете принудительно удалить, используя,

git branch -D my_branch

Чтобы удалить на удаленном:

git push --delete origin my_branch

Вы можете сделать то же самое, используя:

git push origin :my_branch   # Easy to remember both will do the same.

Графическое представление:

Введите описание изображения здесь

person Mohideen bin Mohammed    schedule 23.06.2017

Теперь это можно сделать с помощью приложения GitHub Desktop.

После запуска приложения

  1. Щелкните проект, содержащий ветку
  2. Переключитесь на ветку, которую хотите удалить

    Смена ветки

  3. В меню «Ветвь» выберите «Отменить публикацию ...», чтобы удалить ветку с серверов GitHub.

    Отменить публикацию ветки

  4. В меню «Ветвь» выберите «Удалить» branch_name «...», чтобы ветка была удалена с вашего локального компьютера (он же машина, на которой вы в настоящее время работаете).

    «Удалить

person Eric    schedule 22.10.2015
comment
Я не голосовал против, но считаю, что это не помогает. Вопрос, очевидно, заключается в том, чтобы получить более ответ в виде командной строки без необходимости использовать внешнюю программу, если бы люди щелкали здесь, они, вероятно, не будут искать github для настольных ПК. - person Daemedeor; 06.11.2015
comment
@Daemedeor, я не согласен. В 2010 году, когда OP задал вопрос, пользовательского интерфейса не существовало, и единственным вариантом была командная строка. Чтобы указать, что вам нужен параметр только для командной строки, он должен быть указан в вопросе или с тегом command-line- интерфейс, которого в данном случае нет. - person Eric; 06.11.2015
comment
Команда git для удаления удаленной ветки - отстой, и я часто ее забываю (как новую, так и старую). К счастью, есть инструменты с графическим интерфейсом, у которых есть такая возможность. Он есть в Git Gui, TortoiseGit и GitHub Desktop - я бы хотел, чтобы у Git Extensions тоже была эта функциональность. В любом случае, я помню, как запускать Git Gui из Git Extensions, когда мне нужно удалить удаленную ветку. - person vezenkov; 26.03.2016

Это не сработает, если у вас есть тег с тем же именем, что и ветка на пульте дистанционного управления:

$ git push origin :branch-or-tag-name
error: dst refspec branch-or-tag-name matches more than one.
error: failed to push some refs to '[email protected]:SomeName/some-repo.git'

В этом случае вам нужно указать, что вы хотите удалить ветку, а не тег:

git push origin :refs/heads/branch-or-tag-name

Точно так же, чтобы удалить тег вместо ветки, вы должны использовать:

git push origin :refs/tags/branch-or-tag-name
person Greg    schedule 29.07.2014
comment
Это нормально, но люди действительно не должны давать своим веткам и тегам одно и то же имя и одну и ту же схему именования. - person ; 29.07.2014
comment
Что ж, мой сценарий заключался в том, что я конвертировал ветку в тег, и было разумно, чтобы тег имел то же имя, что и ветка. Под преобразованием я подразумеваю слияние ветки B с A и пометку последней фиксации в ветке B тегом B, чтобы после удаления ветки B ее все еще можно было легко восстановить, просто проверив тег B. - person Greg; 30.07.2014
comment
Подробнее о : и почему deletes - person Timo; 12.04.2021
comment
Я получаю ту же ошибку error: failed to push some refs to 'https://github.com/tik9/tik9.github.io', когда git push origin :refs/heads/main. Вероятно, виноват github. - person Timo; 12.04.2021

Многие другие ответы приведут к ошибкам / предупреждениям. Этот подход относительно надежен, хотя вам все равно может понадобиться git branch -D branch_to_delete, если он, например, не полностью объединен с some_other_branch.

git checkout some_other_branch
git push origin :branch_to_delete
git branch -d branch_to_delete

Удаленная обрезка не требуется, если вы удалили удаленную ветку. Он используется только для получения самых последних пультов дистанционного управления, доступных в репозитории, который вы отслеживаете. Я заметил, что git fetch будет добавлять пульты дистанционного управления, а не удалять их. Вот пример того, когда git remote prune origin действительно что-то сделает:

Пользователь А выполняет описанные выше действия. Пользователь B будет запускать следующие команды, чтобы увидеть самые свежие удаленные ветки:

git fetch
git remote prune origin
git branch -r
person Brandon Cook    schedule 27.11.2013

Мне надоело гуглить этот ответ, поэтому я применил аналогичный подход к ответу, который crizCraig опубликовал ранее.

Я добавил в свой профиль Bash следующее:

function gitdelete(){
    git push origin --delete $1
    git branch -D $1
}

Затем каждый раз, когда я заканчиваю работу с веткой (например, слитая с master), я запускаю в своем терминале следующее:

gitdelete my-branch-name

... который затем удаляет my-branch-name из origin, а также локально.

person arthurakay    schedule 10.02.2016
comment
расширяя это, --delete "$@" и -D "$@" вместо $1 будут обрабатывать его для нескольких ветвей. - person kunl; 27.06.2016
comment
Я предлагаю сначала запустить git branch -d (с буквой d в нижнем регистре), чтобы убедиться, что изменения были объединены, а затем нажмите в случае успеха (вставьте && между командами) - person bryn; 19.07.2016

Перед выполнением

git branch --delete <branch>

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

git ls-remote

Это подскажет вам, что вводить именно для <branch> значения. (branch чувствителен к регистру!)

person jbooker    schedule 20.05.2016

Использовать:

git push origin :bugfix  # Deletes remote branch
git branch -d bugfix     # Must delete local branch manually

Если вы уверены, что хотите его удалить, запустите

git branch -D bugfix

Теперь, чтобы очистить удаленные удаленные ветки, запустите

git remote prune origin
person user    schedule 21.04.2016

Согласно последнему документу, используя терминал, мы можем удалить следующим образом.

Удалить на локальном уровне:

git branch -D usermanagement

Удалить в удаленном месте:

git push --delete origin usermanagement
person KARTHIKEYAN.A    schedule 23.10.2017
comment
Я действительно понятия не имею, почему команда git настолько непоследовательна и не интуитивно понятна для запоминания. Смотрит на удаление, один -D, другой -d|--delete - person Honghao Zhang; 01.12.2020
comment
Это единственное решение, которое сработало для меня +1. - person Yahya; 03.02.2021

Вот смесь всех остальных ответов. Он требует Ruby 1.9.3+ и протестирован только на OS X.

Назовите этот файл git-remove, сделайте его исполняемым и поместите в свой путь. Тогда используйте, например, git remove temp.

#!/usr/bin/env ruby
require 'io/console'

if __FILE__ == $0
      branch_name = ARGV[0] if (ARGV[0])
      print "Press Y to force delete local and remote branch #{branch_name}..."
    response = STDIN.getch
    if ['Y', 'y', 'yes'].include?(response)
      puts "\nContinuing."
      `git branch -D #{branch_name}`
      `git branch -D -r origin/#{branch_name}`
      `git push origin --delete #{branch_name}`
    else
      puts "\nQuitting."
    end
end
person Dan Rosenstark    schedule 19.11.2013
comment
@chhh, тогда вам нужно расширить эту функциональность, чтобы сделать ее переменной, а не предположением. - person Dan Rosenstark; 05.12.2014
comment
извините, но установить Ruby для такой работы? Более логичной является реализация на bash, которая будет работать «из коробки». - person Reishin; 21.05.2015
comment
@Reishin Ruby устанавливается на коробке так же, как Bash, по крайней мере, на OSX. См.: stackoverflow.com/questions/2342894/, где SO отклонил эту тему как основанную на мнении. - person Dan Rosenstark; 21.05.2015
comment
@Yar эта ссылка вне контекста и имеет более широкий охват. Я говорю только о git, и поскольку тема не только для OSX, выбор странен для других систем (например, * UNIX, Windows) - person Reishin; 21.05.2015

Я добавил в свой .gitconfig файл следующие псевдонимы. Это позволяет мне удалять ветки с указанием имени ветки или без него. Имя ветки по умолчанию используется для текущей ветки, если не передан аргумент.

[alias]
    branch-name = rev-parse --abbrev-ref HEAD     

    rm-remote-branch = !"f() { branch=${1-$(git branch-name)}; git push origin :$branch; }; f"
    rm-local-branch = !"f() { branch=${1-$(git branch-name)}; git checkout master; git branch -d $branch; }; f"
    rm-branch-fully = !"f() { branch=${1-$(git branch-name)}; git rm-local-branch $branch; git rm-remote-branch $branch; }; f"
person Jared Knipp    schedule 22.02.2017
comment
Будьте осторожны с опцией de -D. В партии рассмотрите возможность использования меньшего -d - person Alwin Kesler; 04.03.2017
comment
В моем случае я почти всегда удаляю после слияния (или без слияния). При использовании нижнего -d ветка будет объединена перед удалением. , использование -D вызывает удаление ветки. - person Jared Knipp; 05.03.2017

Альтернативой командной строке для удаления удаленных ветвей является страница веток GitHub.

См., Например: https://github.com/angular/angular.js/branches

Находится на странице Code -> Branches репозитория GitHub.

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

person Bradley Flood    schedule 04.02.2016

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

branch_not_delete=( "master" "develop" "our-branch-1" "our-branch-2")

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do

    # Delete prefix remotes/origin/ from branch name
    branch_name="$(awk '{gsub("remotes/origin/", "");print}' <<< $branch)"

    if ! [[ " ${branch_not_delete[*]} " == *" $branch_name "* ]]; then
        # Delete branch remotly and locally
        git push origin :$branch_name
    fi
done
  • Перечислите ветки, которые вы не хотите удалять
  • Перебирайте ветки пульта ДУ и, если их нет в нашем «списке сохранения», удалите их.

Источник: Немедленное удаление веток Git

person levi    schedule 04.08.2016
comment
вы должны раскрывать свою принадлежность при размещении ссылок на внешние ресурсы, автором которых вы являетесь. - person Jean-François Fabre; 07.12.2020

Используя Git Bash, вы можете выполнить следующее:

git branch --delete <branch>

Or

-

В настольном приложении GitHub, когда у вас есть ветка, вы можете удалить локальную ветку через полосу меню Branch:

Введите здесь описание изображения

Если вы не настольного приложения GitHub и используете IDE, например Visual Studio, для локального управления исходным кодом, все, что вам нужно сделать, это несколько быстрых шагов:

  1. Найдите ветку, отличную от той, которую вы хотите удалить.
  2. Щелкните правой кнопкой мыши ветку, которую хотите удалить.
  3. В контекстном меню выберите вариант Удалить.

Затем, войдя в свою учетную запись GitHub в Интернете, перейдите в репозиторий и щелкните вкладку Все ветви. Оттуда просто нажмите на маленький значок корзины справа от названия ветки, которую вы хотите удалить.

Введите здесь описание изображения

* Имейте в виду - если ветка не опубликована, не нужно пытаться удалить ее из онлайн-репозитория.

person Uchiha Itachi    schedule 12.02.2017
comment
Я не вижу этих вкладок Overview, Yours, Active, State и All branches на веб-сайте GitHub. Похоже, это старый снимок. На вкладке Code я вижу вложенные вкладки, такие как коммиты, ветки, выпуски и участники. Когда я являюсь владельцем репозитория, я вижу дополнительную вкладку с именем MIT. - person RBT; 01.08.2017
comment
git branch --delete <branch> не удаляет удаленную ветку, вам нужно git push <server> --delete <branch> для этого - person Sheldon; 24.08.2017

Я создал в своем файле .bash_aliases следующую удобную функцию:

git-delete-branch() 
{ 
    if [[ -n $1 ]]; then
        git checkout master > /dev/null;
        branch_name="$1";
        echo "Deleting local $branch_name branch...";
        git branch -D "$branch_name";
        echo "Deleting remote $branch_name branch...";
        git push origin --delete "$branch_name";
        git remote prune origin;
        echo "Your current branches are:";
        git branch -a;
    else
        echo "Usage: git-delete-branch <branch_name>";
    fi
}
person Vagelis Prokopiou    schedule 25.09.2017

Самый гибкий способ - использовать настраиваемую команду Git. Например, создайте следующий сценарий Python где-нибудь в вашем $PATH под именем git-rmbranch и сделайте его исполняемым:

#!/usr/bin/env python3

import argparse
import subprocess
import sys

def rmbranch(branch_name, remote, force):
    try:
        print(subprocess.run(['git', 'branch', '-D' if force else '-d', branch_name],
                             capture_output=True, check=True, encoding='utf-8').stdout, end='')
    except subprocess.CalledProcessError as exc:
        print(exc.stderr.replace(f'git branch -D {branch_name}', f'git rmbranch -f {branch_name}'), end='')
        return exc.returncode

    return subprocess.run(['git', 'push', remote, '--delete', branch_name]).returncode    

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Delete a Git branch locally and remotely.')
    parser.add_argument('-r', '--remote', default='origin', help="The remote name (defaults to 'origin')")
    parser.add_argument('-f', '--force', action='store_true', help='Force deletion of not fully merged branches')
    parser.add_argument('branch_name', help='The branch name')
    args = parser.parse_args()

    sys.exit(rmbranch(args.branch_name, args.remote, args.force))

Затем git rmbranch -h покажет вам информацию об использовании:

usage: git-rmbranch [-h] [-r REMOTE] [-f] branch_name

Delete a Git branch locally and remotely.

positional arguments:
  branch_name           The branch name

optional arguments:
  -h, --help            show this help message and exit
  -r REMOTE, --remote REMOTE
                        The remote name (defaults to 'origin')
  -f, --force           Force deletion of not fully merged branches

Обратите внимание, что git push origin --delete <branch_name> также удаляет локальную ветвь удаленного отслеживания (origin/<branch_name> по умолчанию), поэтому не нужно об этом заботиться.

P.S. Последнюю версию этой команды Git можно найти здесь. Комментарии и предложения приветствуются.

person Eugene Yarmash    schedule 03.09.2019
comment
Сама по себе установка Python для выполнения каких-либо действий git не является решением. Больше похоже на упражнение по программированию. - person Mogens TrasherDK; 02.01.2020
comment
@Mogens Python уже предустановлен в большинстве нормальных дистрибутивов. Только с git вы не можете, например: 1) настроить вывод (например, сделать его более согласованным) 2) объединить несколько команд желаемым образом 3) легко настроить логику. Кроме того, вводить одни и те же команды снова и снова довольно скучно. - person Eugene Yarmash; 02.01.2020

Первые несколько методов у меня не сработали,

Допустим, у вас есть следующая ветка и удаленная ветка,

Local  : Test_Branch
Remote : remotes/origin/feature/Test_FE

Правильно настройте восходящий поток для вашей локальной ветки, чтобы отслеживать удаленную ветку, которую вы хотите удалить.

git branch --set-upstream-to=remotes/origin/feature/Test_FE Test_Branch

Затем, чтобы удалить удаленную ветку, выполните это

git push origin --delete Test_Branch

Затем, чтобы удалить локальную ветку, выполните следующую команду

git branch -D Test_Branch

Вот и все. Ваше здоровье.

person sachyy    schedule 04.06.2021
comment
git push <remote_name> :<branch_name> действительно не работает? В вашем случае git push origin :Test_FE. Это указано в принятом ответе, получившем наибольшее количество голосов, который был опубликован 11 лет назад. - person Andras Deak; 04.06.2021
comment
Извините, вероятно, это должно было быть :feature/Test_FE. - person Andras Deak; 04.06.2021
comment
да. может быть из-за каталогов не получилось. При правильном названии все должно работать, так как я вижу количество положительных голосов. Но я думал поделиться тем, что узнал. Спасибо - person sachyy; 09.06.2021

И CoolAJ86, и apenwarr ответы очень похожи. Я ходил туда-сюда, пытаясь понять лучший подход для поддержки замены подмодуля. Ниже представлена ​​их комбинация.

Сначала перейдите Git Bash в корень репозитория Git, который нужно разделить. В моем примере это ~/Documents/OriginalRepo (master)

# Move the folder at prefix to a new branch
git subtree split --prefix=SubFolderName/FolderToBeNewRepo --branch=to-be-new-repo

# Create a new repository out of the newly made branch
mkdir ~/Documents/NewRepo
pushd ~/Documents/NewRepo
git init
git pull ~/Documents/OriginalRepo to-be-new-repo

# Upload the new repository to a place that should be referenced for submodules
git remote add origin [email protected]:myUsername/newRepo.git
git push -u origin master
popd

# Replace the folder with a submodule
git rm -rf ./SubFolderName/FolderToBeNewRepo
git submodule add [email protected]:myUsername/newRepo.git SubFolderName/FolderToBeNewRepo
git branch --delete --force to-be-new-repo

Ниже приведена копия вышеизложенного с замененными настраиваемыми именами и использованием вместо этого HTTPS. Корневая папка теперь ~/Documents/_Shawn/UnityProjects/SoProject (master)

# Move the folder at prefix to a new branch
git subtree split --prefix=Assets/SoArchitecture --branch=so-package

# Create a new repository out of the newly made branch
mkdir ~/Documents/_Shawn/UnityProjects/SoArchitecture
pushd ~/Documents/_Shawn/UnityProjects/SoArchitecture
git init
git pull ~/Documents/_Shawn/UnityProjects/SoProject so-package

# Upload the new repository to a place that should be referenced for submodules
git remote add origin https://github.com/Feddas/SoArchitecture.git
git push -u origin master
popd

# Replace the folder with a submodule
git rm -rf ./Assets/SoArchitecture
git submodule add https://github.com/Feddas/SoArchitecture.git
git branch --delete --force so-package
person ShawnFeatherly    schedule 18.02.2019

person    schedule
comment
Обратите внимание, что -D принудительно удаление. Всегда лучше использовать -d, который напомнит, если нужно сделать что-то опасное. - person Jonathon Reinhart; 10.01.2015
comment
ахахах :) решать вам: используйте -d, если хотите, чтобы git плачет, или -D, если хотите плакать. - person Felipe; 13.02.2015