C'è un modo per vedere quali file sono stati modificati in un ramo?
C'è un modo per vedere quali file sono stati modificati in un ramo?
Risposte:
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.
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.).
<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-base
previsto due argomenti: non esiste un collegamento, almeno nella versione corrente.
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}'
)
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.
<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.
notMainDev
sarebbero tenuti al passo con i commit mainDev ... Io di solito trovo utile per vedere queste differenze come bene però.
<sha-of-branch-point>
congit rev-parse <branch-name>
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
git diff --name-only master..
se vuoi solo i nomi dei file che sono diversi tra i due rami.
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.
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.
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)
git diff master... --name-only
quando 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?
git diff master.. --name-only
(nota che ci sono solo 2 punti invece di 3). Per capire cosa significano i punti, vedi questa risposta
git whatchanged
sembra essere una buona alternativa.
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.
git diff --name-only master...branch-name
a cui vogliamo confrontare.
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 ~/.gitconfig
file 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 .
git show --stat origin/branch_name
Questo ti darà un elenco dei file che sono stati aggiunti o modificati in questo ramo.
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-status
invece di --name-only
vedere lo stato dei file ( A
/ M
/ D
e così via)
rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
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>)
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)"