Jak przewinąć gałąź do przodu?


249

Zmieniłem się na mistrza po długim rozwoju w oddziale. Dziennik pokazuje:

Twój oddział znajduje się za „origin / master” o 167 zatwierdzeń i może być szybko przekazywany.

Próbowałem:

git checkout HEAD

To nie ma wpływu. To dlatego, że mam kasę zatwierdzenia pośredniego na master.

Jak sprawić, by mistrz pozostał na głowie?


6
git checkout HEADnigdy nic nie robi. HEADoznacza już zatwierdzone wyrejestrowanie.
Emre Tapcı

Odpowiedzi:


244

Robić:

git checkout master
git pull origin

pobierze i scali origin/mastergałąź (możesz po prostu powiedzieć, git pullże domyślnie jest origin).


52
Myślę, że odpowiedź Roba jest lepsza. Zwykle spotykam się z sytuacją, w której właśnie skończyłem ciągnięcie, a następnie przełączam się na inną gałąź, która wymaga szybkiego przewinięcia do przodu. Denerwuje mnie, jeśli muszę wykonać kolejną (bez operacji) pociągnięcie i czekać na zakończenie; robienie operacji tylko lokalnej jest szybsze i i tak chcę.
Baron Schwartz

353

Spróbować git merge origin/master. Jeśli chcesz mieć pewność, że wykonuje on tylko przewijanie do przodu, możesz powiedzieć git merge --ff-only origin/master.


4
Jest to przydatne, gdy Twój pilot ma kilka obręczy uwierzytelniających do przeskoczenia. Kiedy ściągam jedną gałąź, muszę się uwierzytelnić. Następnie, kiedy przełączam się do innej gałęzi (tj. W celu wybrania moich zmian), wolę używać tego mergepolecenia, aby nie musiałem ponownie uwierzytelniać.
RustyTheBoyRobot

30
--ff-onlyjest niezwykle przydatny.
Łukasz

4
Nie wiem, czy ta origin/masterczęść jest wymagana, czy rozsądnie domyślna, ale uznałem, że przydatne jest utworzenie aliasu dla szybkiego przewijania do przodu, więc chciałem się upewnić, że gałąź nadrzędna jest używana zamiast na stałe ją kodować origin/master: ff = merge --ff-only @{u}( @{u}jest nadrzędna) .
Thor84no,

2
to jest lepsza niż sugerowana odpowiedź, jeśli jesteś offline
Jacek Pietal

1
Czy możesz wyjaśnić, dlaczego proste pociągnięcie nie robi tego samego? Czy nadal jest potrzebne przyciąganie?
Zuzu Corneliu

40

W twojej sytuacji git rebaserównież załatwi sprawę. Ponieważ nie masz żadnych zmian, których nie ma mistrz, git po prostu przewinie do przodu. Jeśli pracujesz z procesem rebase, może to być bardziej wskazane, ponieważ nie skończyłbyś się zatwierdzeniem scalania, jeśli się zepsujesz.

username@workstation:~/work$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean
username@workstation:~/work$ git rebase
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.
# On branch master
nothing to commit, working directory clean

1
I bardzo przydatne dla mnie, ponieważ nie powinniśmy używać git pull!
Stefan

Nawet jeśli czeka Cię jakaś zmiana, zawsze możesz ukryć i uzupełnić bazę, nie wiem, czy to jest „właściwy” sposób, ale działa cuda.
fn.

28
git checkout master
git pull

powinien wykonać pracę.

Otrzymasz komunikat „Twoja gałąź jest opóźniona” za każdym razem, gdy pracujesz nad gałęzią inną niż master , ktoś dokonuje zmian w master i zaczynasz.

(branch) $ //hack hack hack, while someone push the changes to origin/master
(branch) $ git pull   

teraz referencja origin / master jest pobierana, ale twój master nie jest z nią scalony

(branch) $ git checkout master
(master) $ 

teraz master znajduje się za początkiem / master i może być szybko przewijany

this will pull and merge (so merge also newer commits to origin/master)
(master) $ git pull 

this will just merge what you have already pulled
(master) $ git merge origin/master

teraz twój master i origin / master są zsynchronizowane


13

Jeśli stoisz w innej gałęzi i chcesz sprawdzić najnowszą wersję Master, możesz to zrobić

git checkout -B master origin/master


9

Każdemu, kto chce Przewinąć do przodu, nie ma dostępu do innej zdalnej gałęzi (w tym siebie) bez sprawdzenia tej gałęzi, możesz:

git fetch origin master:other

To w zasadzie szybki przewija indeks otherdo, origin/masterjeśli nie jesteś włączonyother gałęzi. W ten sposób możesz szybko przewinąć wiele oddziałów.

Jeśli pracujesz przez jakiś czas nad inną gałęzią i chcesz zaktualizować nieaktualne gałęzie ze zdalnego do odpowiedniej głowy:

git fetch origin master:master other:other etc:etc

2

Nie musisz się komplikować, po prostu stań w swojej gałęzi i odważnie pracował dla mnie

Lub, jako drugi, wypróbuj git pull origin master tylko w przypadku, gdy nie masz szczęścia z pierwszym poleceniem


0

Aby rebase do aktualnego miejscowego tracker oddział porusza lokalnych zmian na szczycie najnowszego stanu zdalnego:

$ git fetch && git rebase

Mówiąc bardziej ogólnie, aby przewinąć do przodu i upuścić zmiany lokalne ( twardy reset ) *:

$ git fetch && git checkout ${the_branch_name} && git reset --hard origin/${the_branch_name}

aby przewinąć do przodu i zachować zmiany lokalne (zmiana bazy ):

$ git fetch && git checkout ${the_branch_name} && git rebase origin/${the_branch_name}

* - aby cofnąć zmianę spowodowaną przez niezamierzony twardy reset najpierw wykonaj git reflog, który wyświetla stan HEAD w odwrotnej kolejności, znajdź skrót, na który HEAD wskazywał przed operacją resetowania (zwykle oczywiste) i twardy reset gałęzi do tego skrótu.


0

W twoim przypadku, aby przewinąć do przodu, uruchom:

$ git merge --ff-only origin/master

Wykorzystuje to --ff-onlyopcję git merge, ponieważ pytanie dotyczy konkretnie „szybkiego przewijania do przodu”.

Oto fragment, git-merge(1)który pokazuje więcej opcji szybkiego przewijania:

--ff, --no-ff, --ff-only
    Specifies how a merge is handled when the merged-in history is already a descendant of the current history.  --ff is the default unless merging an annotated
    (and possibly signed) tag that is not stored in its natural place in the refs/tags/ hierarchy, in which case --no-ff is assumed.

    With --ff, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When
    not possible (when the merged-in history is not a descendant of the current history), create a merge commit.

    With --no-ff, create a merge commit in all cases, even when the merge could instead be resolved as a fast-forward.

    With --ff-only, resolve the merge as a fast-forward when possible. When not possible, refuse to merge and exit with a non-zero status.

Często przewijam do przodu, aby uzasadnić alias:

$ git config --global alias.ff 'merge --ff-only @{upstream}'

Teraz mogę uruchomić to, aby przewinąć do przodu:

$ git ff

-2

Przesuń wskaźnik gałęzi do HEAD:

git branch -f master

Twój oddział masterjuż istnieje, więc git nie pozwoli ci go zastąpić, chyba że użyjesz ... -f(ten argument oznacza --force)

Lub możesz użyć rebase:

git rebase HEAD master

Zrób to na własne ryzyko;)


1
Nie próbuj tego. jeśli masz następującą sytuację, zdarzają się złe rzeczy: C0 --- C1 --- C2 --- C3 --- C4 (master). C0 --- C1 --- C2 --- B1 --- B2 --- B3 (dev) Jeśli twoja głowa jest w B3 (dev) i wykonujesz git branch -f master, skończysz z C0 - - C1 --- C2 --- B1 --- B2 --- B3 (dev) (master). C3 --- C4 nie są osiągalne z żadnej gałęzi i ostatecznie zostaną zebrane śmieci. Jeśli znajdziesz się w takiej sytuacji, spójrz na reflog i sprawdź C4 zatwierdzenie z opcją -b <branch>, aby utworzyć nową gałąź.
A_P
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.