Pobierz wszystkie pliki, które zostały zmodyfikowane w gałęzi git


209

Czy istnieje sposób, aby zobaczyć, jakie pliki zmieniły się w oddziale?



2
Nie są moimi pracownikami, są moimi kolegami i to nie oni, w szczególności ludzie w ogóle. Ale tak, ponowne przeczytanie tego postu wydaje się nieco agro. :)
Raif

3
Czy możesz użyć github lub bitbucket, gitlab? Istnieją narzędzia do zarządzania dokładnie tą sytuacją. Deweloper wysyła żądanie ściągnięcia. Otrzymasz żądanie i będziesz miał dostęp do bardzo dobrego interfejsu, który pokaże ci różnicę wszystkich zmian dokonanych w każdym pliku. Możesz nawet komentować, prosić o zmiany itp. Gdy zmiany są dobre, możesz zaakceptować żądanie, które połączy zmiany z żądanym oddziałem (zwykle rozwija się). To najlepszy sposób na poradzenie sobie z tą sytuacją.
Scott Wright

Odpowiedzi:


167

Alternatywa dla odpowiedzi @Marco Ponti i unikanie kasy:

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

Jeśli twoja konkretna powłoka nie rozumie konstrukcji $ (), użyj zamiast niej tyknięć.


1
ah! to dobra zabawa, co powiesz na to, że chcę powiedzieć <notMainDev> jako bieżący oddział, na którym jestem. to nie musi tego określać?
Raif

29
git diff --name-only <some-other-branch>pokaże Ci, jakie pliki różnią się między Twoim bieżącym oddziałem a <some-other-branch>. Jest to zasadniczo to samo polecenie, ale należy pamiętać, że można go użyć do znalezienia plików różniących się między dowolnymi dwiema gałęziami, nawet jeśli nie są one zdalnie powiązane. To, czy to porównanie jest przydatne, czy nie, zależy od topologii twoich gałęzi ... Ponadto, pamiętaj, że <some-other-branch>tak naprawdę może to być w ogóle dowolne zatwierdzenie lub cokolwiek, co rozwiązuje jeden (tagi itp.).
twalberg

hmmm, cóż, myślę, że mam na myśli, że chciałbym zrobić git diff - tylko-nazwa <<MainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>) gdzie MY_CURRENT_CO_BRANCH byłby oczywiście moją aktualną gałęzią
Raif,

Ty też możesz to zrobić. Że znajdzie się punkt, w którym <notMainDev>i <MY_CURRENT_CO_BRANCH>ostatnio miały wspólnego przodka, i porównać <notMainDev>do tego przodka. Będziesz jednak musiał podać swoją obecną nazwę oddziału, zgodnie z git merge-baseoczekiwaniami dwóch argumentów - nie ma skrótu, przynajmniej w obecnej wersji.
Twalberg

1
dobrze! Mam to. Dzięki uprzejmości mojego kolegi, jak on się nazywa. git merge-base <notMainDev>, git branch | grep '\*' | awk '{print $2}' który pobierze zatwierdzenie dla gałęzi między <notMainDev> i moją bieżącą gałęzią. Mogę wtedy zrobić git diff - only -name <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')
Raif,

147

Wszystko, co musisz zrobić, to:

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

Spowoduje to wyświetlenie tylko nazw plików różniących się między dwiema gałęziami.


wow szybki i zbyt celny. Dziękuję Ci. btw Uwielbiam gita. jest zawsze szybki i na temat
Raif

23
Wierzę, że pokaże to także rzeczy, które zmieniły się <mainDev>od czasu rozejścia się gałęzi. Możesz użyć git diff --name-only <sha-of-branch-point>zamiast tego lub zobaczyć alternatywną odpowiedź, którą opublikowałem, która pozwala uniknąć kasy.
twalberg

Tak, to prawda @twalberg pokazałby te zmiany, gdyby gałęzie były rozbieżne. Byłem przy założeniu, że notMainDevbędą uaktualniane z zatwierdzeń mainDev ... Ja zwykle znaleźć przydatne, aby zobaczyć te różnice jak dobrze chociaż.
Marco Ponti

nie możesz po prostu określić - tylko, aby wyświetlać tylko pliki, które zostały zmienione po prawej stronie?
TheZenker

dostajesz <sha-of-branch-point>zgit rev-parse <branch-name>
fc9.30

69

zdziwiony, jak dotąd nie zostało to powiedziane!

git diff master...branch

Zobacz zmiany tylko na branch

Aby sprawdzić bieżące użycie oddziału

git diff master...

Dzięki jqr

To krótka ręka dla

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

więc baza scalania (najnowszy wspólny zatwierdzenie między gałęziami) i końcówka gałęzi

Również użycie origin / master zamiast tylko master pomoże na wypadek, gdyby twój lokalny master był datowany


4
Chociaż pokazuje to, co się zmieniło, pokazuje WSZYSTKIE zmiany, a nie podsumowanie zmienionych plików ... co właśnie doprowadziło mnie do tej strony :)
Chris Rutledge

1
następnie dodaj do tego flagę --name-only-only. lub --short-stat
exussum

2
git diff --name-only master..jeśli chcesz tylko nazwy plików, które różnią się między dwiema gałęziami.
Adam

1
To nie zadziała poprawnie, jeśli twój master zatwierdził po utworzeniu gałęzi bocznej.
justlizz

2
@simplylizz tak to robi. właśnie to rozwiązuje
exussum

45

Nie mogę uwierzyć, że jest tak wiele sposobów, aby to zrobić. Używam Whatchanged jak ktoś wcześniej opublikowany, tylko z następującymi argumentami:

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

To tylko wyświetla nazwy plików i tylko te, które zmieniły się w bieżącej gałęzi.


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

1
Dzięki, to jest interesujące, bardziej niewygodne. Dostarcza dane wyjściowe dla każdego zatwierdzenia, w odwrotnej kolejności. git-whatchanged - Pokaż logi z różną różnicą przy każdym zatwierdzeniu wprowadza git-scm.com/docs/git-whatchanged
nealmcb

Z git docs :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

Bardzo podobała mi się odpowiedź @ twalberg, ale nie chciałem cały czas wpisywać bieżącej nazwy oddziału. Więc używam tego:

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

1
Twoje rozwiązanie działa dla mnie i otrzymuję listę plików, które oczekuję. Jestem początkującym Gitem i korzystałem z niego, git diff master... --name-onlygdy działałem na gałęzi docelowej i otrzymałem ten sam wynik. Czy możesz być tak uprzejmy, aby przekazywać informacje zwrotne między tym, co dobre a złe, między odpowiedzią a poleceniem, które podałem?
hungerstar

Twoje polecenie będzie działać dokładnie tak samo, jeśli master nie ma żadnych nowych zatwierdzeń od czasu utworzenia twojego oddziału. Myślę, że moje polecenie będzie równoważne git diff master.. --name-only(zauważ, że są tylko 2 kropki zamiast 3). Aby zrozumieć, co oznaczają kropki, zapoznaj się z tą odpowiedzią
Yep_It's_Me

Niesamowite! Dzięki za szybką odpowiedź i wgląd. Bardzo mile widziane.
hungerstar

12

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


1
Czego dokładnie szukałem.
Sild

Z git docs :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

z którą chcemy porównać.


Wygląda jak częściowa odpowiedź, stackoverflow.com/a/41486181/11912
James Skemp

Ta odmiana porównuje HEAD mastera z bieżącą gałęzią. Zaakceptowana odpowiedź porównuje stan mistrza w rozwidlonym punkcie . Każda może mieć odpowiedź, której szukasz, w zależności od tego, co chcesz wiedzieć.
Mark Stosberg,

8

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

git changed

Jeśli chcesz założyć, że główna gałąź nazywa się „master” i że tworzysz inne gałęzie z poziomu master, możesz dodać ten alias do swojego ~/.gitconfigpliku, aby było 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 sprawdzą się u większości ludzi w większości sytuacji, ale musisz zdawać sobie sprawę, że je realizujesz.

Musisz także użyć powłoki, która obsługuje $(). Jest bardzo prawdopodobne, że twoja powłoka obsługuje to .


3
git show --stat origin/branch_name

Spowoduje to wyświetlenie listy plików, które zostały dodane lub zmodyfikowane w ramach tej gałęzi.


2
To źle, pokazuje tylko pliki zmienione w głównym zatwierdzeniu tej gałęzi, a nie całej gałęzi.
davidtbernal

2

Z jakiegoś powodu nikt nie wspomniał git-tree. Zobacz https://stackoverflow.com/a/424142/1657819

git-treejest preferowany, ponieważ jest to polecenie hydrauliczne ; ma być programowy (i przypuszczalnie szybszy)

(zakładając, że podstawowa gałąź to master)

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

Jednak pokaże to wszystkie pliki, które zostały naruszone w oddziale, jeśli chcesz zobaczyć tylko pliki wyraźnie zmodyfikowane , możesz użyć --diff-filter:

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

Można również użyć --name-statuszamiast, --name-onlyaby zobaczyć status plików ( A/ M/ Di tak dalej)


Właśnie tego potrzebowałem do usuwania zmian w plikach, z wyłączeniem tych, które zostały usunięte. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel

1

Przyjęta odpowiedź - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)- jest bardzo bliska, ale zauważyłem, że ma nieprawidłowy status przy usuwaniu. Dodałem plik do gałęzi, a jednak to polecenie (za pomocą --name-status) nadało plikowi, że usunąłem status „A”, a plik dodał status „D”.

Zamiast tego musiałem użyć tego polecenia:

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

0

Po rozwinięciu tego, co mieli @twalberg i @iconoclast, jeśli używasz cmd z jakiegokolwiek powodu, możesz 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

0

Poniższy plik wsadowy jest oparty na odpowiedzi Twalberga, 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łęzią jest origin / master i że git bash został dołączony, gdy Git został zainstalowany (a jego lokalizacja znajduje się w środowisku ścieżki). Rzeczywiście potrzebowałem pokazać rzeczywiste różnice za pomocą skonfigurowanego narzędzia różnicowego (kdiff3), więc podstawiłem następujące polecenie bash powyżej:

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

0

Używam grep, więc otrzymuję tylko linie z diff --git, które są ścieżką do 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.