У меня есть ветка, которую я бы хотел удалить. Однако, прежде чем делать это, я хочу проверить, что все фиксации, сделанные в этой ветке, в какой-то момент слились в другую ветку. Таким образом, я хотел бы видеть, что все коммиты, сделанные в моей текущей ветке, которые не были применены к какой-либо другой ветке [или, если это невозможно без некоторых сценариев, как видеть все коммиты в одной ветки, которые не были применены к другой данной ветке?].
Используя 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 - более подходящее решение для вашей задачи.
В 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, который отображает состояние ветвей
Ответ 9
Чтобы перечислить недостающие коммиты между двумя ветвями, вы можете использовать compare-branches.py
Ответ 10
Начните создавать Pull-запрос с помощью используемого вами хостинга git. Если ветвь полностью объединена с базовой веткой, вы не сможете создать новый PR.
Вам не нужно на самом деле сделать запрос на извлечение, просто используйте первый шаг, где вы выбираете ветки.
Например, на GitHub:
Там не с чем сравнивать
Это не использует git в командной строке, но я часто нахожу полезным использовать другие инструменты в вашем распоряжении с ясной мысленной моделью, а не пытаться запомнить другую загадочную команду git.