Как получить список разных коммитов между двумя ветками git? - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу увидеть список только не общих коммитов между двумя ветвями.

Как я могу получить такой вывод?

В основном сводка git diff -y master new-feature между двумя ветвями:

              master                               new-feature
-------------------------------------|--------------------------------------
xxx - Jan 1st 2018 - initial commit  | xxx - Jan 1st 2018 - initial commit
xxx - Feb 1st 2018 - fix a bug       | xxx - Feb 1st 2018 - fix a bug
                                     > xxx - Mar 1st 2018 - WIP almost done
xxx - Apr 1st 2018 - fix another bug | xxx - Apr 1st 2018 - fix another bug
xxx - May 1st 2018 - fix more bugs   | xxx - May 1st 2018 - fix more bugs
                                     > xxx - Jun 1st 2018 - Ready to merge!
xxx - Jul 1st 2018 - latest patches  < 


Решение : Я не знаю, как сделать из этого головы или хвосты, но я думаю, git log --graph выполняет это, просто с очень запутанным визуальным стилем:

git log --left-right --graph --cherry-pick --oneline master






или это?

Еще лучше, git diff -y --suppress-common-lines master new-feature - это то, что я действительно хочу:

              master                               new-feature
-------------------------------------|--------------------------------------
                                     > xxx - Mar 1st 2018 - WIP almost done
                                     > xxx - Jun 1st 2018 - Ready to merge!
xxx - Jul 1st 2018 - latest patches  <


Решение: Вы, вероятно, не можете с одним git, но, согласно ответу @ torek , вы можете получить в основном там с git rev-list:

git rev-list --left-right master...new-feature

>eb57618eed654685a7999da847628dc5eb27313f
>0da0196ab24542a1a1697b1c0c5efeef6d09e027
>9452f57d97e5fc86e773e7a9fca488b7a0d44a0c
<4fc12fe25a127f8f0dfddf7625c22656c7b2c7c1
<9c0058dcabacfc6560f4fbaf73ea55dd70d27036
>5117fcd041793898683f9469aac00337e9fadd8b






Или даже только это?

И что более важно, представление в стиле git diff --right-only master new-feature выполнит работу:

     commits only in new-feature
-------------------------------------
xxx - Mar 1st 2018 - WIP almost done
xxx - Jun 1st 2018 - Ready to merge!

Который, конечно, можно изменить, чтобы получить противоположное представление git diff --right-only new-feature master

       commits only in master               
-------------------------------------
xxx - Jul 1st 2018 - latest patches 


Решение : Как @ brentjanderson указывает , git log master..new-feature и git cherry -v master оба делают это:

git cherry -v master..new-feature

+ c00335cd93898683f9469aafad8a8476227b117f WIP do things
+ f5c86e777d97e5f3e7a9fca488b79a0d44ac9452 WIP do more
+ 0ef6ddda576180196ab7b1c0c57eefe009e027dc Finished!

а также

git log master..new-feature --format="%h - %ad - %s" --date=format:'%b %d %Y'

c00335cd - Jan 01 2018 - WIP do things
f5c86e77 - Feb 01 2018 - WIP do more
0ef6ddda - Mar 01 2018 - Finished!



P.S. Я пытался git checkout new-feature; git log --left-right --graph --cherry-pick --oneline master раньше, но я не могу сделать вывод или рассказы (или хвосты) о выходе. На самом деле, если подумать, я поставил на вывод, повернул его вбок и сыграл его как карту возбуждающего велосипеда. Хм ...

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Вот базовый вариант без необычного форматирования:

git log master..new-feature

Вы можете получить данные «левой стороны» или «правой стороны», поменяв местами порядок ветвей:

git log left-side-branch..right-side-branch

Это работает и с другими ссылками (коммиты, удаленные ветви, теги).

Чтобы получить полное форматирование даты, которое вы хотите:

git log master..new-feature --format="%h - %ad - %s" --date=format:'%b %d %Y'

Это не делает порядковые даты (Mar 1st 2018 - Mar 01 2018), потому что strftime не поддерживает это. Если это сложное требование, я предлагаю написать пакетный скрипт.

0 голосов
/ 01 ноября 2018

Я хочу увидеть список только не общих коммитов между двумя ветвями.

В теории множеств это симметричная разность набора коммитов, достижимых из ветвей X и Y.

Эта конкретная группировка наборов настолько полезна, что она встроена в анализатор ревизий Git с использованием синтаксиса, описанного в документации gitrevisions , с использованием трех точек: X...Y.

Как их получить [отформатировано каким-то определенным способом]

Начните с git rev-list --left-right master...new-feature. При использовании симметричной разностной нотации и добавлении --left-right, Git перечислит коммиты вместе с маркером: <, если коммиты достижимы по имени слева, но не по имени справа, или > если коммиты достижимы от имени справа, но не от имени слева. Следовательно:

git rev-list --left-right master...new-feature

даст вам:

<aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd
>eeeeeeeeeeffffffffff00000000001111111111
Например,

, если commit aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd существует в master, но не в new-feature, а commit eeeeeeeeeeffffffffff00000000001111111111 существует в new-feature, но не в master.

(Опции, такие как cherry-mark и --left-only и т. Д., Изменяют или заменяют маркеры, чтобы указать, какие коммиты эквивалентны патчу, если таковые имеются, или опустить левую или правую сторону, или оба. Для этого случая вы не делаете хочу это.)

Получив список от git rev-list, вы можете переформатировать его так, как вам нравится. Вы можете использовать эти же опции с git log, но обычно лучше сначала собрать хеш-идентификаторы, а затем заниматься форматированием, если только директивы git log --pretty=format:... не соответствуют тому, что вам нужно (чтобы выяснить, см. ФОРМАТЫ ДОВОЛЬНЫХ раздела git log документации ).

0 голосов
/ 01 ноября 2018

Я думаю, что запуск git cherry -v master в вашей ветке new-feature должен работать с правой стороны. затем сделайте обратное на мастере для левой части списка

...