Jak wyświetlić podgląd git-pull bez pobierania?

204

Czy to w ogóle możliwe?

Zasadniczo istnieje zdalne repozytorium, z którego pobieram za pomocą:

git pull

Teraz chciałbym wyświetlić podgląd tego, co zmieniłoby to ściąganie (różnicę) bez dotykania czegokolwiek po mojej stronie. Powodem jest to, że coś, co wyciągam, może nie być „dobre” i chcę, aby ktoś inny to naprawił, zanim moje repozytorium stanie się „brudne”.

Milan Babuškov
źródło
4
Twoja edycja jest dziwna. Wykonanie „git fetch” nie zmienia w żaden sposób działającego drzewa, więc nie ma znaczenia, czy wprowadzono niezatwierdzone zmiany lokalne. I nie jest jasne, jaką część pobierania chcesz cofnąć, ponieważ nie dotyka twojego drzewa pracy.
dkagedal
Dzięki dkagedal, napisałem to, zanim w pełni zrozumiałem, jak działa Git. Usunąłem tę edycję.
Milan Babuškov

Odpowiedzi:

233

Po wykonaniu a git fetch, wykonaj a, git log HEAD..origin/masteraby wyświetlić wpisy dziennika między ostatnim wspólnym zatwierdzeniem a gałęzią główną źródła. Aby wyświetlić różnice, użyj albo, git log -p HEAD..origin/masteraby wyświetlić każdą łatkę, lub git diff HEAD...origin/master(trzy kropki, a nie dwie), aby pokazać pojedynczą różnicę.

Tam zazwyczaj nie ma potrzeby, aby cofnąć sprowadzić, bo robi pobrać aktualizacje tylko zdalnych oddziałów i żaden z twoich oddziałów. Jeśli nie jesteś przygotowany do wykonania operacji ściągania i scalania we wszystkich zdalnych zatwierdzeniach, możesz użyć, git cherry-pickaby zaakceptować tylko określone zdalne zatwierdzenia, które chcesz. Później, kiedy będziesz gotowy, aby uzyskać wszystko, git pullscalenie z resztą zatwierdzeń.

Aktualizacja: Nie jestem całkowicie pewien, dlaczego chcesz uniknąć korzystania z git fetch. Wszystko, co robi git fetch, to aktualizowanie lokalnej kopii zdalnych gałęzi. Ta lokalna kopia nie ma nic wspólnego z żadnym z twoich oddziałów i nie ma nic wspólnego z niezatwierdzonymi lokalnymi zmianami. Słyszałem o ludziach, którzy uruchamiają git fetch w pracy crona, ponieważ jest to tak bezpieczne. (Zwykle jednak nie zalecałbym tego.)

Greg Hewgill
źródło
Chyba tęskniłem za tą częścią „nic wspólnego z MOIM oddziałami” podczas czytania dokumentów. Dzięki.
Milan Babuškov,
1
Z jakiegoś powodu to nie działa dla mnie. Próbowałem git diff HEAD ... origin / master i nie wyświetliło jeszcze żadnych zmian, kiedy wykonuję 'pull origin master', pobiera i łączy zmiany. Czy to dlatego, że skonfigurowałem zdalne repozytorium za pomocą git remote add?
screenm0nkey 30.09.11
@ screenm0nkey: Nie wiem (nie wiedząc więcej informacji). Polecam otwarcie nowego pytania, aby o to zapytać, jeśli nadal nie jesteś pewien.
Greg Hewgill 30.09.11
1
Co dla mnie działa (po pobraniu git): git log origin / master
slaman 28.10.16
2
git diff ...@{u}jest taki sam, jak git diff HEAD...origin/mastergdyby pochodzenie / mistrz był odgałęzieniem w górę rzeki
kambuzujący
47

Myślę, że szukasz git fetch .

Spowoduje to pobranie zmian i obiektów bez przypisywania ich do indeksu lokalnego repozytorium.

Można je później połączyć za pomocą git merge .

Strona man

Edycja: dalsze wyjaśnienia

Prosto z Git- SVN Crash Course linku

Jak uzyskać nowe zmiany ze zdalnego repozytorium? Pobierasz je:

git fetch http://host.xz/path/to/repo.git/ 

W tym momencie znajdują się w twoim repozytorium i możesz je zbadać za pomocą:

git log origin 

Możesz także różnicować zmiany. Możesz także użyć git log HEAD..origin, aby zobaczyć tylko zmiany, których nie masz w swoim oddziale. Jeśli chcesz je scalić - po prostu wykonaj:

git merge origin

Zauważ, że jeśli nie określisz gałęzi do pobrania, wygodnie będzie domyślnie śledzenie zdalne.

Czytanie strony podręcznika da ci najlepsze zrozumienie opcji i sposobu korzystania z nich.

Próbuję to zrobić tylko za pomocą przykładów i pamięci. Obecnie nie mam pola do przetestowania. Powinieneś spojrzeć na:

git log -p //log with diff

Pobieranie można cofnąć za pomocą git reset --hard ( link ), jednak wszystkie niezatwierdzone zmiany w drzewie zostaną utracone, a także zmiany, które pobrałeś.

Brian Gianforcearo
źródło
Jeśli wyjaśnisz dwie rzeczy, może to być dobre: ​​1. jak mogę cofnąć pobieranie programu git-fetch? 2. Jak mogę zobaczyć różnicę?
Milan Babuškov,
1
1) cofanie pobierania git-fetch? 2) git diff HEAD..origin
Chris Vest
Różnica jest wykonywana, jak powiedział Christian, pobieranie można cofnąć za pomocą git reset - hard, jednak wszystkie niezatwierdzone zmiany w drzewie zostaną utracone, a także zmiany, które pobrałeś.
Brian Gianforcearo
Szukasz git reset --softczy --mixed? Sprawdź stronę podręcznika.
Aristotle Pagaltzis
1
Jeśli dobrze rozumiem, nie ma potrzeby cofania „pobierania git”, ponieważ nie dotyka ono kopii roboczej, a także repozytorium. „git fetch” przechowuje obiekty i odnośniki w .git / FETCH_HEAD
Thorsten Niehues
21

Możesz pobrać ze zdalnego repozytorium, zobaczyć różnice, a następnie pobrać lub scalić.

To jest przykład zdalnej repozytorium o nazwie origini gałęzi o nazwie masterśledzącej zdalną gałąź origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master
Antonio Bardazzi
źródło
8

Stworzyłem niestandardowy alias git, aby to dla mnie zrobić:

alias.changes=!git log --name-status HEAD..

dzięki temu możesz to zrobić:

$git fetch
$git changes origin

Zapewni to przyjemny i łatwy sposób na podgląd zmian przed wykonaniem merge.

Matthias
źródło
jesteś Bogiem. powinno się to znaleźć w samym git
Z. Khullah
3

Używam tych dwóch poleceń i widzę pliki do zmiany.

  1. Najpierw uruchamiając git fetch , daje wynik taki jak ten (część wyniku):

    ...
    72f8433..c8af041 rozwijaj -> pochodzenie / rozwijaj
    ...

Ta operacja daje nam dwa identyfikatory zatwierdzeń, pierwszy to stary, a drugi będzie nowy.

  1. Następnie porównaj te dwa zatwierdzenia za pomocą git diff

    git diff 72f8433..c8af041 | grep "diff --git"

To polecenie wyświetli listę plików, które zostaną zaktualizowane:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

Na przykład aplikacja / kontroler / xxxx.php i aplikacja / widok / rrrr.php zostaną zaktualizowane.

Porównanie dwóch zatwierdzeń za pomocą git diff drukuje wszystkie zaktualizowane pliki ze zmienionymi liniami, ale z grep przeszukuje i pobiera tylko linie zawierające diff --git z wyjścia.

cowboycb
źródło
3

Mogę spóźnić się na przyjęcie, ale to mnie zbyt długo męczyło. Z mojego doświadczenia wynika, że ​​wolę sprawdzić, które zmiany są w toku, niż zaktualizować kopię roboczą i zająć się tymi zmianami.

To idzie w ~/.gitconfigpliku:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

Pobiera bieżącą gałąź, a następnie robi różnicę między kopią roboczą a tą pobraną gałęzią. Więc powinieneś zobaczyć tylko zmiany, które nastąpią git pull.

Andy P.
źródło
1
Czy możesz wymienić ciąg referencyjny HEAD..@{u}? Jest to prostsze i nie wymaga, aby pilot nazywał się „origin” ani aby twoja gałąź miała taką samą nazwę jak na pilocie.
Michael - Where's Clay Shirky
To dobrze wykonany alias, ale nie jestem pewien, dlaczego chcesz to zrobić w pierwszej kolejności. Będziesz kiedyś musiał poradzić sobie ze zmianami, prawda? Powinieneś być w stanie przerwać część scalania, git pulljeśli nie podoba ci się to, co robi ... więc nie jestem pewien, jaki jest przypadek użycia tego.
Marnen Laibow-Koser
Wiem, że w pewnym momencie mam do czynienia ze zmianami, ale jak napisałem, czasami nie chcę. Chcę tylko wiedzieć, czy coś się zepsuje i muszę zarezerwować na to trochę więcej czasu - czy też mogę to zrobić git pullpóźniej. Myślę też, że o to właśnie chodziło w op.
Andy P.
-1

Jeśli nie chcesz, aby git-fetch aktualizował lokalny plik .git, po prostu skopiuj lokalne repozytorium do katalogu tymczasowego i tam ściągnij. Oto krótka ręka:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

Dawny.:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)
AX Labs
źródło
„gtp” musi zostać wykonane w katalogu głównym lokalnego repozytorium, w którym znajduje się .git.
AX Labs
-2

Co powiesz na klonowanie repozytorium w innym miejscu i robienie logów git zarówno na prawdziwej kasie, jak i na świeżym klonie, aby sprawdzić, czy masz to samo.

Ed Greenberg
źródło
Lokalna kopia lepiej odzwierciedla stan niż inny klon. Szczegóły w moim głównym poście .
AX Labs