Jak naprawić repozytorium Git w jednym z poprzednich zatwierdzeń

jak mam wrócić z mojego aktualnego stanu w zdjęcie, wykonane na danej zatwierdzenia?

Jeśli robię git log to ja otrzymuję następujący wniosek:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

jak wrócić do zatwierdzenia z 3 listopada, czyli commit 0d1d7fc?


To zależy od tego, co masz na myśli przez "powrót".

tymczasowo przełączyć się na inną popełnienia

jeśli chcesz tymczasowo wrócić do niego, płatać figle, a następnie wrócić tam, gdzie jesteś, wszystko, co musisz zrobić, to sprawdzić odpowiednią blokadę:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

lub, jeśli chcesz zrobić commit, gdy jesteś tam, idź i zrób nowy wątek, aż się na nią:

git checkout -b old-state 0d1d7fc32

aby wrócić tam, gdzie były, po prostu sprawdź gałąź, na której zostały ponownie. (Jeśli zostały wprowadzone zmiany, jak zawsze przy zmianie gałęzi, masz do czynienia z nimi w razie potrzeby. Możesz zresetować je, aby wyrzucić; można ukryć, których możecie następnie zmienić zamówienie, ukryć pop, aby zabrać je ze sobą; można je umieścić w gałąź tam, jeśli chcesz gałąź tam.)

Hard usunąć niepublikowane commit

jeśli, z drugiej strony, czy naprawdę chcesz pozbyć się wszystkiego, co zrobiliście z tego czasu, są dwie możliwości. Po pierwsze, jeśli nie opublikowali te zmiany, po prostu zresetować:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

jeśli pomylisz, możesz już wyrzucić swoje lokalne zmiany, ale można, co najmniej, wrócić tam, gdzie kiedyś były z powrotem znowu.

anulować opublikowane commit z nowymi коммитами

Z drugiej strony, jeśli opublikowali pracę, prawdopodobnie nie chcesz resetować wątek, tak jak to skutecznie przepisuje historię. W tym przypadku naprawdę można anulować zmiany. Z Git powracać ma bardzo specyficzny wartość: tworzenie utrwalenie z zaworem patchem, aby ją anulować. W ten sposób nie przepiszesz historię.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

git-revert manpage faktycznie obejmuje wiele z nich w swoim opisie. Jeszcze jeden ciekawy link to git-scm.com sekcja dyskusji git-revert.

jeśli zdecydujesz, że nie chcesz wracać w końcu, możesz odzyskać zwrot (jak opisano tutaj) lub przywrócić z powrotem do zwrotu (patrz poprzedni rozdział.)

możesz także znaleźć odpowiedź pomocne w tym przypadku:
jak przenieść głowę z powrotem na poprzednie miejsce? (Odcięta głowa)


przywróć z kopii roboczej do ostatniego zatwierdzenia

aby powrócić do poprzedniego zatwierdzenia, ignorując wszelkie zmiany:

git reset --hard HEAD

gdzie kierownikiem jest ostatni commit w bieżącej gałęzi

przywróć z kopii roboczej do starszej zatwierdzenia

aby powrócić do zatwierdzenia, która w wieku powyżej najniższej ostatniego zatwierdzenia:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

kredyty idą na podobne pytanie przepełnienia stosu,powrót do zatwierdzenia z SHA w Drań?.


wiele trudnych i niebezpiecznych odpowiedzi tutaj, ale w rzeczywistości to po prostu:

git revert --no-commit 0766c053..HEAD
git commit

to zwróci wszystko z głowy z powrotem do mieszania zatwierdzenia, czyli on będzie odtworzyć ten stan zatwierdzenia w pracy drzewie jakby każde zobowiązanie odkąd został zwrócony. Następnie można móć drzewo, i to stworzy zupełnie nową blokadę, zasadniczo równoważne zatwierdzenia, do którego "wrócili".

(tom --no-commit flaga pozwala git zwrócić wszystkie blokada raz - w przeciwnym razie zostaniesz poproszony wiadomość dla każdego zatwierdzenia w zakresie, zatykanie swoją historię niepotrzebne nowych zatwierdzeniami.)

bezpieczny i prosty sposób, aby przewinąć do poprzedniego stanu. Historia nie jest zniszczony, dlatego można ją stosować do commits,które już zostały opublikowane.


najlepszym rozwiązaniem dla mnie i pewnie innych jest opcja resetowania Git:

git reset --hard <commidId> && git clean -f

To była najlepsza opcja dla mnie! To jest po prostu, szybko i skutecznie!


Uwaga : jak już wspomniano w komentarzach, nie rób tego, jeśli podziel się swoją gałąź z innymi ludźmi, którzy mają kopie starych commits

również z komentarzy, Jeśli potrzebujesz mniej "ballzy" metody, które można użyć

git clean -i


zanim odpowiesz, dodajmy tło, wyjaśniając, że jest to HEAD jest.

First of all what is HEAD?

HEAD - to po prostu odwołanie do bieżącej utrwalenie (najnowszą) w bieżącym wątku. Może być tylko jeden HEAD w dowolnym momencie (z wyjątkiem git worktree).

spis treści HEAD jest przechowywany wewnątrz .git/HEAD i zawiera 40 bajtów SHA-1 bieżącego popełniać.


detached HEAD

jeśli nie jesteś na ostatniego zatwierdzenia-oznacza to, że HEAD wskazuje na poprzedniej umocowanie w historii, to się nazywa detached HEAD.

Enter image description here

w wierszu polecenia, to będzie wyglądać tak - SHA-1 zamiast nazwy gałęzi, tak jak HEAD nie wskazuje na końcówkę prądu branch:

Enter image description here


kilka opcji, jak odzyskać z odłączoną głowy:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

to będzie test nowej gałęzi, wskazujących na odpowiednią blokadę. Ta drużyna będzie sprawdzić ustawioną blokadę.

na tym etapie można utworzyć gałąź i rozpocząć pracę z tego punktu na:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

zawsze można użyć reflog jak dobrze. git reflog wyświetli wszelkie zmiany, które zostały zaktualizowane HEAD i sprawdzić poprawny wpis reflog będzie ustawić HEAD wrócić do tego zatwierdzenia.

za każdym razem, gdy głowa zmienia się, będzie nowy wpis w reflog

git reflog
git checkout [email protected]{...}

to zabierze cię z powrotem do pożądanego popełnienie

Enter image description here


git reset HEAD --hard <commit_id>

"przesuń" głowę do tyłu do żądanego zatwierdzenia.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Uwaga: (Z Git 2.7) można również użyć git rebase --no-autostash jak dobrze.

ten schemat ilustruje, która drużyna co robi. Jak widać tam reset && checkout edytuj HEAD.

Enter image description here


jeśli chcesz "uncommit", wymazać ostatni post zatwierdzenia i odzyskać pliki, które zostały zmienione w stan pośredni, należy użyć polecenia:

git reset --soft HEAD~1
  • --soft wskazuje, że niewykorzystane pliki powinny być zapisane jako pliki robocze, a nie --hard co odrzuca je.
  • HEAD~1 To ostatni commit. Jeśli chcesz wycofać 3 commit, można użyć HEAD~3. Jeśli chcesz wycofać do określonego numeru wersji, można również zrobić to za pomocą jego SHA-hash.

to bardzo przydatne zespół w sytuacjach, gdy popełnił błąd, i chcesz anulować tę ostatnią utrwalenie.

źródło:http://nakkaya.com/2009/09/24/git-delete-last-commit/


próbowałem wielu sposobów, aby anulować zmiany i Git, i wydaje się, że to działa najlepiej, jeśli po prostu chcesz, aby powrócić do ostatniego ich zatwierdzenia państwa.

git add . && git checkout master -f

opis:

  • on nie będzie tworzyć żadnych commits jak git revert robi.
  • nie odłączy głowę, jak git checkout <commithashcode> robi.
  • on переопределит wszystkie zmiany lokalne i usunie wszystkie dodane pliki od daty ostatniego zatwierdzenia w wątku.
  • to działa tylko z nazwy gałęzi, więc można wrócić tylko do ostatniego zatwierdzenia w gałęzi w ten sposób.

znalazłem o wiele bardziej wygodny i łatwy sposób osiągnięcia wyników powyżej:

git add . && git reset --hard HEAD

gdzie HEAD wskazuje na najnowszą utrwalenie w bieżącym wątku.

to jest ten sam kod kodu, co i boulder_ruby zaproponował, ale dodałem git add .git reset --hard HEAD usuń wszystkie nowe pliki utworzone od ostatniego commita, to to, że większość ludzi spodziewa się, że jestem wierzcie w przypadku zwrotu do ostatniego zatwierdzenia.


można zrobić to za pomocą dwóch następujących poleceń:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

to spowoduje usunięcie poprzednich commits.

Jeśli chcesz zapisać swoje zmiany, można również użyć:

git reset --soft [previous Commit SHA id here]

następnie zachowa zmiany.


powiedzmy, że masz następujące zmiany w pliku tekstowym o nazwie ~/commits-to-revert.txt (użyłem git log --pretty=oneline aby uzyskać ich)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

nowy Bash shell skrypt do zwrotu każdego z nich:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

To zwraca wszystko z powrotem do poprzedniego stanu, w tym tworzenia plików i katalogów, i usunąć, zablokować go w swojej gałęzi i zapisywania historii, ale wrócił do tej samej strukturze plików. Dlaczego Git nie git revert --to <hash> to powyżej mojego zrozumienia.


dodatkowe alternatywy rozwiązań Jefromi

Jefromi to zdecydowanie najlepsze z nich, i powinno się ich używać. Jednak dla kompletności chciałem też pokazać te inne alternatywne rozwiązania ,które mogą być również wykorzystywane do zwrotu zatwierdzenia (w tym sensie, że utwórz nową blokadę, która anuluje zmiany w poprzedniej zatwierdzeniagit revert robi).

aby być jasne, te alternatywy nie jest najlepszym sposobem, aby odzyskać commit,rozwiązania Jefromi są, ale chcę tylko zauważyć, że można również korzystać z innych metod, aby osiągnąć ten sam cel, jak git revert.

opcja 1: twardy i miękki reset

to bardzo lekko zmieniona wersja rozwiązania Karola Bailey dla powrót do zatwierdzenia z SHA Git?:

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft [email protected]{1}

# Commit the changes
git commit -m "Revert to <commit>"

w zasadzie działa przy użyciu fakt, że soft reset opuszczę stanu poprzedniego zatwierdzenia, postawionego w indeksu/obszaru przemieszczania, którą można zablokować.

Alternatywa 2: Usuń bieżący drzewo i wymień go na nowy

to rozwiązanie bierze się z decyzji svick dla sprawdzanie starej zatwierdzenia i zrobić ją na nowo blokadą:

git rm -r .
git checkout <commit> .
git commit

podobnie alternatywy do #1, to odtwarza stan <commit> w bieżącej kopii roboczej. Trzeba to zrobić git rm po pierwsze, dlatego że git checkout nie będzie usuwać pliki, które zostały dodane z <commit>.


tutaj znacznie łatwiejsze sposób, aby wrócić do poprzedniego zatwierdzenia (i mieć ją w незафиксированном stanie zrobić z nią wszystko, co chcesz):

git reset HEAD~1

tak więc, nie ma potrzeby, aby w identyfikatorach zatwierdzenia i tak dalej:)


OK powrót do poprzedniej zatwierdzenia git dość łatwo...

wróć bez uwzględnienia zmiany:

git reset --hard <commit>

wróć zmiany:

git reset --soft <commit>

wyjaśniam: za pomocą git reset, można zresetować w określony stan, zwykle używając go z mocowania, jak widać powyżej.

ale, jak widzisz, różnica polega na użyciu dwóch flag --soft a --hard, by domyślnie git reset za pomocą --soft flaga, ale jest to dobra praktyka zawsze użyć flagi, tłumaczę każdy znacznik:


--soft

flaga domyślnie, jak wyjaśniono, nie trzeba go podawać, nie zmienia robocze drzewo, ale dodaje wszystkie pliki zmian, gotowe do zatwierdzenia, więc wracasz do statusu zatwierdzenia, który zmienia się na pliki, nie rozgrywa się.


--hard

uważaj z tą flagą, resetuje robocze drzewo i wszystkie zmiany monitorowane pliki-i wszystko się ułoży!


Ja również stworzył obraz poniżej, która może się zdarzyć w prawdziwym życiu, w pracy z git:

git reset to a commit


zakładając, że mówisz o master i na tej odpowiedniej gałęzi (jednak może to być dowolny robocza gałąź, z którą jesteś związany):

# Revert local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Revert remote master branch to November 3rd commit ID
git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

znalazłem odpowiedź na blogu usuń zdalne REPO Git dla konkretnej zatwierdzenia.


nic tu dla mnie nie działał, poza tym dokładne kombinacje:

git reset --hard <commit_hash>
git push origin <branch_name> --force

kluczem tutaj jest, zmuszając przeć, bez dodatkowego mocowania/utrwalenie wiadomości itp.


po wszystkich zmian, po kliknięciu w te wszystkie polecenia, można użyć:

git push -f ...

i nie tylko git push.


zespół (nie jest częścią core Git, ale ona jest w git-extras package) specjalnie dla zwrotu i inscenizacji starych commits:

git back

na stronie, można go używać także jako takiego:

# Remove the latest three commits
git back 3

wybierz blokadę i sprawdź jej z pomocą

git show HEAD
git show HEAD~1
git show HEAD~2 

dopóki nie otrzyma niezbędne zatwierdzenia. Aby zmusić głowę wskazać na to, zrób

git reset --hard HEAD~1

lub git reset --hard HEAD~2 lub coś innego.


powrót najnowsze blokada i ignorowanie wszystkich lokalnych zmian:

git reset --hard HEAD

aby zapisać zmiany od poprzedniej zatwierdzenia w HEAD i przejść do poprzedniego zatwierdzenia, wykonaj:

git reset <SHA>

Jeśli zmiany nie są wymagane od poprzedniego zatwierdzenia w HEAD i po prostu odrzucają wszystkie zmiany, wykonaj:

git reset --hard <SHA>

aby całkowicie wyczyścić katalog kodera od losowych zmian, użyliśmy:

git add -A .
git reset --hard HEAD

git reset --hard HEAD odciąć się od modyfikacji, ale nie pozbyć się "nowych" plików. W ich przypadku są one przypadkowo dany ważną folder gdzieś przypadkowo, i wszystkie te pliki były postrzegane jako nowe Git, tak, że reset --hard nie naprawili. Uruchamiając git add -A . z góry jest wyraźnie sprawdzał je wszystkie za pomocą git,aby być zniszczony ulgą.


To jeszcze jeden sposób, bezpośrednio zresetować niedawnej utrwalenie

git stash
git stash clear

natychmiast usuwa wszystkie zmiany, które robiłeś od czasu ostatniego commita.

PS: ma mały problem; usuwa również wszystkie ostatnio zapisane zmiany skrzynki. Co, myślę, że w większości przypadków nie ma znaczenia.


uważam, że niektórzy ludzie mogą przyjść do tej kwestii, chcąc wiedzieć, jak cofnąć dokonane zmiany, które zrobili w swoim kreatorze, tj. wyrzucić wszystko i wrócić do origin / master, w tym przypadku należy wykonać następujące czynności:

git reset --hard origin/master

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master


można wykonać wszystkie te początkowe kroki na własną rękę i wrócić do repo Git.

  1. wyjmij najnowszą wersję z repozytorium Bitbucket, za pomocą


Revert-to zespół, aby przywrócić commits.

git revert <commit1> <commit2> 

przykład:

git revert 2h3h23233

jest w stanie podejmować szereg z głowy jak poniżej. Tutaj 1 mówi: "cofnij ostatni commit."

git revert HEAD~1..HEAD

a potem zrób git push


jeśli sytuacja pilne, i chcesz po prostu zrobić to, co pytający zapytał w a ścieżka, przy założeniu, że projekt znajduje się w katalogu "mój projekt":

  1. skopiuj cały katalog i nazwij go czymś innym, na przykład "mój projekt-kopia"

  2. Do:

    git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

masz dwie wersje w systemie... można przeglądać, kopiować lub modyfikować pliki zainteresowanie, lub coś innego, od poprzedniego zatwierdzenia. Można całkowicie zrezygnować z plików w sekcji "Mój projekt-kopia", Jeśli zdecydujesz się, że nowa praca nigdzie się nie wybiera...

oczywista rzecz, jeśli chcesz kontynuować pracę ze stanem projektu, faktycznie nie odrzucając pracę, tak jak ta uzyskana blokada-zmień nazwę katalogu ponownie: usuń projekt zawierający zebrane zatwierdzenie (lub daj mu tymczasowe imię) i zmień nazwę katalogu" mój projekt - kopia "z powrotem w" mój projekt."Wtedy, prawdopodobnie, zrób jeszcze jeden obowiązek dość szybko.

Git-genialne wykonanie, ale nie można po prostu "podnieść go " w locie": także osoby, które próbują wyjaśnić to zbyt często zakładać, że wiesz o innych VCS [systemach kontroli wersji] i kopać zbyt głęboko, zbyt wcześnie, i popełnienia innych przestępstw, na przykład, używać zamiennie terminów dla "sprawdzenia" - sposoby, które czasami wydają się prawie obliczone, aby zmylić początkujących.

aby zaoszczędzić wiele Stres należy w dużej mierze muszą przeczytać książkę o Git-polecam "kontrola wersji z Git". I jeśli możesz mi ufać (lub raczej, moim шрамам), kiedy mówię, że "musi", z tego wynika, że można też zrobić to teraz. Większa część trudności Git pochodzi od rozgałęzienia, a następnie ponownie włączyć. Ale z twojego pytania jest nie ma powodów, dlaczego ludzie muszą oślepiać was z nauką.

zwłaszcza, jeśli, na przykład, to rozpaczliwa sytuacja, i jesteś początkujący z Git!

PS: jeszcze jedna myśl: (teraz) rzeczywiście dość proste, aby zapisać repozytorium Git ("REPO") w katalogu innym niż to, w którym znajdują się pliki robocze. To by oznaczało, że nie trzeba kopiować całego repozytorium Git, wykorzystując powyższe szybkie i brudne rozwiązanie. Cm. odpowiedź frytkownice za pomocą --separate-git-dir tutaj. ostrzegł, ale: jeśli masz repozytorium" katalog", którego nie ma skopiuj i zrobić twardy reset, wszystkie wersje po zatwierdzeniu reset zostaną utracone na zawsze, jeśli nie masz, jak jesteś absolutnie musi, regularnego tworzenia kopii zapasowych twojego repozytorium, najlepiej w chmurze (np.Dysk Google) w innych miejscach.


spróbuj zresetować ustawienia do odpowiedniej zatwierdzenia -

git reset <COMMIT_ID>

(w celu sprawdzenia COMMIT_ID użyj git log)

to zresetuje wszystkie zmienione pliki w stan un-added.

teraz możesz checkout nie wszystkie dodane pliki

git checkout .

Rejestracja git log, aby sprawdzić zmiany.

aktualizacja

jeśli masz tylko commit w swoim REPO, spróbować

git update-ref -d HEAD


ponieważ swoje commity zdalnie wciśnięte, trzeba je usunąć. Pozwól mi zgadnąć, że twoja gałąź rozwija się i jest wypychany z origin.

najpierw trzeba usunąć develop z origin:

git push origin :develop (note the colon)

następnie należy przejść do statusu, który chcesz, pozwól mi przypuszczać, że hash zatwierdzenia-EFGHIJK:

git reset --hard EFGHIJK

w końcu, kliknij przycisk ponownie:

git push origin develop

Jeśli chcesz naprawić jakiś błąd w ostatnim zatwierdzenia, dobrą alternatywą będzie korzystanie z git commit --amend. Jeśli ostatnia blokada nie podano żadnego linku, to będzie wyczyn, ponieważ tworzy blokadę z tym samym rodzicem, że i ostatnia blokada. Jeśli nie ma linki na ostatni commit, to po prostu będzie odrzucone, i ten commit będzie ostatni commit. Jest to dobry sposób na poprawki commits bez zwrotu commits. Jednak ma swoje ograniczenia.


uwaga! to polecenie może spowodować utratę historii zatwierdzenia, jeśli użytkownik postawił błędną utrwalenie błędnie. Zawsze jest dodatkowa kopia zapasowa twojego git niektóre gdzie jeszcze na wszelki wypadek, jeśli robisz błędy, niż można się trochę bezpieczniej. :)

miałem podobny problem, i chciałbym wrócić do wcześniejszego zatwierdzenia. W moim przypadku nie był intetessered, aby zapisać nową blokadę, więc użyłem Hard.

oto jak to zrobiłem to:

git reset --hard CommitId && git clean -f

to wróci do lokalnego repozytorium, tutaj po użyciu git push -f aktualizuj zdalnego repozytorium.

git push -f

po pierwsze, otrzymasz ciąg znaków, który identyfikuje utrwalenie w jakąś datę, robi:

git rev-list -n 1 --before="2009-07-27 13:37" origin/master

drukuje identyfikator zatwierdzenia, bierze ciąg znaków (np. XXXX):

git checkout XXXX