Biorąc pod uwagę, że istnieje kilka poleceń git, które nie mają sensu w czystym repozytorium (ponieważ gołe repozytoria nie używają indeksów i nie mają katalogu roboczego),
git reset --hard HEAD^
nie jest rozwiązaniem pozwalającym cofnąć zatwierdzenie ostatniej zmiany w takim repozytorium.
Przeszukiwaniu internetu, można znaleźć wszystko, co związane z tematem jest ten , w którym ja przedstawił trzy sposoby w ten sposób:
1. „ręcznie zaktualizować ref (co wiąże się hydrauliką)”;
2. „ git push -f
z nieoczyszczonego repozytorium”;
3. „ git branch -f this $that
”.
Które rozwiązanie Twoim zdaniem jest bardziej odpowiednie lub jakie są inne sposoby, aby to zrobić? Niestety, znaleziona przeze mnie dokumentacja dotycząca repozytoriów git bare jest dość uboga.
Odpowiedzi:
Możesz użyć
git update-ref
polecenia. Aby usunąć ostatnie zatwierdzenie, użyłbyś:Lub jeśli nie jesteś w gałęzi, z której nie możesz usunąć ostatniego zatwierdzenia:
Możesz również przekazać sha1, jeśli chcesz:
Zobacz dokumentację polecenia git-update-ref .
źródło
git update-ref <ref> <newvalue>
będzie właściwą gałęzią, na przykład „refs / heads / master” zamiast HEAD. Mam nadzieję, że nie zrozumiałem źle twojego pytania.branch-name
argumentację. Używającupdate-ref
z „gałęzią”, absolutnie musisz podać pełną nazwę referencyjną gałęzi (tj. Przedrefs/heads/
zwykłą krótką nazwą gałęzi). Jeśli użyjesz tylko krótkiej nazwy,$GIT_DIR/branch-name
zamiast tego utworzysz / zaktualizujesz$GIT_DIR/refs/heads/branch-name
. Istnienie obubranch-name
irefs/heads/branch-name
spowoduje ostrzeżenia „refname… jest niejednoznaczne”.Jeśli używasz następujących w gołym repozytorium:
wtedy nie napotkasz problemów, których używasz,
--hard
i--mixed
opcji w gołym repozytorium, ponieważ nie próbujesz zmienić czegoś, czego nie ma (tj. drzewo robocze i indeks). W twoim przypadku chciałbyś użyć (z samego repozytorium):Aby przełączyć gałęzie w zdalnym repozytorium, wykonaj:
Aby zobaczyć aktualnie wybrany oddział użyj:
https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html
źródło
git checkout other_branch
nie działa w nagim.git push -f
Powinno zadziałać:jeśli sklonować tę gołą repo, usunąć ostatni commit (
git reset --hard HEAD^
tak jak wspomniałeś, ale w lokalnym zakaz nagiej repo) i przesunąć do tyłu (-f
):źródło
git reset --soft <sha1>
jak pokazano w mojej odpowiedzi poniżej, nie byłby zalecaną praktyką przenoszenia HEAD na gołym repozytorium?reset --soft
powinno działać, gdy jest wykonywane bezpośrednio na gołym repozytorium. Podejrzewam, że jest to rzadko wykonywane, ponieważ nagie repozytorium jest generalnie repozytorium upstream (tj. Repozytorium, do którego wysyłasz dane) i przez większość czasu nie masz do niego bezpośredniego dostępu lokalnego. Ale jeśli tak, to z pewnością jest to kolejny dobry przykładreset --soft
użycia " " (jak w stackoverflow.com/questions/5203535/ ... ) Więc +1 do twojej odpowiedzi.Możesz także użyć notacji git refspec i zrobić coś takiego:
git push -f origin +<commit you want to revert to>:<destination_head | branch_name>
Wymusza to aktualizację gałęzi docelowej (jak oznaczono przez ref) do zatwierdzenia źródłowego, zgodnie z oznaczeniem
+<object ref>
części.źródło