Git ciągnie do określonego zatwierdzenia

106

Chcę zrobić, git pullale tylko do określonego zatwierdzenia.

 A->B->C->D->E->F (Remote master HEAD)

więc przypuśćmy, że moja local masterGŁOWA wskazuje na Bi chcę ciągnąć do E. Co powinienem zrobić ?

To nie jest ściąganie określonego zatwierdzenia, to jest ciągnięcie do określonego zatwierdzenia.

Ninja420
źródło
3
git fetchi git merge E.
poke
Obecnie jestem na przykład w B, ale chcę wyciągnąć tylko C, E i F. Chcę usunąć D. Dzięki!
Frenkey
@Frenkey możesz scalić master, a następnie usunąć ostatnie trzy zatwierdzenia, a następnie wybrać dwa ostatnie. Możesz także wypróbować rebase -i, aby uzyskać bardziej kontrolowane łączenie git
Ninja420
co jeśli chcę pobrać tylko zmiany z C, a nie uwzględniać zmian A i B tylko C? Jak mogę to zrobić?
Vikas Chauhan

Odpowiedzi:

120

git pulljest niczym innym, jak tylko git fetchnastępuje git merge. Więc co możesz zrobić, to

git fetch remote example_branch

git merge <commit_hash>

unrealsoul007
źródło
Co powinno być „Odnieś się do tego”?
developerbmw
@Brett Zapomniałem opublikować link ... usunąłem go całkowicie
unrealsoul007
@ unrealsoul007 to połączy tylko to jedno konkretne zatwierdzenie, prawda? Więc aby wyciągnąć z B do E, polecenie byłoby git merge <commit_hash C> <commit_hash D> <commit_hash E> prawda?
Wim Feijen
7
@WimFeijen git merge Epołączy się Eze wszystkimi swoimi przodkami Ci D(git o tym wie Ai Bnie musi być łączony, ponieważ znajdował się już w twojej gałęzi). Jeśli TYLKO chcesz zmiany E, powinieneś git cherry-pick Ezamiast tego.
neXus
Dzięki chłopaki za odpowiedź, szukałem tego samego problemu.
Akash Bisariya
25

Najpierw pobierz najnowsze zatwierdzenia ze zdalnego repozytorium. Nie wpłynie to na Twój lokalny oddział.

git fetch origin

Następnie sprawdź gałąź zdalnego śledzenia i zrób dziennik git, aby zobaczyć zatwierdzenia

git checkout origin/master
git log

Chwyć skrót zmiany zatwierdzenia, z którym chcesz się połączyć (lub tylko pierwsze ~ 5 znaków) i połącz ten zatwierdzenie w master

git checkout master
git merge <commit hash>
developerbmw
źródło
1
Głosowałem w dół, ponieważ to nie działa zgodnie z reklamą. Po pierwsze, twoja metoda "git fetch origin" pobiera wszystkie zdalne gałęzie (należy to wyraźnie zaznaczyć, szczególnie dla osób pracujących w projektach z wieloma i dużymi gałęziami). Po drugie, dzięki tej metodzie „git merge <commit hash>” nie łączy Twojej lokalnej historii z pożądanym zatwierdzeniem, jeśli jesteś z powrotem w historii. Przykład: Lokalnie jesteś na zatwierdzeniu 100, chcesz uzyskać do 150, pobierając wszystko (ze zdalnym HEAD na 100).
Symbol zastępczy
8
@Placeholder powinieneś przeczytać instrukcję git fetchprzed napisaniem takich bzdur. Co więcej, powinieneś przeczytać oryginalne pytanie i moją odpowiedź. Jeśli zastosujesz się do mojej odpowiedzi, nie wrócisz do historii, tak jak wyraźnie polecam użytkownikowi git checkout master. Ogólnie rzecz biorąc, nie publikuj żadnych rzeczy, jeśli nie masz co najmniej 50% pewności co do tego, co robisz.
developerbmw
1
Jeśli nie jest to oczywiste dla nikogo innego, git fetch originjawnie pobiera źródło .
Daniel Farrell
2
Działa to doskonale i jest lepiej wyjaśnione niż zaakceptowana odpowiedź.
walen
1
Najlepsza odpowiedź, zadziałało idealnie
Asfandyar Khan,
14

Możesz także pobrać najnowsze zatwierdzenie i po prostu cofać, aż zatwierdzenie, którego chcesz:

git pull origin master
git reset --hard HEAD~1

Zastąp masterżądaną gałęzią.

Użyj dziennika git, aby zobaczyć, do którego zatwierdzenia chcesz przywrócić:

git log

Osobiście to działa lepiej dla mnie.

Zasadniczo, to, co to robi, to ściąganie ostatniego zatwierdzenia i ręczne cofanie zatwierdzeń jeden po drugim. Użyj dziennika git, aby zobaczyć historię zatwierdzeń.

Zalety: działa zgodnie z reklamą. Nie musisz używać wartości skrótu zatwierdzania ani wyciągać niepotrzebnych gałęzi.

Złe punkty: Musisz cofnąć zatwierdzenia o jeden.

OSTRZEŻENIE: Zatwierdź / ukryj wszystkie lokalne zmiany, ponieważ wraz z --hardtobą je stracisz. Używaj na własne ryzyko!

Symbol zastępczy
źródło
3
Nie wiem, dlaczego głosy w dół, wydaje się to najczystszym sposobem, a gdy tylko zechcesz się zaktualizować, wystarczy proste wyciągnięcie, w przeciwieństwie do niektórych innych odpowiedzi
Mauricio Pasquier Juan
Albo nie może więcej pozytywnych głosów, jedynym minusem jest to, że musisz przejść do poprzedniego, HEADzanim wrócisz - i nie wiem, co by się stało, gdybyś musiał rozwiązać konflikty. Ale to rozwiązanie pozwala git pull --rebasei w przeciwieństwie do tego, co zostało powiedziane, możesz bezpośrednio zresetować z powrotem do Nzatwierdzeń wstecz za pomocą git reset --hard HEAD~N(tj. Dla 3 zatwierdzeń git reset --hard HEAD~3).
Stock Overflaw
Możesz to zrobić git reset --hard SHAi zresetuje go do żądanego zatwierdzenia, bez konieczności liczenia wstecz.
Visya
2

Jeśli połączysz zatwierdzenie w swojej gałęzi, powinieneś uzyskać całą historię pomiędzy.

Przestrzegać:

$ git init ./
Zainicjowano puste repozytorium Git w /Users/dfarrell/git/demo/.git/
$ echo 'a'> letter
$ git dodaj literę
$ git commit -m 'Pierwsza litera'
[master (root-commit) 6e59e76] Pierwsza litera
 1 plik zmieniony, 1 wstawienie (+)
 utwórz tryb 100644 letter
$ echo 'b' >> litera
$ git add letter && git commit -m 'Adding letter'
[master 7126e6d] Dodawanie litery
 1 plik zmieniony, 1 wstawienie (+)
$ echo 'c' >> litera; git add letter && git commit -m 'Dodawanie litery'
[mistrz f2458be] Dodawanie litery
 1 plik zmieniony, 1 wstawienie (+)
$ echo 'd' >> litera; git add letter && git commit -m 'Dodawanie litery'
[master 7f77979] Dodawanie litery
 1 plik zmieniony, 1 wstawienie (+)
$ echo 'e' >> litera; git add letter && git commit -m 'Dodawanie litery'
[master 790eade] List dodający
 1 plik zmieniony, 1 wstawienie (+)
$ git log
zatwierdzić 790eade367b0d8ab8146596cd717c25fd895302a
Autor: Dan Farrell 
Data: Czw, 16 lipca, 14:21:26 2015-0500

    Dodawanie listu

zatwierdzić 7f77979efd17f277b4be695c559c1383d2fc2f27
Autor: Dan Farrell 
Data: czw., 16 lipca, 14:21:24 2015-0500

    Dodawanie listu

zatwierdzić f2458bea7780bf09fe643095dbae95cf97357ccc
Autor: Dan Farrell 
Data: czw., 16 lipca, 14:21:19 2015-0500

    Dodawanie listu

zatwierdzić 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Autor: Dan Farrell 
Data: czw., 16 lipca, 14:20:52 2015-0500

    Dodawanie listu

zatwierdzić 6e59e7650314112fb80097d7d3803c964b3656f0
Autor: Dan Farrell 
Data: czw., 16 lipca, 14:20:33 2015-0500

    Pierwsza litera
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Uwaga: sprawdź „7126e6dcb9c28ac60cb86ae40fb358350d0c5fad”.

Jesteś w stanie „odłączonej głowy”. Możesz się rozejrzeć, eksperymentować
zmiany i zatwierdzić je, a także możesz odrzucić wszystkie wprowadzone w tym zmiany
stan bez wpływu na żadne gałęzie, wykonując kolejne pobranie.

Jeśli chcesz stworzyć nową gałąź, aby zachować utworzone przez siebie zatwierdzenia, możesz
zrób to (teraz lub później), ponownie używając -b z poleceniem checkout. Przykład:

  git checkout -b nazwa_nowego_gałęzi

HEAD ma teraz 7126e6d ... Dodawanie listu
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Przełączono do nowej gałęzi „B”
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a
fatal: „790eade367b0d8ab8146596cd717c25fd895302a” nie wydaje się być repozytorium git
krytyczny: nie można odczytać ze zdalnego repozytorium.

Upewnij się, że masz odpowiednie prawa dostępu
i repozytorium istnieje.
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27
Aktualizacja 7126e6d..7f77979
Przewiń do przodu
 list | 2 ++
 1 plik zmieniony, 2 wstawienia (+)
$ list kota
za
b
do
re
Daniel Farrell
źródło
1

Znalazłem zaktualizowaną odpowiedź z tego filmu , zaakceptowana odpowiedź nie działa dla mnie.

Najpierw sklonuj najnowsze repozytorium z gita (jeśli nie było) przy użyciu git clone <HTTPs link of the project> (lub używając SSH), a następnie przejdź do gałęzi pragnienia za pomocą git checkout <branch name> .

Użyj polecenia

git log

aby sprawdzić najnowsze zatwierdzenia. Skopiuj shal konkretnego zatwierdzenia. Następnie użyj polecenia

git fetch origin <Copy paste the shal here>

Po naciśnięciu klawisza enter. Teraz użyj polecenia

git checkout FETCH_HEAD

Teraz konkretne zatwierdzenie będzie dostępne dla twojego lokalnego. Zmień cokolwiek i prześlij kod za pomocą git push origin <branch name>. To wszystko. Sprawdź wideo w celach informacyjnych.

TripleM
źródło
0

To działa dla mnie:

git pull origin <sha>

na przykład

[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...

To ciągnie 28eb00, ff39e4 i wszystko wcześniej, ale nie pobiera f4d10ad. Pozwala na użycie pull --rebase i honours pull settings w twoim gitconfig. To działa, ponieważ w zasadzie traktujesz 28eb00 jako gałąź.

W przypadku używanej przeze mnie wersji git ta metoda wymaga pełnego skrótu zatwierdzenia - żadne skróty ani aliasy nie są dozwolone. Możesz zrobić coś takiego:

[dbn src]$ git pull origin `git rev-parse origin/master^`
dbn
źródło