Как я могу получить / просмотреть / увидеть всех потомков коммита с помощью git (или gitk)? - PullRequest
9 голосов
/ 11 декабря 2011

Если вы используете gitk --all, вы можете увидеть все коммиты вашего репо из всех веток. Я хочу что-то подобное, кроме только потомков данного коммита.

Ответы [ 3 ]

12 голосов
/ 17 февраля 2012

Я думаю, что это может сделать то, что вы хотите.Все коммиты во всех ветвях, которые имеют A в качестве предка:

gitk --all --ancestry-path A..
4 голосов
/ 08 мая 2014

Короче говоря:

git log --all BRANCH~1..

Подробно, с примерами: Это полное дерево репозитория, который я только что создал:

$ git log --graph --oneline --decorate --all
* e3972be (HEAD, a) a-6
* 2707d79 a-5
* cdea9a7 a-4
| * 65b716e (c) c-5
| * ebe2a0e c-4
|/  
| * 2ed9abe (b) b-4
|/  
* ace558e (master) 3
* 20db61f 2
* 3923af1 1

Помимо --all очевидна и другая вещь: master -> HEAD:

$ git log --graph --oneline --decorate master..
* e3972be (HEAD, a) a-6
* 2707d79 a-5
* cdea9a7 a-4

Итак, я попытался объединить их, и это почти дало мне то, что мы хотели:

$ git log --graph --oneline --decorate --all master..
* e3972be (HEAD, a) a-6
* 2707d79 a-5
* cdea9a7 a-4
* 65b716e (c) c-5
* ebe2a0e c-4
* 2ed9abe (b) b-4

Но, к сожалению, это не показывает отношения между ветвями, так как ветка, о которой мы спрашиваем, была опущена. Поэтому мы должны использовать log от родителя master примерно так:

$ git log --graph --oneline --decorate --all master~1..
* e3972be (HEAD, a) a-6
* 2707d79 a-5
* cdea9a7 a-4
| * 65b716e (c) c-5
| * ebe2a0e c-4
|/  
| * 2ed9abe (b) b-4
|/  
* ace558e (master) 3

Та-да! (Я не знаю, если это просто не работало в прошлом, но на всякий случай: я на git версии 1.7.1)

РЕДАКТИРОВАТЬ 2017-11-17 - Спасибо STW за то, что он фактически показал проблему с этим: Независимые деревья могут испортить это. Коммиты, которые полностью независимы от master, будут включены в этот вывод. Начиная с копии вышеупомянутого репозитория, моя последняя команда выведет:

$ git checkout --orphan z
Switched to a new branch 'z'
$ git commit --allow-empty -m'z-1'
[z (root-commit) bc0c0bb] z-1
$ git commit --allow-empty -m'z-2'
[z 1183713] z-2

$ git log --graph --oneline --decorate --all master~1..
* 1183713 (HEAD -> z) z-2
* bc0c0bb z-1
* 6069f73 (a) a-6
* 654d106 a-5
* a218c59 a-4
| * 338432a (c) c-5
| * 2115318 c-4
|/  
| * 43a34dc (b) b-4
|/  
* ce05471 (master) 3

Ветвь z, созданная как сирота, не имеет общей истории с master, поэтому z-1 и z-2 должны были быть исключены, но не были. Вот для чего --ancestry-path, теперь я понимаю. В том числе это исключит ветку z:

$ git log --graph --oneline --decorate --all --ancestry-path master~1..
* 6069f73 (a) a-6
* 654d106 a-5
* a218c59 a-4
| * 338432a (c) c-5
| * 2115318 c-4
|/  
| * 43a34dc (b) b-4
|/  
* ce05471 (master) 3

Для полноты, даже учитывая, что у него уже было --ancestry-path, текущий верхний ответ не показывает правильное отношение ветвления, потому что он исключает фиксацию на master:

$ git log --graph --oneline --decorate --all --ancestry-path master..
* 6069f73 (a) a-6
* 654d106 a-5
* a218c59 a-4
* 338432a (c) c-5
* 2115318 c-4
* 43a34dc (b) b-4
2 голосов
/ 11 декабря 2011

Коммит знает только о своем родителе (и, следовательно, полностью), но не имеет понятия о своих потомках / потомках.Вы должны использовать нотацию типа A..B, чтобы найти ее.

Например, если вы хотите найти коммиты в текущей ветви начиная с данного коммита A, вы можете сделать что-то вроде этого:

git rev-list A..
...