2012-04-17 15 views
23

Mam serwer WWW, który obsługuje projekt będący repozytorium git. Kiedy dokonuję pewnych zmian w kodzie, robię ciągnięcie git z serwera. Czasami nowy kod po prostu zawiesza się, chciałbym móc wykonać wycofanie do najnowszej wersji, tej poprzedniej. Chcę to zrobić za pomocą skryptu, bez konieczności przeszukiwania tego, co jest najnowszym sha. Jak mogę to zrobić?Wycofanie Git 1 pociągnięcie

Edytuj: Aby wyjaśnić, chcę tylko wykonać jedną czynność, np. Nacisnąć przycisk, który mówi: "Ups, ten ostatni ruch, który właśnie zrobiłem, był błędem, szkoda, że ​​tego nie zrobiłem". Nie chcę szukać sha, tagów ani cokolwiek innego w tej sytuacji, to raczej funkcja "cofania". Następnie chcę móc kontynuować pracę nad kodem, a kolejne uruchomienie serwera wymaga wprowadzenia najnowszych zmian.

Odpowiedz

52

git reset --hard HEAD^1 zabierze Cię z powrotem jeden commit z tego, co wyciągnąłeś. Jeśli chcesz przywrócić stan, w którym był wcześniej, użyj git reset --hard [email protected]{1}. @{1} śledzi, gdzie znajdowała się głowa przed ostatnią operacją, która zmieniła ją w lokalnym repozytorium, więc cofnie się kilka razy, jeśli kilku zostało popchniętych przed wykonaniem polecenia. Zobacz także git reflog, aby wyświetlić całą listę.

+1

bardzo interesujące, a następnie w jaki sposób powrócił do normalnej pracy? Mam na myśli to, że jeśli wprowadzę jakieś poprawki na złym kodzie, czy mogę po prostu pójść na serwer i zrobić ponownie git, aby dostać się do najnowszych zmian? – Bastian

+3

Tak, będzie w stanie takim, jakiego nigdy nie ciągnąłeś, więc wszystko, co normalnie zrobiłbyś, można zrobić. –

2

git reset HEAD^ powinien zabrać Cię do poprzedniego zatwierdzenia. Aby uzyskać więcej informacji, patrz here.

+0

To faktycznie 'git zresetować --hard HEAD ^', chyba nie chcesz dotykać katalog roboczy. –

+0

Zgodnie z pytaniem, które repo musi po prostu wycofać po nowym wywołaniu, powoduje problem, więc katalog roboczy powinien być pusty. –

0

Innym sposobem wykonania tej czynności będzie użycie tagów. Myślą, że możesz oznaczyć HEAD jakimś numerem wersji przed przeciągnięciem, wykonaj ciągnięcie, a następnie, jeśli musisz odwrócić HEAD, możesz zrobić git reset {tag name} W ten sposób, jeśli ciągnięcie ma wiele zatwierdzeń, możesz wrócić do miejsca, w którym byłeś przed scaleniem.

2

W takim przypadku przydatne może być użycie oddziału, który można łatwo usunąć lub scalić w przypadku niepowodzenia lub sukcesu. Pomoże Ci to śledzić nowości i sprawi, że rzeczy będą czystsze, jeśli masz bardziej skomplikowane przypadki niż "po prostu usuń ostatnie zatwierdzenie" (zwłaszcza, że ​​chcesz to zrobić za pomocą skryptu). Więc na serwerze:

git fetch --all   # fetch new commits from remote 
git checkout -b testing # create and switch to branch 'testing' 
git merge origin/master # merge new commits from remote branch master 
          # (in branch 'testing') 

... wtedy badanie rzeczy ... jeśli sukces:

git checkout master  # switch back to master 
git merge testing 

i po awarii:

git checkout master 
git branch -D testing  # remove testing branch 

ale i tak ... To twoja jedyna punktem jest usunięcie ostatniego zatwierdzenia, możesz użyć git reset, jak wskazał Josh.

+0

Dobra uwaga, nie o to mi chodziło, ale mogłem pracować bardzo dobrze. Spróbuję pójść z najprostszą metodą. – Bastian

1

Przyjęta odpowiedź przez @Karl Bielefeldt nie sprawdzała się dokładnie dla mnie. Używam GIT w wersji 2.10.0.windows.1 Może to zadziałać w starszych wersjach. Otrzymuję komunikat "nieznany przełącznik" e "". W końcu zrobiłem kilka zmian i zadziałało.

Poniżej przedstawiono kroki, aby powrócić do poprzedniego stanu przed pociągnięciem:

  1. Zastosowanie git reflog aby zobaczyć listę jak wspomniano Karl.
  2. Wybierz wersję zatwierdzania z listy, do której chcesz wrócić.
  3. Execute git reset --hard <commit version>
Powiązane problemy