Используя Git, покажите все коммиты, которые находятся в одной ветви, но не в других - PullRequest
405 голосов
/ 10 ноября 2009

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

Ответы [ 9 ]

483 голосов
/ 17 ноября 2010

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

git log --no-merges oldbranch ^newbranch

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

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

Примечание: в Windows ^ - это управляющий ключ, поэтому его необходимо экранировать другим ^:

git log --no-merges oldbranch ^^newbranch
274 голосов
/ 10 ноября 2009

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

git branch --contains branch-to-delete

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

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

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

77 голосов
/ 21 февраля 2014

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

git log newbranch..oldbranch

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

git diff newbranch...oldbranch

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

49 голосов
/ 15 октября 2015

Для тех, кто все еще ищет простой ответ, проверьте 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.

Для ТОЛЬКО коммитов, которые не находятся в мастере, комбинируйте вишневый кир с grep:

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

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

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
49 голосов
/ 05 января 2011

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

- объединено используется для поиска всех ветвей, которые можно безопасно удалить, поскольку эти ветви полностью содержатся в 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
15 голосов
/ 18 июня 2015

ответ jimmyorr не работает в Windows. помогает использовать --not вместо ^ следующим образом:

git log oldbranch --not newbranch --no-merges
7 голосов
/ 11 ноября 2009

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

$ git checkout A
$ git branch -d B

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

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

3 голосов
/ 30 мая 2012

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

#!/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 , который будет отображать состояние ветвей

0 голосов
/ 13 июля 2017

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

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

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

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

Can't create a PR for branches that have been merged.

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

...