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:
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}')
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?
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:
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:
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.
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.
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:
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:
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”.
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:
Odpowiedzi:
Alternatywa dla odpowiedzi @Marco Ponti i unikanie kasy:
Jeśli twoja konkretna powłoka nie rozumie konstrukcji $ (), użyj zamiast niej tyknięć.
źródło
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.).<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 zgit merge-base
oczekiwaniami dwóch argumentów - nie ma skrótu, przynajmniej w obecnej wersji.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}'
)Wszystko, co musisz zrobić, to:
Spowoduje to wyświetlenie tylko nazw plików różniących się między dwiema gałęziami.
źródło
<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.notMainDev
będą uaktualniane z zatwierdzeń mainDev ... Ja zwykle znaleźć przydatne, aby zobaczyć te różnice jak dobrze chociaż.<sha-of-branch-point>
zgit rev-parse <branch-name>
zdziwiony, jak dotąd nie zostało to powiedziane!
Zobacz zmiany tylko na
branch
Aby sprawdzić bieżące użycie oddziału
Dzięki jqr
To krótka ręka dla
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
źródło
git diff --name-only master..
jeśli chcesz tylko nazwy plików, które różnią się między dwiema gałęziami.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:
To tylko wyświetla nazwy plików i tylko te, które zmieniły się w bieżącej gałęzi.
źródło
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.
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:
źródło
git diff master... --name-only
gdy 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?git diff master.. --name-only
(zauważ, że są tylko 2 kropki zamiast 3). Aby zrozumieć, co oznaczają kropki, zapoznaj się z tą odpowiedziągit whatchanged
wydaje się być dobrą alternatywą.źródło
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.
z którą chcemy porównać.
źródło
Co jeśli to może być tak proste?
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
~/.gitconfig
pliku, aby było to takie proste: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 .źródło
Spowoduje to wyświetlenie listy plików, które zostały dodane lub zmodyfikowane w ramach tej gałęzi.
źródło
Z jakiegoś powodu nikt nie wspomniał
git-tree
. Zobacz https://stackoverflow.com/a/424142/1657819git-tree
jest preferowany, ponieważ jest to polecenie hydrauliczne ; ma być programowy (i przypuszczalnie szybszy)(zakładając, że podstawowa gałąź to
master
)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
:Można również użyć
--name-status
zamiast,--name-only
aby zobaczyć status plików (A
/M
/D
i tak dalej)źródło
rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
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:
źródło
Po rozwinięciu tego, co mieli @twalberg i @iconoclast, jeśli używasz cmd z jakiegokolwiek powodu, możesz użyć:
źródło
Poniższy plik wsadowy jest oparty na odpowiedzi Twalberga, ale będzie działał w systemie Windows:
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:
źródło
Używam grep, więc otrzymuję tylko linie z diff --git, które są ścieżką do plików:
źródło