2011-12-11 19 views
5

Se si utilizza gitk --all, è possibile visualizzare tutti i commit del repository, da tutti i rami. Voglio qualcosa del genere tranne i discendenti di un dato commit.Come posso ottenere/elencare/vedere tutti i discendenti di un commit con git (o gitk)?

+1

Anche se la prima frase di Manojlds è corretta, non è tutta la verità: sarebbe possibile svuotare qualcosa che controlla se ogni ref ha il commit specificato nella sua discendenza, e quindi visualizza la cronologia a partire da quei ref. – Cascabel

+1

possibile duplicato di [Ottenere un elenco di tutti i figli di un dato commit] (http://stackoverflow.com/questions/2613935/getting-a-list-of-all-children-of-a-given-commit) – jthill

risposta

2

Un commit conosce solo il suo genitore (e quindi tutto il percorso verso l'alto) ma non ha idea dei suoi figli/discendenti. Devi usare una notazione come A..B per trovarla.

Per esempio, se si desidera trovare commit nel ramo corrente dal momento che il dato qualcosa commit A, si può fare in questo modo:

git rev-list A.. 
+1

'gitk --all' deve funzionare in qualche modo. Sembra possibile codificarlo almeno per primo 'gitk --all' e quindi omettere ogni commit che non ha un dato commit come genitore. – Pistos

7

Penso che questo potrebbe fare quello che vuoi. Tutti i commit in tutti i rami, che hanno una come antenato:

gitk --all --ancestry-path A.. 
1

In breve:

git log --all BRANCH~1.. 

Nel dettaglio, con esempi: Questo è l'albero completo di un repository Ho appena creato:

$ 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 

parte --all, un'altra cosa è ovvia: master ->HEAD:

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

così ho provato la loro combinazione, e quasi me ottenuto quello che volevamo:

$ 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 

Ma, purtroppo, questo non mostra la relazione tra i rami, dal momento che il ramo stiamo chiedendo circa è stato omesso. Quindi dobbiamo utilizzare log dal genitore di master in questo modo:

$ 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 

Ta-da! (Non so se questo semplicemente non ha funzionato in passato, ma nel caso in cui: io sono su git versione 1.7.1)

EDIT 2017-11-17 - Grazie a STW per davvero mostrando il problema con questo: gli alberi indipendenti farebbero un casino. I commit completamente indipendenti da master dovrebbero essere inclusi in questa uscita. Partendo da una copia del pronti contro termine di cui sopra, questo è ciò che il mio ultimo comando sarebbe uscita:

$ 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 

Il ramo z, in fase di creazione come un orfano, non ha storia comune con master, così z-1 e z-2 avrebbero dovuto essere esclusi ma non lo erano. Questo è ciò che è --ancestry-path, ora lo ricevo.Tra cui essa esclude ramo 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 

Per completezza, anche dato che già aveva --ancestry-path, la risposta superiore corrente non mostra la relazione filiale correttamente perché esclude il commit sul master stessa:

$ 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 
+0

Ho provato a giocherellare con variazioni di questo, ma non sembra proprio mostrare quello che voglio [con gitk]. Ad esempio, supponiamo di aver creato un ramo intermedio figlio e di aver creato 3 rami nipotini. Quale sarebbe il modo di mostrare la gitk solo per quella famiglia di rami e nessuno di padrone o qualcos'altro? – Pistos

+0

@Pistos Quindi, usando quanto sopra, ottengo lo stesso output in 'gitk' come' log' quando uso 'gitk --all master..' (al contrario di' git log --all master ~ 1. »- Quindi, per usare un ramo diverso dal master, prova 'gitk --all branchname..' (includi i due punti) – Izkata

+0

@Pistos Ora noto anche che il mio commento è finito quasi come la risposta di jsvnm, tranne che non lo faccio t abbastanza comprensibile '--ancestry-path' e perché sarebbe necessario – Izkata