2013-09-08 3 views
33

So che ci sono state domande molto simili qui, ma non hanno risolto il mio problema. Forse c'è qualcosa che non sto capendo bene.La lista si impegna tra 2 commit hash in git

Questa è una parte della storia di commit fitnesse (https://github.com/unclebob/fitnesse/):

* | | | | | | | | | | | | | | | fa86be8 Avoid possible issue when using CachingPage under heavy memory load. 
|/////////////// 
* | | | | | | | | | | | | | | 7b4a07a Merge pull request #256 from barredijkstra/fitnesse_issue_250 
|\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 
| * | | | | | | | | | | | | | | ecf5891 Fixed test checking for OS specific exception message. 
| * | | | | | | | | | | | | | | 082236e Added rendering of cause exceptions. Fix for unclebob/fitnesse#250 
* | | | | | | | | | | | | | | | a92b37f Merge pull request #243 from amolenaar/fix/243-hash-table-rendering 

voglio l'elenco dei commit tra 2 commettere hash. In questo caso particolare, voglio che i commit tra ecf5891 e 7b4a07a, e mi aspetto che il risultato sia:

ecf5891 
7b4a07a 

Si lontano ho usato e ha funzionato bene con la storia lineare. Tuttavia, in questo caso ricevo molti più commit.

Ho provato questo e funziona proprio come previsto:

git log --since='<date ecf5891>' --until='<date 7b4a07a>' 

(Ho cercato manualmente per quelle 2 date).

Una possibile soluzione è ottenere le 2 date e farlo, ma penso che ci dovrebbe essere un modo migliore.

Modifica: 7b4a07a genitori sono ecf5891 e a92b37f. Finora, le soluzioni funzionano bene se voglio andare ecf5891-7b4a07a, ma se voglio andare a92b37f-7b4a07a voglio arrivare:

7b4a07a 
ecf5891 
082236e 
a92b37f 

ma non ottengono a92b37f

risposta

3

Aggiungi^7b4a07a ~ per escludere anche tutto raggiungibile dal primo genitore della fusione. Stai escludendo solo ciò che è raggiungibile dal suo secondo genitore.

+0

Typo di sorta, è necessario il '^' in primo piano (o '--not') – torek

+0

Dove dovrei aggiungere quella parte? Come sarebbe la linea completa? – Nico

+0

aggiungilo al resto della tua specifica, solo un altro argomento. @torek: :-P. Grazie. – jthill

20

"Between" è un'idea un po 'sdrucciolevole, quando si parla di git commit.

Il testo si mostra sopra, con un frammento di uscita grafico, mostra perché from^..to produce più di solo quei due commit: la parte to è un merge commit.

La notazione A..B è in realtà solo una scorciatoia per B ^A. Cioè, "tutto a partire da B e funzionante all'indietro, meno tutto a partire da A e lavorando all'indietro". Ma B è un commit unione, quindi "tutto ciò che inizia lì e funziona all'indietro" utilizza entrambi i genitori.

Qui il primo genitore di 7b4a07a è a92b37f (non nel proprio snippet [originale] sopra ma ho clonato il repository collegato e l'ho trovato). Possiamo comunque riferirci simbolicamente, e lo farò di seguito. Il secondo genitore di 7b4a07a è ecf5891, la parte "da" a cui sei interessato.

Quando si chiede:

ecf5891^..7b4a07a 

che significa:

7b4a07a ^ecf5891^ 

, che è la stessa:

7b4a07a ^082236e 

cui si ottiene entrambi i genitori della fusione, e quindi ripara tutto da 082236e indietro. È necessario tagliare tutto da 7b4a07a^ -il primo genitore-e posteriore così:

git rev-list 7b4a07a ^ecf5891^ ^7b4a07a^ 
git log --oneline 7b4a07a ^ecf5891^ ^7b4a07a^ 

In generale, però, è necessario capire quale linea discendente (s) per tagliare-off.

Modifica: è possibile attenersi alla notazione A..B, ma è necessario aggiungere l'ulteriore "esclusione". Quindi funziona anche jthill's answer, una volta spostato il cappello in primo piano.


Re tua modifica ("se voglio andare a92b37f-7b4a07a"): siamo indietro a quel numero di 'tra' essere un concetto scivoloso. Quali commit sono "tra"? C'è una linea diretta da a92b37f a 7b4a07a, perché a92b37f è uno dei due genitori del commit unione 7b4a07a. Quindi dalla logica precedente ("commette direttamente su una linea ancestrale", forse "inclusiva") che sarebbe solo uno, o forse entrambi, di quei due commit. Ma tu dici di volere due commit che non sono affatto, in senso ancestrale, relativi a a92b37f. Perché vuoi quei due commit particolari? Cosa rende "interessante" 082236e e 082236e^, suo genitore, "poco interessante"?

+0

Ok, ho capito quando hai detto "al ritorno, ma questo vale per i 2 genitori". Quindi, fai quello che ho fatto prima e taglia la parte extra-genitrice, facendo '^ 7b4a07a ^' che è '^ a92b37f'. Come fai a sapere che '7b4a07a ^' sarà "l'altro" genitore e non 'ecf5891'? Lo sto facendo in uno script, quindi non posso cercare manualmente. – Nico

+0

"Sì, c'è lo sfregamento" -Hamlet. Non c'è modo * a priori * di sapere quale genitore (i) di una fusione si separa, solo dai commit stessi. Dovrai fornire (forse molto) più background. – torek

+0

In questo momento voglio i commit in ordine cronologico, la nozione di "tra" sarebbe: cerca commit A e B nel grafico cronologico, tutti i commit tra loro compresi A e B. Forse non ha molto senso e Sto pensando anche a me. Finora, la soluzione è stata la più semplice e brutta: ottenere tutti gli hash di commit, cercare A e aggiungere alla lista finché non trovo B. Grazie comunque, hai eliminato alcune cose e mi hai fatto pensare se il modo cronologico è quello Sto cercando. – Nico

1

innanzitutto identificare il relativo 2 commit hash che è necessario per ottenere l'elenco dei commit hash tra di loro utilizzando

git log --oneline 

Poi si può scegliere il relativo due commit hash e trovare il commettere hash tra di loro utilizzando

git log <commit hash 1> <commit hash 2> --oneline | cut -d " " -f 1 
+0

Hai testato questa risposta? Il suo [non produce risultati attesi] (http://stackoverflow.com/q/41688733) per me. – jww

+1

Avevo bisogno di fare quanto segue: 'git log --oneline hashone..hashtwo' –

Problemi correlati