Ottieni tutti i file che sono stati modificati nel ramo git


209

C'è un modo per vedere quali file sono stati modificati in un ramo?



2
Non sono i miei dipendenti, sono i miei colleghi e non sono loro in particolare tanto quanto le persone in generale. Ma sì, rileggere questo post sembra un po 'agro. :)
Raif,

3
Puoi usare github o bitbucket, gitlab? Esistono strumenti per gestire esattamente questa situazione. Lo sviluppatore invia una richiesta pull. Riceverai la richiesta e avrai accesso a un'interfaccia molto buona che ti mostrerà una diff di tutte le modifiche apportate a ciascun file. Puoi anche commentare, chiedere modifiche ecc. Quando le modifiche sono valide, puoi accettare la richiesta che unirà le modifiche nel ramo richiesto (in genere sviluppo). Questo è il modo migliore per gestire questa situazione.
Scott Wright,

Risposte:


168

Un'alternativa alla risposta di @Marco Ponti, evitando la cassa:

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

Se la tua particolare shell non capisce il costrutto $ (), usa invece i segni di spunta.


1
ah! questo è molto divertente, ora che ne dici se voglio dire <notMainDev> essere il ramo attuale su cui mi trovo. che non è necessario specificarlo?
Raif,

29
git diff --name-only <some-other-branch>ti mostrerà quali file sono diversi tra il tuo ramo corrente e <some-other-branch>. Quindi è essenzialmente lo stesso comando, ma è da notare che è possibile utilizzare questo per trovare i file che sono diversi tra qualsiasi due rami, anche se non sono collegati in remoto. Se questo confronto sia utile o meno dipende dalla topologia dei tuoi rami ... Inoltre, nota <some-other-branch>che potrebbe davvero essere qualsiasi commit o qualsiasi cosa che si risolva in uno (tag, ecc.).
twalberg,

hmmm, beh, suppongo che ciò che intendo è che vorrei fare git diff - solo-name <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>) dove MY_CURRENT_CO_BRANCH sarebbe ovviamente il mio ramo attualmente verificato
Raif,

Puoi farlo anche tu. Questo troverà il punto in cui <notMainDev>e <MY_CURRENT_CO_BRANCH>più recentemente aveva un antenato comune e si confronta <notMainDev>con quell'antenato. Dovrai fornire il nome del tuo ramo attuale, tuttavia, come git merge-baseprevisto due argomenti: non esiste un collegamento, almeno nella versione corrente.
twalberg,

1
ok! Capito. Per gentile concessione del mio collega come si chiama. git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}' che otterrà il commit per il ramo tra <notMainDev> e il mio ramo corrente. Posso quindi fare git diff - solo nome <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')
Raif

147

Tutto quello che devi fare è il seguente:

git checkout <notMainDev>
git diff --name-only <mainDev>

Questo ti mostrerà solo i nomi dei file che sono diversi tra i due rami.


wow veloce e anche il punto. grazie. tra l'altro adoro git. è sempre veloce e al punto
Raif

23
Credo che mostrerà anche cose che sono cambiate da <mainDev>quando i rami sono divergenti. Potresti voler usare git diff --name-only <sha-of-branch-point>invece, o vedere la risposta alternativa che ho pubblicato che evita il checkout.
twalberg,

Sì, è vero @twalberg mostrerebbe quei cambiamenti se i rami fossero divergenti. Stavo assumendo la notMainDevsarebbero tenuti al passo con i commit mainDev ... Io di solito trovo utile per vedere queste differenze come bene però.
Marco Ponti,

non puoi semplicemente specificare --right-only per mostrare solo i file che sono stati modificati sul lato destro?
TheZenker

ottieni il <sha-of-branch-point>congit rev-parse <branch-name>
fc9.30

69

stupito che non sia stato detto finora!

git diff master...branch

Quindi vedi le modifiche solo su branch

Per verificare l'attuale ramo utilizzare

git diff master...

Grazie a jqr

Questa è una scorciatoia per

git diff $(git merge-base master branch) branch

quindi la base di unione (l'ultimo commit comune tra i rami) e la punta del ramo

Anche l'utilizzo di origin / master anziché solo master ti aiuterà nel caso in cui il tuo master locale sia datato


4
Mentre questo mostra ciò che è cambiato, mostra TUTTE le modifiche, piuttosto che un riepilogo dei file modificati ... che è ciò che mi ha portato a questa pagina in primo luogo :)
Chris Rutledge,

1
quindi aggiungi il flag --name-only a questo. o --short-stat
exussum il

2
git diff --name-only master..se vuoi solo i nomi dei file che sono diversi tra i due rami.
Adam

1
Questo non funzionerà correttamente se il tuo master si è impegnato dopo aver creato il tuo ramo laterale.
simplylizz

2
@simplylizz sì. questo è esattamente ciò che sta risolvendo
exussum l'

45

Non riesco a credere che ci siano così tanti modi per farlo. Uso ciò che è stato modificato come qualcuno precedentemente pubblicato, solo con i seguenti argomenti:

git whatchanged --name-only --pretty="" origin..HEAD

Questo elenca solo i nomi dei file e solo quelli che sono cambiati nel ramo corrente.


3
Questa sembra essere la risposta più semplice qui in quanto non richiede ulteriori informazioni. L'output sembra corretto ed è molto più facile da ricordare della risposta accettata!
RickMeasham,

1
Grazie, questo è interessante, più prolisso. Fornisce output per ogni commit, in ordine inverso. git-whatchanged - Mostra i registri con differenza ogni commit introduce git-scm.com/docs/git-whatchanged
nealmcb

Dai documenti git :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S

21

Mi è piaciuta molto la risposta di @ twalberg, ma non volevo digitare sempre il nome del ramo corrente. Quindi sto usando questo:

git diff --name-only $(git merge-base master HEAD)

1
La tua soluzione funziona per me e ottengo l'elenco dei file che mi aspetto di vedere. Sono un novizio Git e ho usato git diff master... --name-onlyquando eseguito sul ramo di destinazione e ottenere lo stesso risultato. Potresti essere così gentile da fornire un feedback su ciò che è buono o cattivo tra la tua risposta e il comando che ho fornito?
Hungerstar,

Il tuo comando funzionerà esattamente allo stesso modo, se master non ha nuovi commit da quando il tuo ramo è stato creato. Penso che il mio comando sarà equivalente a git diff master.. --name-only(nota che ci sono solo 2 punti invece di 3). Per capire cosa significano i punti, vedi questa risposta
Yep_It's_Me

Eccezionale! Grazie per la risposta rapida e approfondimento. Molto apprezzato.
Hungerstar,

12

git whatchanged sembra essere una buona alternativa.


1
Cosa era esattamente quello che stavo cercando.
Sild,

Dai documenti git :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S

9
git diff --name-only master...branch-name

a cui vogliamo confrontare.


Sembra una parziale di una risposta esistente, stackoverflow.com/a/41486181/11912
James Skemp

Questa variazione confronta HEAD del master con un ramo corrente. La risposta accettata confronta lo stato del master nel punto che hai biforcato . Entrambi possono avere la risposta che stai cercando, a seconda di ciò che vuoi sapere.
Mark Stosberg

8

E se potesse essere così semplice?

git changed

Se sei disposto ad assumere che il ramo principale sia chiamato "master" e che tu crei gli altri rami dal master, puoi aggiungere questo alias al tuo ~/.gitconfigfile per renderlo così semplice:

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

Questi presupposti funzioneranno per la maggior parte delle persone nella maggior parte delle situazioni, ma devi essere consapevole che li stai realizzando.

Inoltre, è necessario utilizzare una shell che supporti $(). È molto probabile che la tua shell supporti questo .


3
git show --stat origin/branch_name

Questo ti darà un elenco dei file che sono stati aggiunti o modificati in questo ramo.


2
Questo è sbagliato, questo mostra solo i file modificati nel commit head di quel ramo, non l'intero ramo.
davidtbernal,

2

Per qualche motivo nessuno ha menzionato git-tree. Vedi https://stackoverflow.com/a/424142/1657819

git-treeè preferito perché è un comando idraulico ; pensato per essere programmatico (e, presumibilmente, più veloce)

(supponendo che il ramo di base sia master)

git diff-tree --no-commit-id --name-only -r master..branch-name

Tuttavia, questo ti mostrerà tutti i file che erano interessati nel ramo, se vuoi vedere solo i file esplicitamente modificati , puoi usare --diff-filter:

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

Inoltre è possibile utilizzare --name-statusinvece di --name-onlyvedere lo stato dei file ( A/ M/ De così via)


Questo era proprio quello di cui avevo bisogno per sfogliare i file modificati, escludendo quelli che erano stati eliminati. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel

1

La risposta accettata - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)- è molto vicina, ma ho notato che lo stato era errato per le eliminazioni. Ho aggiunto un file in un ramo, eppure questo comando (usando--name-status ) ha dato il file che ho eliminato lo stato "A" e il file che ho aggiunto lo stato "D".

Ho dovuto usare questo comando invece:

git diff --name-only $(git merge-base <notMainDev> <mainDev>)

0

Espandendo ciò che avevano @twalberg e @iconoclast, se si utilizza cmd per qualsiasi motivo, è possibile utilizzare:

FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y

0

Il seguente file batch si basa sulla risposta di twalberg ma funzionerà in Windows:

@ECHO OFF
C:                               :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are  :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE

Quanto sopra presuppone che il ramo principale sia origine / master e che git bash sia stato incluso quando è stato installato Git (e la sua posizione si trova nell'ambiente del percorso). In realtà avevo bisogno di mostrare le differenze effettive usando uno strumento diff configurato (kdiff3), quindi ho sostituito il seguente comando bash sopra:

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"

0

Uso grep quindi ottengo solo le linee con diff --git che sono il percorso dei file:

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
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.