2009-11-10 3 views
340

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

+0

Связанный: https://stackoverflow.com/q/1419623/1959808 –

ответ

235

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

git branch --contains branch-to-delete 

Это перечислит все ветви, которые содержат фиксации из «ветвей к удалению». Если он сообщает больше, чем просто «от ветки к удалению», ветвь была объединена.

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

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

+2

+1. См. Также http://stackoverflow.com/questions/850607/difference-in-git-log-origin-master-vs-git-log-origin-master – VonC

+1

Строка «Если он что-то сообщает, ветвь слилась» может неверно истолковывается: если 'git branch - содержит некоторую ветвь 'возвращает только' some-branch', то она возвращает что-то, но имеет * не * объединение. – Confusion

+1

git show-branch очень информативна –

7

Если один (одна) ветвь, вам нужно проверить, если вы хотите, чтобы ветвь «B» полностью объединены в филиал «А», вы можете просто сделать следующее:

$ git checkout A 
$ git branch -d B 

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

Примечание, что это на самом деле удалить ветвь, если она объединяется в,

+4

* Внимание: * 'git branch -d ' фактически удаляет ветвь. Я только что это сделал! – Haywire

414

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

git log oldbranch ^newbranch --no-merges 

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

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

Примечание: В Windows ^ является ключом побега, поэтому он должен быть экранирован с другим ^:

git log oldbranch ^^newbranch --no-merges 
+2

Я нашел, что он ищет git compare commits двух ветвей. – User

+16

Это именно то, что я искал. Но использование '^' в качестве префикса здесь путало меня. В этом контексте это означает исключение этой ветви. Использование '^' в качестве суффикса будет относительной ссылкой на родительский фиксатор этой ветви. –

+2

очень полезно. Мне любопытно, почему нужен флаг -no-merges? Наверняка, кто-то хочет видеть эти коммиты? –

48

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

--merged is used to find all branches which can be safely deleted, since those branches are fully contained by 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 
+1

Очень полезная команда для очистки. – Kzqai

+0

Действительно полезная команда. Принятый ответ более уместен в вопросе, но я обязательно буду использовать в будущем то, что вы поделили, поэтому спасибо – Cec

3

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

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

51

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

git log newbranch..oldbranch 

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

git diff newbranch...oldbranch 

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

+0

См. Комментарий [Paul A Jungwirth] (http://stackoverflow.com/questions/1710894/using-git- show-all-commits-that-are-in-one-branch-but-not-the-others # comment38269236_1710951) выше. Кажется, это упустит некоторые старые коммиты? –

+1

Я не уверен, что означают старые коммиты. Двойные точки в основном требуют, чтобы Git разрешал ряд коммитов, которые достижимы с одного коммита, но недоступны для другого. Вот документ с рисунком digram http://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges – Xuan

10

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

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

Правильно, +1. Обратите внимание, что '' 'поддерживается в Windows, но нужно экранировать, который в Windows является (другим)'^':' git log oldbranch ^^ newbranch --no-merges'. – VonC

+0

@ VonC исправил этот ответ с вашим комментарием. http://stackoverflow.com/a/4207176/2790048 –

+0

@NickVolynkin молодец! – VonC

35

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

Первый выезд филиал вы хотите удалить:

git checkout [branch-to-delete]

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

git cherry -v master

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

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

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

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

Для РАЗ коммитов, которые не мастер, смешайте вишни забрать с Grep:

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

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

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message 
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message 
+0

Я пробовал это, но он все еще сообщает, что в fb (ветке признаков) есть много коммитов, которые не находятся в mb (главная ветвь). Однако, если я нахожусь в fb и делаю git diff mb, я не вижу различий. Я использовал rebase и раздавил все. Я почти уверен, что именно поэтому, но я просто хочу быть уверенным. Если это так, тогда я собираюсь избегать раздавливания, если это вообще возможно; Я в «нет потерянного информационного лагеря». Интересно, можно ли добавить режим отображения журнала, который может отображать слияния, как если бы они были переформатированы, чтобы сохранить историю чистой и все же потерять информацию. –

+0

Не уверен в вашем конкретном сценарии здесь, но если вы раздавили несколько коммитов вместе в один и сравниваете это с другой ветвью, где коммиты разделены, это определенно не сработает. В этом случае вы можете просто использовать утилиту unix 'diff' для сравнения различных файлов. Или вы можете создать временную ветвь и сквоить все коммиты в том, что было похоже на то, что вы сделали с исходной ветвью, а затем использовать это, что, я думаю, будет работать. –

-3

Создать Толкай запрос через мерзавца хостинг который вы используете.Если филиал полностью слит в базовую ветку, вы не сможете создать новый PR.

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

There isn't anything to compare

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

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

Смежные вопросы