Как исключить прародителей из вторых родителей в топологическом порядке? - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь настроить порядок топологической фиксации в git так, чтобы второй родитель отображался только тогда, когда такого первого родителя не было. Вот скрипт для настройки:

touch a
git add a
git commit -m "a"

git checkout -b feature_b
touch b
git add b
git commit -m "b"

git checkout master
echo "1" > a
git commit -am "a1"

git checkout feature_b
git merge --no-ff -m "master to feature_b" master

git checkout master
git merge --no-ff -m "feature_b to master" feature_b

, что приводит к

$ git log --graph --abbrev-commit --format=oneline
*   697e92f (HEAD -> master) feature_b to master
|\  
| *   2eaef1a (feature_b) master to feature_b
| |\  
| |/  
|/|   
* | 2f83cbf a1
| * c4aa6df b
|/  
* d8f1101 a

Вопрос в том, как указать git перечислить коммит "b" перед "a1"? Чтобы вывод выглядел так

*   697e92f (HEAD -> master) feature_b to master
|\  
| * 2eaef1a (feature_b) master to feature_b
| |\
| * c4aa6df b
| | |  
| |/
|/|
* | 2f83cbf a1
|/  
* d8f1101 a

Причина, по которой я спрашиваю, состоит в том, что довольно часто происходит слияние назад и форсирование между ветвями master и release. И кажется более удобным не переупорядочивать коммиты, если это возможно. Более того, первый коммит "697e92f" явно заявляет, что "2eaef1a" идет после "2f83cbf". А поскольку «c4aa6df» является частью «2eaef1a», они должны отображаться вместе.

Пробовал разные варианты git, но либо у него его нет, либо я что-то упустил.

Ответы [ 3 ]

1 голос
/ 04 мая 2019

оказалось, что уже есть патч для Git, который делает именно то, что мне нужно.Патч был опубликован два месяца назад Миха Нелиссен.Вот ссылка .

Она вводит новую опцию "--tree"

Вот как это работает:

$ git log --tree --oneline
*   697e92f (HEAD -> master) feature_b to master
|\  
| * 2eaef1a (feature_b) master to feature_b
| * c4aa6df b
* 2f83cbf a1
* d8f1101 a

Спасибо всемза ваши комментарии!

0 голосов
/ 03 мая 2019

кажется более удобным не переупорядочивать коммиты […] первый коммит "697e92f" явно заявляет, что "2eaef1a" идет после "2f83cbf".

Я неувидеть любой повторный заказ здесь.Твоя мама обязательно старше твоего отца, потому что ты всегда говоришь "мама и папа"?Нет. То, где вы находитесь в одном списке, не «явно указывает», где вы находитесь в других списках.

И, поскольку «c4aa6df» является частью «2eaef1a», они должны отображаться вместе.

2f83 является такой же частью 697e, как c4aa является частью 2eae.Обе коммиты обязательно разделяются, чтобы нарисовать исходную ссылку , которую вы явно запросили .

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

0 голосов
/ 03 мая 2019

К сожалению, нет.Git имеет --first-parent, что исключает всех родителей , кроме первого, но не имеет условного «исключить первого родителя, если их больше 1» или «исключить всех, кроме 2-го родителя, когда фиксация является слиянием»"options.

То, что вы можете сделать, хотя это довольно болезненно, это использовать git rev-list для перечисления коммитов вместе с их родителями:

git rev-list --parents HEAD

Readвыход по одной строке за раз.Если показанный коммит является слиянием, помните его родителей.Исключите первого родителя (и его собственных родителей, если это необходимо), пока потомки второго родителя не вернутся к этому первому родителю.Добавьте --topo-order, если хотите, чтобы помочь ограничить порядок выбрасываемых родителей.Возьмите вывод вашего собственного алгоритма, который выбирает коммиты для показа, и передайте его git log --no-walk --stdin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...