Отображение коммитов, сделанных непосредственно в ветке, без учета слияний в Git


86

При использовании git есть ли способ показать коммиты, сделанные в ветке, игнорируя все коммиты, внесенные слиянием?

Я пытаюсь просмотреть изменения кода, сделанные в ветке, игнорируя те, которые мы внесли в другие ветки, которые были объединены. Я знаю, что почти невозможно показать разницу таким образом, но я хотел бы иметь возможность узнать, какие коммиты мне нужно просмотреть.

Ответы:


123

--no-merges

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

git log --no-merges --first-parent

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

git log --no-merges ^other-branch-1 ^other-branch-2 ^other-branch-3

Если вы хотите просмотреть изменения, которые вы собираетесь объединить обратно в основную ветвь, то проще всего выполнить слияние на локальном клоне, а затем просто просмотреть разницу с первым родителем перед публикацией слияния.


Эта первая команда отлично подходит для «правильной ветки на каждую функцию» ( plus.google.com/109096274754593704906/posts/R4qkeyRadLR )
Адам Димитрук

1
Кажется, что в основном я получаю коммиты из этой ветки, но она все еще показывает коммиты, которые были извлечены из мастера. У нас так много ветвей, что исключать другие было бы непрактично.
Channel Cat,

@ChannelCat, почему бы не перенастроить свою ветку на другую, тогда все коммиты будут в конце?
Марк Ингрэм

7

Вы можете использовать git cherryдля этого свои коммиты, которые еще не были объединены с восходящим потоком, или коммиты, которые находятся в одной ветке, но не в другой. Итак, даны две ветки с именами «your-branch» и «master»:

git cherry -v your-branch master

представит вам список коммитов по сравнению с их идентификатором патча:

+ c3e441bf4759d4aa698b4a413f1f03368206e82f Updated Readme
- 2a9b2f5ab1fdb9ee0a630e62ca7aebbebd77f9a7 Fixed formatting
+ e037c1d90b812af27dce6ed11d2db9454a6a74c2 Corrected spelling mistake

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

В качестве альтернативы вы можете использовать:

git log --pretty=format:"%h %s" your-branch..master --no-merges

который покажет вам список коммитов, сделанных на «your-branch», но еще не присутствующих на «master»


Поскольку моя попытка отредактировать ваш ответ была отклонена, я опубликую ее здесь: в вашей последней строке git должно быть три точки, а не две между названиями веток. Как это: your-branch ... master
vedranm

@vedranm Вам не нужны 3 точки, только две ... хотя 3 работают так же, как 2.
Zzzach ...

4

Очень хакерский способ:

git log --graph --oneline --no-merges thebranch|grep '^\*'

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.