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

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

Ответ 1

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

git branch --contains branch-to-delete

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

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

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

Ответ 2

Чтобы увидеть список коммитов в одной ветки, но не в другой, используйте 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

Ответ 3

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

git log newbranch..oldbranch

Чтобы показать diff с помощью этих коммитов (обратите внимание, что есть три точки):

git diff newbranch...oldbranch

Вот документ со схемой https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

Ответ 4

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

Ответ 5

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

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

git checkout [branch-to-delete]

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

git cherry -v master

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

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

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

Линии с символом "+" впереди находятся в ветке-в-удалении, но не в главной ветки. Те, у кого есть "-" впереди, имеют эквивалентную фиксацию в master.

Для JUST коммитов, которые не находятся в главном, объедините вишню с grep:

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

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

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message

Ответ 6

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

git log oldbranch --not newbranch --no-merges

Ответ 7

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

$ git checkout A
$ git branch -d B

git branch -d <branchname> имеет безопасность, что "ветка должна быть полностью объединена в HEAD".

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

Ответ 8

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

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

Ответ 10

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

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

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

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

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

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