Git: удалить ветку, если она равна или позади master из-за слияния ребаз? - PullRequest
0 голосов
/ 23 февраля 2019

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

git branch oldbranch -d
git branch oldbranch -D

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

Теперь рассмотрим рабочий процесс, когда ветвь была преобразована в основную, а не объединена.Первая команда не удалит ветку (она не была объединена).Второй удалит ветку, но в любом случае это сделает (даже если ребазинг еще не сделан).Интересно, есть ли более безопасный способ удалить ветку, которая может быть:

  1. в худшем случае "удалить, если diff между текущей веткой и мастером является emtpy"
  2. вв лучшем случае (поскольку master может иметь другие новые коммиты) «delete, если master содержит коммиты, которые равны коммитам этой ветви с момента его создания» (конечно, в некоторых случаях могут быть проблемы с битом «равный», но дляболее простые ..)

Знаете ли вы какую-либо такую ​​команду?

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

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

git log --no-merges --cherry-pick --left-only oldbranch...master

Это симметричная разница с три точки--cherry-pick находит "вишня" коммиты, которые не имеют эквивалента в другой ветке.Симметричное различие обычно показывает коммиты из одной ветви, которые не имеют эквивалентов в другой;--left-only говорит, что он показывает только коммиты из левой ветви (oldbranch, в данном случае).

Если вы не хотите видеть коммиты, вы можете заменить git rev-list --count на git log.

0 голосов
/ 23 февраля 2019

В случае

в лучшем случае (поскольку мастер может иметь другие новые коммиты) "удалить, если мастер содержит коммиты, которые ~ равны коммитам этой ветви с момента его создания" (конечно, могут быть проблемы с битом "равный" вв некоторых случаях, но для более простых ..)
git rebase master oldbranch
git checkout master
git branch -d oldbranch

должен сделать это, rebase идентифицирует и игнорирует коммиты, которые вы уже выбрали, и, если это все из них master иoldbranch будет таким же коммитом, т.е. oldbranch уже объединен и удаление успешно завершено.

Но case

  1. в худшем случае "delete if diff между текущимветвь и мастер пустые "

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

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

if [[ `git rev-parse master:` = `git rev-parse oldbranch:` ]]; then
        echo '`oldbranch` tip identical to master tip, not bothering with rebase, deleting'
        git checkout master &&
        git branch -D oldbranch
else
        git rebase master oldbranch &&
        git checkout master &&
        git branch -d oldbranch && echo oldbranch completely merged, deleting
fi

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

0 голосов
/ 23 февраля 2019

Несколько способов пометить, какой коммит был выбран во время cherry-pick

cherry-pick -x

Вы можете использовать cherry-pick -x, чтобы у вас был исходный коммит, выбранный для cherry-pick

git notes

Используйте git notes для добавления заметок (заметки не являются частью SHA-1) и могут быть удалены или изменены без воздействия на идентификатор фиксации

Выясните, содержит ли ветвь коммиты

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

git branch --contains <commit>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...