2012-05-17 11 views
92

Czy jest jakiś sposób sprawdzenia, jakie pliki zostały zmienione w oddziale?Pobierz wszystkie pliki, które zostały zmodyfikowane w gałęzi git

+2

możliwe duplikat [Jak mogę sprawdzić, które pliki zostały zmodyfikowane w oddziale?] (http: // stackoverflow .pl/questions/1749323/how-can-i-find-out-which-files-have-been-modified -in-a-branch) –

+2

Nie są moimi pracownikami, są moimi kolegami i to nie one w szczególności tak bardzo jak ludzie w ogóle. Ale tak, ponownie czytając ten post, wydaje się nieco agro. :) – Raif

+3

Czy możesz użyć github lub bitbucket, gitlab? Istnieją narzędzia do zarządzania tą sytuacją. Programista wysyła żądanie pobrania. Otrzymasz wniosek i będziesz miał dostęp do bardzo dobrego interfejsu, który pokaże różnicę wszystkich zmian dokonanych w każdym pliku. Możesz nawet komentować, prosić o zmiany itp. Gdy zmiany są dobre, możesz zaakceptować prośbę, która połączy zmiany w żądanej gałęzi (zwykle rozwija się). To jest najlepszy sposób postępowania z tą sytuacją. –

Odpowiedz

86

Alternatywą do odpowiedzi przez @Marco Ponti, unikając kasę:

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

Jeśli szczególności powłoka nie rozumie $() skonstruować, użyj zamiast back-kleszcze.

+0

ah! to jest dobra zabawa, a co powiesz na to, czy chcę powiedzieć, że jest to aktualna gałąź, w której się znajduję. to nie musi tego określać? – Raif

+11

'git diff - onlyname-only ' pokaże ci, jakie pliki różnią się od twojej obecnej gałęzi i ''. Zasadniczo jest to to samo polecenie, ale pamiętaj, że możesz użyć tego do znalezienia plików, które różnią się między * dowolnymi * dwoma gałęziami, nawet jeśli nie są ze sobą powiązane. To, czy porównanie będzie użyteczne, czy nie, zależy od topologii twoich oddziałów ... Pamiętaj też, że '' naprawdę może być jakimkolwiek zatwierdzeniem w ogóle lub cokolwiek, co rozwiąże się z jednym (tagi itp.). – twalberg

+0

hmmm, cóż, domyślam się, że chciałbym zrobić git diff - tylko nazwa-nazwa $ (git merge-base ) gdzie MY_CURRENT_CO_BRANCH oczywiście byłby moją bieżącą wyewidencjonowaną gałęzią – Raif

80

Wszystko co musisz zrobić to:

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

To pokaże tylko nazwy plików, które różnią się między dwoma gałęziami.

+0

Wow szybkie i zbyt punkt. Dziękuję Ci. btw kocham git. zawsze jest to szybkie i do rzeczy, które uważam, – Raif

+13

Wierzę, że pokażą także rzeczy, które zmieniły się na '', ponieważ rozgałęzienia odbiegają. Zamiast tego możesz użyć 'git diff --name-only ' lub zobaczyć alternatywną odpowiedź, którą napisałem, unikającą zapłaty. – twalberg

+0

Tak, to prawda @twalberg, pokaże te zmiany, jeśli gałęzie są rozbieżne. Zakładałem, że 'notMainDev' będzie na bieżąco z zatwierdzeniami mainDev ... Zazwyczaj jednak uważam, że warto zauważyć te różnice. –

5
git show --stat origin/branch_name 

Zostanie wyświetlona lista plików, które zostały dodane lub zmienione w ramach tej gałęzi.

+1

To jest złe, pokazuje tylko pliki zmienione w głównym zatwierdzeniu tego oddziału, a nie w całym oddziale. – notJim

8

Co, jeśli to może być tak proste, jak to?

git changed 

Jeśli jesteś gotów założyć, że główny oddział jest nazywany „master” i że tworzyć inne branże z panem, a następnie można dodać alias do pliku ~/.gitconfig zrobić to takie proste:

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

Te założenia będą działały dla większości ludzi w większości sytuacji, ale musisz mieć świadomość, że je robisz.

Należy również użyć powłoki obsługującej $(). It's very likely that your shell supports this.

0

Rozszerzanie się co @twalberg i @iconoclast miał, jeśli używasz cmd z jakiegokolwiek powodu, można użyć:

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 
8

git whatchanged wydaje się być dobrą alternatywą.

+1

Czego dokładnie szukałem. – Sild

20

Nie mogę uwierzyć, że jest tak wiele sposobów na zrobienie tego. Używam whatchanged jak ktoś pisał wcześniej, tylko z następującymi argumentami:

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

To właśnie wymieniono nazwy plików, a tylko te, które zmieniły na bieżącej gałęzi.

+1

To wydaje się być najłatwiejszą odpowiedzią, ponieważ nie wymaga dodatkowych informacji. Wynik jest poprawny i łatwiejszy do zapamiętania niż zaakceptowana odpowiedź! – RickMeasham

+0

Dzięki, to jest interesujące, bardziej rozwlekłe. Zapewnia dane wyjściowe dla każdego zatwierdzenia, w odwrotnej kolejności. _git-whatchanged - Pokaż dzienniki z różnicą każde zatwierdzenie wprowadza https://git-scm.com/docs/git-whatchanged – nealmcb

0

następujący plik wsadowy jest oparta na odpowiedź twalberg, ale będzie działać w systemie 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 

Powyższe zakłada, że ​​główną gałąź jest pochodzenie/master i git bash został włączony po zainstalowaniu Git (i jego lokalizacja znajduje się w środowisku ścieżki). I rzeczywiście potrzebne, aby pokazać rzeczywiste różnice przy użyciu narzędzia skonfigurowany diff (KDiff3) tak podstawiony następujące polecenie bash powyżej:

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

bardzo lubiłem użytkownika @ twalberg odpowiedź, ale nie chcą mieć do wpisz bieżące oddział przez cały czas. Więc używam tego:

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

Zdziwiłem się, że to nie zostało powiedziane do tej pory!

git diff master...branch 

więc zobaczyć zmiany tylko na branch

Aby sprawdzić obecne wykorzystanie oddział

git diff master... 

Dzięki jqr

Jest to krótki ręka dla

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

więc podstawa seryjnej (najnowsza wspólna popełnić pomiędzy oddziały) i końcówka oddział

również za pomocą pochodzenia/master zamiast tylko mistrz pomoże w przypadku lokalnego master dnia

+4

Implicit head dla prostszego polecenia: 'git diff master ...' – jqr

+0

Dodano do odpowiedzi dzięki – exussum

+0

This jest najbardziej poprawną odpowiedzią imho. +1 – helvete

0

używam grep więc mogę tylko wiersze z diff --git które ścieżka plików:

git diff branchA branchB | grep 'diff --git' 
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :) 
diff --git a/package-lock.json b/package-lock.json 
Powiązane problemy