Usando Git, mostra tutti i commit che si trovano in un ramo, ma non gli altri (s)

Ho un vecchio ramo, che vorrei eliminare. Tuttavia, prima di farlo, voglio verificare che tutti i commit effettuati su questo ramo siano stati unificati in qualche altro ramo. Quindi, mi piacerebbe vedere tutti i commit fatti al mio attuale ramo che non sono stati applicati a nessun altro ramo [o, se questo non è ansible senza alcuni script, come si vedono tutti i commit in un ramo che non sono stati applicati a un altro ramo?].

Probabilmente vuoi solo

git branch --contains branch-to-delete 

Questo elencherà tutti i rami che contengono i commit da “branch-to-delete”. Se riporta più di un semplice “branch-to-delete”, il ramo è stato unito.

Le tue alternative sono in realtà solo syntax rev-list. es. git log one-branch..another-branch mostra tutto ciò di cui one-branch bisogno per avere tutto ciò che ha another-branch .

Potresti anche essere interessato a git show-branch come modo per vedere dove si trova.

Per vedere un elenco di quali commit si trovano su un ramo ma non su un altro, usa git log:

 git log oldbranch ^newbranch --no-merges 

… cioè mostra i registri di commit per tutti i commit su oldbranch che non sono su newbranch. Puoi elencare più rami da includere ed escludere, ad es

 git log oldbranch1 oldbranch2 ^newbranch1 ^newbranch2 --no-merges 

Nota: su Windows ^ è una chiave di escape, quindi è necessario eseguire l’escape con un altro ^ :

 git log oldbranch ^^newbranch --no-merges 

Per mostrare i commit in oldbranch ma non in newbranch:

 git log newbranch..oldbranch 

Per mostrare il diff da questi commit (nota che ci sono tre punti):

 git diff newbranch...oldbranch 

Ecco il documento con un diagramma https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

Mentre alcune delle risposte pubblicate qui aiuteranno a trovare ciò che cerchi, il seguente sottocomando di git branch è una soluzione più adatta per il tuo compito.

–merged è usato per trovare tutti i rami che possono essere tranquillamente cancellati, poiché questi rami sono completamente contenuti da HEAD.

Mentre nel master uno poteva eseguire il comando per enumerare i rami che si potevano rimuovere in sicurezza, in questo modo:

 git branch --merged develop fpg_download_links * master master_merge_static # Delete local and remote tracking branches you don't want git branch -d fpg_download_links git push origin :fpg_download_links git branch -d master_merge_static git push origin :master_merge_static # There is also a flag to specify remote branches in the output git branch --remotes --merged 

Per coloro che sono ancora alla ricerca di una risposta semplice, dai un’occhiata a git cherry . Confronta le diff attuali invece degli hash di commit. Ciò significa che accoglie i commit che sono stati selezionati o ribattuti.

Prima controlla il ramo che vuoi eliminare:

git checkout [branch-to-delete]

quindi usa git cherry per confrontarlo con il tuo ramo di sviluppo principale:

git cherry -v master

Esempio di output:

 + 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message + b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message - 85867e38712de930864c5edb7856342e1358b2a0 Yet another message 

Nota: il flag -v include il messaggio di commit insieme all’hash SHA.

Le righe con “+” in primo piano si trovano nel ramo da eliminare, ma non nel ramo principale. Quelli con un “-” davanti hanno un commit equivalente nel master.

Per SOLO i commit che non sono in master, combinare cherry pick con grep:

git cherry -v master | grep "^\+"

Esempio di output:

 + 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message + b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message 

La risposta di jimmyorr non funziona su Windows. aiuta a usare – --not posto di ^ modo:

 git log oldbranch --not newbranch --no-merges 

Se si tratta di un ramo (singolo) che è necessario verificare, ad esempio se si desidera che il ramo “B” sia completamente integrato nel ramo “A”, è sufficiente effettuare quanto segue:

 $ git checkout A $ git branch -d B 

git branch -d ha la sicurezza che “Il ramo deve essere completamente unito in HEAD.”

Nota che questo effettivamente elimina il ramo se è unito,

Puoi usare questo semplice script per vedere i commit che non sono uniti

 #!/bin/bash # Show commits that exists only on branch and not in current # Usage: # git branch-notmerge  # # Setup git alias # git config alias.branch-notmerge [path/to/this/script] grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s') 

Puoi anche usare lo strumento git-wtf che mostrerà lo stato delle filiali

Per elencare i commit mancanti tra due rami puoi usare compare-branches.py

https://bitbucket.org/aakef/compare-git-branches

Crea una richiesta di pull tramite il servizio di hosting git che stai utilizzando. Se il ramo è stato completamente unito al ramo base, non sarai in grado di creare il nuovo PR.

Ad esempio, su GitHub:

Non c’è nulla da confrontare

Impossibile creare un PR per i rami che sono stati uniti.

Questo non usa git sulla riga di comando, ma spesso trovo utile usare gli altri strumenti a tua disposizione con un chiaro modello mentale piuttosto che tentare di ricordare un altro comando arcano di git.