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?
Odpowiedzi:
Opisane przepływy pracy nie są równoważne: wykonując pracę
reset --hard
tracisz wszystkie zmiany w drzewie roboczym (możesz chcieć to zrobićreset --soft
).Potrzebujesz
źródło
refs/heads/
…git push . current:other
. Działa to bezrefs/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.-m 'some text'
argumentu, aby zarejestrować przyczynę wyświetlenia aktualizacji ref przezgit reflog OtherBranch
polecenie, na przykład „zsynchronizowano z CurrentBranch”. Warto pamiętać, dlaczego później to zrobiłeś.git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch
lubgit push . CurrentBranch OtherBranch
kiedy możeszgit branch -f OtherBranch CurrentBranch
zamiast tego użyć znacznie czystszego (IMO) ? (Zobacz moją odpowiedź na git branch -f poniżej)Ustaw,
otherbranch
aby wskazywało na to samo zatwierdzenie, cocurrentbranch
przez uruchomienieOpcja
-f
(wymuś) mówigit branch
tak, naprawdę chcę nadpisać istniejąceotherbranch
odniesienie nowym .Z dokumentacji :
źródło
fatal: Cannot force update the current branch.
, próbując to zrobić.otherbranch
wymeldował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 targetbranch
aby wymusić wskazanie bieżącej gałęzitargetbranch
. Dodaj,--hard
aby wymusić również drzewo robocze do tej zawartości. Albo--soft
zostawić sam indeks i zmienić tylko samą gałąź.branch -f
to zrobić.Możesz zsynchronizować za pomocą tego polecenia swoje oddziały w dowolnym momencie
Również bez -f zastępuje ten zestaw poleceń
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.
źródło
-f
opcji, chyba że jest to absolutnie nieuniknione. W moim przypadku działa dobrze bez tego.