Utilizzando Git, mostra tutti i commit in un ramo, ma non l'altro(s)
-
19-09-2019 - |
Domanda
Ho un vecchio ramo, che vorrei eliminare.Tuttavia, prima di farlo, voglio controllare che tutti i cambiamenti fatti a questo ramo sono stati a un certo punto si è fusa in un altro ramo.Così, mi piacerebbe vedere tutti i cambiamenti fatti al mio attuale ramo che non sono stati applicati a qualsiasi altro ramo [o, se questo non è possibile senza un po ' di scripting, come si fa a vedere tutti i commit in un ramo che non sono stati applicati ad un altro ramo?].
Soluzione
Probabilmente si vuole solo
git branch --contains branch-to-delete
Questo elencherà tutti i settori che contengono i commit da "branch-to-delete". Se si riferisce più di un semplice "branch-to-delete", la filiale è stata fusa.
Le alternative sono in realtà solo rev-list cose sintassi. per esempio. git log one-branch..another-branch
mostra tutto ciò che one-branch
ha bisogno di avere tutto another-branch
ha.
Si può anche essere interessati a git show-branch
come un modo per vedere cosa c'è dove.
Altri suggerimenti
Per visualizzare un elenco dei quali commit sono su un ramo, ma non un altro, utilizzare git log:
git log --no-merges oldbranch ^newbranch
... cioè, spettacolo commettere registri per tutti i commit su oldbranch che sono non sul newbranch. È possibile elencare più rami per includere ed escludere, per esempio.
git log --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2
Nota: su Windows ^
è una chiave di fuga, quindi ha bisogno di essere sfuggito con un altro ^
:
git log --no-merges oldbranch ^^newbranch
Per mostrare i commit in oldbranch ma non in newbranch:
git log newbranch..oldbranch
Per mostrare il diff da questi commit (notare ci sono tre punti):
git diff newbranch...oldbranch
Ecco il documento con un diagramma illustrazione https: // git -scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges
Per chi ancora alla ricerca di una risposta semplice, controlla git ciliegia . Esso mette a confronto diff effettivi, invece di commettere hash. Ciò significa che può ospitare commit che sono stati raccolti o ciliegio Ribasato.
Per prima checkout il ramo che si desidera eliminare:
git checkout [branch-to-delete]
quindi utilizzare git ciliegio per confrontarlo con il vostro ramo di sviluppo principale:
git cherry -v master
uscita Esempio:
+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message
. Nota: La bandiera -v
è quello di includere il messaggio di commit insieme con l'hash SHA
Le linee con il '+' davanti sono nel ramo-to-delete, ma non il branch master. Quelli con un '-' davanti ha un equivalente commettere in master
.solo per i commit che non sono in master, unire ciliegio raccogliere con grep:
git cherry -v master | grep "^\+"
uscita Esempio:
+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
Mentre alcune delle risposte postato qui aiuterà a trovare ciò che cercate, i seguenti sotto-comando del git branch è una soluzione più adatta per il vostro compito.
Mentre in master
si può eseguire il comando per enumerare i rami si può rimuovere in modo sicuro, 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
di jimmyorr risposta non funziona su Windows. aiuta a utilizzare --not
invece di ^
in questo modo:
git log oldbranch --not newbranch --no-merges
Se è una (sola) ramo che è necessario controllare, ad esempio, se si desidera che il ramo 'B' è completamente fusa in ramo 'A', si può semplicemente effettuare le seguenti operazioni:
$ git checkout A
$ git branch -d B
git branch -d <branchname>
ha la sicurezza che "Il ramo deve essere completamente fusa in testa".
Attenzione : questo in realtà cancella il ramo B se viene fusa per incorporazione in A
.È possibile utilizzare questo semplice script per vedere impegna che non sono uniti
#!/bin/bash
# Show commits that exists only on branch and not in current
# Usage:
# git branch-notmerge <branchname>
#
# 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')
È possibile utilizzare anche lo strumento git-wtf che mostrerà lo stato di rami
Iniziare a Creare una Richiesta di Pull tramite il servizio di hosting git che si sta utilizzando.Se il ramo è stato completamente integrato nella base del ramo, sarete in grado di creare il nuovo PR.
Non c'è bisogno di fare effettivamente la richiesta di pull, utilizzare solo il primo passo in cui si sceglie di rami.
Per esempio, su GitHub:
Non c'è nulla a confronto
Questo non fa uso di git sulla linea di comando, ma spesso mi è utile per utilizzare gli altri strumenti a vostra disposizione con un chiaro modello mentale, piuttosto che cercare di ricordare un altro arcano comando git.