Zresetuj inną gałąź do aktualnej bez kasowania

110

Piszę kilka skryptów do mojego przepływu pracy w Git.

Muszę zresetować inną (istniejącą) gałąź do bieżącej, bez wyrejestrowania.

Przed:

 CurrentBranch: commit A
 OtherBranch: commit B

Po:

 CurrentBranch: commit A
 OtherBranch: commit A

Odpowiednik

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(Uwaga --soft: nie chcę wpływać na drzewo robocze).

czy to możliwe?

Alexander Gladysh
źródło
Czy ktoś wie, czy jest to również możliwe w Egit?
zedoo

Odpowiedzi:

84

Opisane przepływy pracy nie są równoważne: wykonując pracę reset --hardtracisz wszystkie zmiany w drzewie roboczym (możesz chcieć to zrobić reset --soft).

Potrzebujesz

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch
P Shved
źródło
3
Człowieku, chciałbym, żeby to zadziałało bez zbędnego refs/heads/
ELLIOTTCABLE
41
O wiele przyjemniejszym sposobem na to jest git push . current:other. Działa to bez refs/heads(/ cc @elliottcable), a także zapobiega aktualizowaniu wyewidencjonowanej gałęzi. Zauważ, że może być konieczne przekazanie -f (lub użycie +current:other), jeśli aktualizacja nie jest przyspieszona.
Lily Ballard
4
Możesz również użyć -m 'some text'argumentu, aby zarejestrować przyczynę wyświetlenia aktualizacji ref przez git reflog OtherBranchpolecenie, na przykład „zsynchronizowano z CurrentBranch”. Warto pamiętać, dlaczego później to zrobiłeś.
Levi Haskell,
18
Dlaczego miałbyś używać git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchlub git push . CurrentBranch OtherBranchkiedy możesz git branch -f OtherBranch CurrentBranchzamiast tego użyć znacznie czystszego (IMO) ? (Zobacz moją odpowiedź na git branch -f poniżej)
Colin D Bennett,
1
@BenHymers Więc strona podręcznika "git push" to cholerne kłamstwo. Opisuje polecenie jako „Aktualizuj zdalne referencje ...”. podczas gdy w rzeczywistości może aktualizować lokalne referencje dobrze.
Kaz,
228

Ustaw, otherbranchaby wskazywało na to samo zatwierdzenie, co currentbranchprzez uruchomienie

git branch -f otherbranch currentbranch

Opcja -f(wymuś) mówi git branch tak, naprawdę chcę nadpisać istniejące otherbranchodniesienie nowym .

Z dokumentacji :

-f
--force

Przywróć, jeśli już istnieje. Bez -f git branch odmawia zmiany istniejącej gałęzi.

Colin D. Bennett
źródło
6
To najłatwiejsza odpowiedź. Dzięki!
Robert Karl
Otrzymuję fatal: Cannot force update the current branch., próbując to zrobić.
Fuad Saud
4
@FuadSaud to dlatego, że już się otherbranchwymeldowałeś. To pytanie SO dotyczy w szczególności resetowania innej gałęzi do innego zatwierdzenia (tj. Nie resetowania wyewidencjonowanej gałęzi). To, co chcesz zrobić, to zresetować bieżącą gałąź za pomocą, git reset targetbranchaby wymusić wskazanie bieżącej gałęzi targetbranch. Dodaj, --hardaby wymusić również drzewo robocze do tej zawartości. Albo --softzostawić sam indeks i zmienić tylko samą gałąź.
Colin D Bennett
Racja, więc wiem o resecie. To, czego szukałem, to sposób, aby w ramach procedury zawsze wskazywać lokalnemu nadrzędnemu nadrzędnemu / nadrzędnemu, niezależnie od tego, co zostało sprawdzone. Myślałem, że mogę branch -fto zrobić.
Fuad Saud,
9
Imo, to powinna być akceptowana odpowiedź. To bardzo poprawiło mój przepływ pracy!
zabójcza gitara
23

Możesz zsynchronizować za pomocą tego polecenia swoje oddziały w dowolnym momencie

$ git push . CurrentBranch:OtherBranch -f

Również bez -f zastępuje ten zestaw poleceń

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

Może to być przydatne, gdy nie musisz zatwierdzać wszystkich plików w CurrentBranch i nie możesz przełączyć się do innych gałęzi.

Denis Kuznetsov
źródło
Może powodować „zdalne: błąd: odmowa przewijania do przodu”
Basilevs
3
Nie włączałbym -fopcji, chyba że jest to absolutnie nieuniknione. W moim przypadku działa dobrze bez tego.
Melebius