git avanti / indietro informazioni tra master e branch?


201

Ho creato un ramo per i test nel mio repository locale ( test-branch) a cui ho spinto Github.

Se vado sul mio Githubaccount e seleziono questo test-branchmostra le informazioni:

This branch is 1 commit ahead and 2 commits behind master

Le mie domande sono:

  1. Come posso visualizzare queste informazioni localmente (es .: un comando che mostra queste informazioni sul terminale, piuttosto che doverle aprire Githubper vederle)?
  2. So di poter vedere le differenze tra i rami usando:

    git diff master..test-branch
    

    o usando Meld(che preferisco):

    git difftool master..test-branch
    

    ma mi chiedevo se c'è un modo per vedere avanti e indietro gli impegni separatamente. IE: c'è un modo per dimostrare che 1 si impegna in anticipo da solo e poi quei 2 si impegna da soli?



1
Git 2.5+ (Q2 2015) introdurrà git for-each-ref --format="%(push:track)" refs/heads. Vedi la mia risposta qui sotto
VonC

1
Poiché non sono riuscito a trovare questa domanda utilizzando le parole chiave che sto per scrivere, voglio solo notare che ciò equivale a prendere il complemento relativo (o "impostare la differenza") tra gli insiemi di commit che compongono quei rami (e quindi contando gli elementi). Speriamo che questo diventi indice dei motori di ricerca.
pmos

Risposte:


309

Ecco un trucco che ho trovato per confrontare due rami e mostrare quanti commit ogni ramo è davanti all'altro (una risposta più generale sulla tua domanda 1):

Per le filiali locali : git rev-list --left-right --count master...test-branch

Per filiali remote : git rev-list --left-right --count origin/master...origin/test-branch

Questo dà un output come il seguente:

1 7

Questo output significa: "Rispetto a master , test-branchè 7 commit avanti e 1 commit indietro".

È inoltre possibile confrontare le filiali locali con filiali remote, ad esempio origin/master...masterper scoprire quanti commit la masterfiliale locale ha davanti / dietro la sua controparte remota.


1
Questa è un'ottima soluzione per me per scoprire se posso eliminare un ramo o se è ancora in anticipo sullo sviluppo.
Maverick, il

1
@ Maverick1st, sì, questo comando è particolarmente utile quando stai seguendo il flusso di lavoro gitflow (che io sono)
user1834095

2
Questo è il migliore per il mio caso d'uso di scoprire se l'attuale ramo di funzionalità è dietro master remoto ( git rev-list --left-right --count origin/master...@) - a condizione che l'utente lo faccia git fetchprima; utile per impedire richieste pull da filiali obsolete.
jakub.g

9
Per verificare il numero di commit dietro l'attuale ramo:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g

8
@ jakub.g non devi tagliare se usi --left-onlyo--right-only
jasonkarns,

39

Prima di tutto per vedere quante revisioni hai a livello locale, dovresti fare un git fetch per assicurarti di avere le ultime informazioni dal tuo telecomando.

L'output predefinito di git statusti dice quante revisioni sei avanti o indietro, ma di solito lo trovo troppo dettagliato:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

Io preferisco git status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

In realtà, alias questo, semplicemente git s , e questo è il comando principale che uso per controllare lo stato.

Per vedere il diff nelle "revisioni future" di master, posso escludere le "revisioni retrospettive" da origin/master:

git diff master..origin/master^

Per vedere la differenza tra le "revisioni retrospettive" di origin/master, posso escludere le "revisioni anticipate" da master:

git diff origin/master..master^^

Se ci sono 5 revisioni avanti o indietro, potrebbe essere più facile scrivere in questo modo:

git diff master..origin/master~5
git diff origin/master..master~5

AGGIORNARE

Per vedere le revisioni avanti / indietro, il ramo deve essere configurato per tenere traccia di un altro ramo. Per me questo è il comportamento predefinito quando clonare un repository remoto e dopo aver premuto un ramo congit push -u remotename branchname . La mia versione è la 1.8.4.3, ma funziona così da quando ricordo.

A partire dalla versione 1.8, puoi impostare il ramo di tracciamento in questo modo:

git branch --track test-branch

A partire dalla versione 1.7, la sintassi era diversa:

git branch --set-upstream test-branch

Quale versione di gitstai usando? Non riesco a riprodurre ciò che ottieni git statusné con né con git status -sb. Se provo uno dei due comandi (dopo averlo fatto git fetch) non ottengo alcuna informazione sugli commit avanti / indietro.
Gabriel,

8
Il tuo modo di vedere si impegna avanti e indietro è applicato mastere origin/mastere voglio vedere quelle differenze per mastere un altro ramo test-branch. Potresti riformattare la tua risposta per risolvere questo problema?
Gabriel,

La differenza nelle revisioni "dietro" e "avanti" funziona solo se uso 3 punti tra i nomi dei rami (non 2). E qui ^ e ^^ non sembrano importare qui Ad esempio: git diff master ... origin / master git diff origin / master ... master Comunque, "git status -sb" è stato molto utile.
Vituel,

10

Con Git 2.5+, ora hai un'altra opzione per vedere avanti / indietro per tutti i rami che sono configurati per spingere verso un ramo.

git for-each-ref --format="%(push:track)" refs/heads

Vedi di più su " Visualizzazione degli commit git non compressi "


Potresti farlo solo per il ramo corrente e il suo ramo di tracciamento remoto?
spex

@spex sì: completa refs/headscon il nome del ramo corrente ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC

3

Puoi anche usarlo awkper renderlo un po 'più bello:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

Puoi anche creare un alias che recupera sempre prima l'origine e poi confronta i rami

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"

1

Dopo aver eseguito un recupero git, è possibile eseguire lo stato git per mostrare il numero di commit che il ramo locale è in anticipo o in ritardo rispetto alla versione remota del ramo.

Questo non ti mostrerà quanti impegni ha davanti o dietro un ramo diverso. Le tue opzioni sono il diff completo, guardando github o usando una soluzione come Vimhsa collegata sopra: lo stato Git su tutti i repo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.