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

У меня есть старая ветка, которую я хотел бы удалить. Однако, прежде чем сделать это, я хочу проверить, что все коммиты, сделанные в этой ветке, в какой-то момент были объединены в какую-то другую ветку. Таким образом, я хотел бы видеть все коммиты, сделанные в моей текущей ветке, которые не были применены ни к какой другой ветке [или, если это невозможно без некоторых сценариев, как можно увидеть все коммиты в одной ветке, которые не были применены? в другую данную ветку?].

10.11.2009 20:17:15
Чтобы составить список
Bernd Schubert 19.03.2014 17:03:50
Ioannis Filippidis 9.09.2017 05:18:03
9 ОТВЕТОВ
РЕШЕНИЕ

Вы, вероятно, просто хотите

git branch --contains branch-to-delete

Это выведет список всех веток, которые содержат коммиты от "branch-to-delete". Если он сообщает больше, чем просто «ветвь для удаления», ветвь была объединена.

Ваши альтернативы на самом деле просто синтаксис rev-list. например git log one-branch..another-branchпоказывает все что one-branchнужно чтобы все another-branchбыло.

Возможно, вам также будет интересно git show-branchузнать, что и где.

316
7.09.2012 14:12:02
VonC 10.11.2009 20:30:02
Строка «Если он сообщает о чем-то, ветка слилась» может быть неверно истолкована: если git branch --contains some-branchтолько возвращается some-branch, то она возвращает что-то, но она не была объединена.
Confusion 21.03.2012 16:26:56
Обратите внимание, что git log foo..barбудут показаны коммиты между последним баром и последним foo, но не будут зафиксированы другие коммиты, отсутствующие в более отдаленном времени. Чтобы увидеть все в баре, но не в foo, вы должны использовать решение @ jimmyorr.
Paul A Jungwirth 10.07.2014 16:34:52

Если вам нужно проверить одну (одну) ветку, например, если вы хотите, чтобы эта ветка 'B' была полностью объединена с веткой 'A', вы можете просто сделать следующее:

$ git checkout A
$ git branch -d B

git branch -d <branchname> имеет безопасность: «Ветвь должна быть полностью объединена в ГОЛОВУ».

Внимание : это фактически удаляет ветвь B, если она объединена с A.

7
14.02.2019 14:11:32

Чтобы увидеть список коммитов в одной ветви, но не в другой, используйте git log:

git log --no-merges oldbranch ^newbranch

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

git log  --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2

Примечание: в Windows ^это escape-ключ, поэтому его нужно экранировать другим ^:

git log --no-merges oldbranch ^^newbranch
546
9.12.2018 16:44:56
Я нашел это в поисках git Compare коммитов двух веток.
User 6.05.2013 08:53:11
Это именно то, что я искал. Но использование здесь ^в качестве префикса меня смутило. В этом контексте это означает исключить эту ветвь. Использование ^в качестве суффикса будет относительной ссылкой на родительский коммит этой ветви.
Joe Flynn 18.07.2013 16:38:31
очень полезное спасибо. Мне интересно, зачем нужен флаг --no-merges? Конечно, кто-то хочет увидеть эти коммиты тоже?
Max MacLeod 1.08.2013 08:17:50
Хотите использовать Gitk с этим? Просто используйте gitk oldbranch ^newbranch --no-merges(протестировано с git 1.8.1.1). Дополнительное примечание, для меня ^означает включающий HEAD коммит ветви newbranch.
Matt 24.12.2013 16:53:06
@NazariiGudzovatyi - да, есть: "-cherry-pick". Существует огромное количество вариантов для входа на странице документации
romeara 22.05.2015 15:30:55

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

--merged используется для поиска всех веток, которые можно безопасно удалить, поскольку эти ветви полностью содержатся в HEAD.

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

git branch --merged
  develop
  fpg_download_links
* master
  master_merge_static

# Delete local and remote tracking branches you don't want
git branch -d fpg_download_links
git push origin :fpg_download_links
git branch -d master_merge_static
git push origin :master_merge_static

# There is also a flag to specify remote branches in the output
git branch --remotes --merged
50
14.04.2016 15:41:11

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

#!/bin/bash
# Show commits that exists only on branch and not in current
# Usage:
#   git branch-notmerge <branchname>
#
# Setup git alias
#   git config alias.branch-notmerge [path/to/this/script]
grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s')

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

3
31.05.2012 15:29:23

Чтобы показать коммиты в oldbranch, но не в newbranch:

git log newbranch..oldbranch

Чтобы показать разницу по этим коммитам (обратите внимание, что есть три точки):

git diff newbranch...oldbranch

Вот документ с иллюстрацией диаграммы https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

88
5.10.2016 11:35:14
См . Комментарий Пола А Юнгвирта выше. Кажется, это пропустит некоторые старые коммиты?
Miserable Variable 9.01.2015 05:22:22
Я не уверен, что означают старые коммиты. Двойные точки в основном просят Git разрешить диапазон коммитов, которые доступны из одного коммита, но недоступны из другого. Вот документ с иллюстрацией диграммы git-scm.com/book/en/v2/…
Xuan 9.01.2015 09:22:50
и если мы на или newbranchили oldbranch, мы можем сделать git log ..oldbranchили git log newbranch..соответственно
YakovL 5.02.2019 19:17:41

Ответ jimmyorr не работает на Windows. это помогает использовать --notвместо ^так:

git log oldbranch --not newbranch --no-merges
16
23.05.2017 11:47:30
Это правильно, +1. Обратите внимание , однако , что ^поддерживается на Windows, но нужно экранировать, что, в Windows, есть (другой) ^: git log oldbranch ^^newbranch --no-merges.
VonC 18.06.2015 09:42:07
В частности, он работает в Windows в консоли Powershell, но требует дополнительного «^» в CMD.
Rod 7.09.2015 05:39:57

Для тех, кто все еще ищет простой ответ, проверьте git cherry . Он сравнивает реальные различия вместо хеши фиксации. Это означает, что он вмещает коммиты, которые были выбраны или перебраны вишней.

Сначала оформите ветку, которую хотите удалить:

git checkout [branch-to-delete]

затем используйте git cherry, чтобы сравнить его с вашей основной веткой разработки:

git cherry -v master

Пример вывода:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message

Примечание. -vФлаг должен включать сообщение о фиксации вместе с хешем SHA.

Строки с '+' находятся в ветви для удаления, но не в главной ветви. Те, у кого впереди символ «-», имеют эквивалентный коммит в master.

Для просто коммитов, которых нет в master, объедините вишневый кир с grep:

git cherry -v master | grep "^\+"

Пример вывода:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
56
14.10.2015 23:38:36
Я пробовал это, но он все еще сообщает, что есть много коммитов в fb (функциональная ветвь), которых нет в mb (основная ветвь). Однако, если я нахожусь в fb и делаю git diff mb, я не вижу различий. Я использовал rebase и раздавил все. Я почти уверен, что именно поэтому, но я просто хочу быть уверен. Если это так, то я буду избегать раздавливания, если это вообще возможно; Я нахожусь в "информационном лагере без потерь". Интересно, можно ли было бы добавить режим отображения журнала, который может отображать слияния, как если бы они были перебазированием, чтобы сохранить историю в чистоте и при этом не потерять информацию.
Outis Von Nemo 29.06.2016 14:57:33
Не уверен в вашем точном сценарии здесь, но если вы собрали несколько коммитов в один и сравнили это с другой веткой, где коммиты разделены, это определенно не сработает. В этом случае вы можете просто использовать diffутилиту unix для сравнения различных файлов. Или вы можете создать временную ветку и раздавить все коммиты в том же порядке, что вы делали с оригинальной веткой, а затем использовать это, что, я думаю, сработает.
Tim S 1.07.2016 00:04:08

Начните создавать Pull-запрос через используемую вами службу хостинга git. Если ветвь полностью объединена с базовой веткой, вы не сможете создать новый PR.

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

Например, на GitHub:

Не с чем сравнивать

Не удается создать пиар для филиалов, которые были объединены.

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

-4
4.04.2019 19:53:23