Learn Git with Bitbucket Cloud

Learn how to undo changes in Git using Bitbucket Cloud

Objective

Dowiedz się, jak cofać zmiany na komputerze lokalnym i w repozytorium Bitbucket Cloud w trakcie współpracy z innymi osobami.

Mission Brief

Polecenia omawiane w niniejszym samouczku: git revert, git reset, git log i git status

 

Godzina Publiczność Wymagania wstępne

40 minut

Przed skorzystaniem z niniejszego samouczka należy zapoznać się z następującymi poleceniami git:

git clone, git commit, git pull i git push
Zainstalowany system Git
    Konto Bitbucket

Każdy popełnia błędy. Nie każde wypchnięcie jest idealne, dlatego z naszego samouczka dowiesz się, jak bezpiecznie cofnąć jedną lub wiele zmian przy użyciu często używanych funkcji systemu Git.

Przed skorzystaniem z niniejszego samouczka należy zapoznać się z następującymi poleceniami Git:

Jeśli nie znasz tych poleceń, możemy Ci pomóc nauczyć się systemu Git dzięki Bitbucket Cloud. Gdy już się z nimi zapoznasz, wróć tutaj i dowiedz się, jak cofać wprowadzone zmiany. Te polecenia git mają zastosowanie w środowisku systemów Windows i Unix. W instrukcjach dotyczących poruszania się po systemie plików w niniejszym samouczku wykorzystane zostaną narzędzia wiersza polecenia systemu Unix.

Undoing changes on your local machine

Jeśli zmiana, którą chcesz cofnąć, znajduje się w systemie lokalnym i nie została jeszcze wypchnięta do zdalnego repozytorium, można ją cofnąć przy użyciu dwóch podstawowych poleceń:

Polecenie Definicja

git revert

Polecenie „cofnij”, które nie jest jednak tradycyjną operacją cofnięcia. Nie powoduje ono usunięcia commita, tylko analizuje, w jaki sposób odwrócić zmiany w commicie, a następnie dołącza nowy commit z odwrotnością zmian. Dzięki temu w systemie Git nie dochodzi do utraty historii, co jest ważne w celu zapewnienia integralności historii rewizji i niezawodnej współpracy.

git reset

Uniwersalne polecenie Git przeznaczone do cofania zmian. Polecenie git reset obsługuje szeroki zakres różnych opcji, jednak na potrzeby niniejszego samouczka będziemy korzystać wyłącznie z następujących trybów resetowania:

  • --soft: Resetuje tylko wskaźnik HEAD wybranego commita. Zasadniczo działa on tak samo, jak polecenie git checkout <nr commita>, ale nie powoduje utworzenia stanu odłączenia wskaźnika HEAD.
  • --mixed: Resetuje wskaźnik HEAD wybranego commita w historii, a jednocześnie cofa zmiany w indeksie.
  • --hard: Resetuje wskaźnik HEAD wybranego commita w historii, cofa zmiany wprowadzone w indeksie oraz zmiany w katalogu roboczym. W tym samouczku nie będziemy testowali polecenia reset z opcją hard.

Pełny opis sposobu działania polecenia git reset można znaleźć na stronie git-scm.com w artykule pt. Git Tools - Reset Demystified (Narzędzia systemu Git — prawda na temat polecenia reset).

 

W dalszej części samouczka, w ramach nauki sposobów cofania zmian, poznasz kilka innych poleceń git. Zaczynajmy.

Fork a repository

Na początku utwórzmy unikatowe repozytorium zawierające cały kod z pierwotnego repozytorium. Proces ten nazywamy „podziałem repozytorium”. Podział jest rozbudowanym procesem git, który można zastosować, gdy udostępniane repozytorium jest hostowane w zewnętrznej usłudze hostingowej, takiej jak Bitbucket.

  1. Kliknij łącze lub wpisz następujący adres URL: https://bitbucket.org/atlassian/tutorial-documentation-tests/commits/all
  2. Kliknij symbol + na lewym pasku bocznym, a następnie wybierz opcję Fork this repository (Podziel to repozytorium), zapoznaj się z treścią okna dialogowego i kliknij opcję Fork repository (Podziel repozytorium).
  3. Powinien pojawić się widok ogólny nowego repozytorium.
  4. Kliknij symbol +, a następnie wybierz opcję Clone this repository (Klonuj to repozytorium).
  5. Sklonuj repozytorium na komputerze.
  6. Przejdź do katalogu zawierającego sklonowane repozytorium.

Teraz, gdy masz już repozytorium zawierające kod oraz dotychczasową historię w systemie lokalnym, możesz przystąpić do cofania niektórych zmian.

Find changes on your local system

Musisz znaleźć zmianę, którą chcesz cofnąć, i odwołać się do niej. Można to zrobić, korzystając z funkcji przeglądania commitu w interfejsie użytkownika Bitbucket. Dostępnych jest kilka narzędzi wiersza polecenia, za pomocą których można zlokalizować konkretną zmianę.

git status

Polecenie git status zwraca stan katalogu roboczego (lokalizację repozytorium w systemie lokalnym) i przechowalni (w której przygotowujesz zestaw zmian, które mają zostać dodane do historii projektu) oraz wyświetla wszelkie pliki, w których znajdują się zmiany, wraz z informacją, czy zmiany te zostały dodane do przechowalni. Wykonajmy teraz polecenie git status i sprawdźmy bieżący stan repozytorium.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

W tym przypadku wynik działania polecenia git status pokazuje nam, że wszystko jest zaktualizowane ze zdalną gałęzią master i nie ma żadnych zmian oczekujących na zatwierdzenie. W kolejnym przykładzie wprowadzimy pewne zmiany w repozytorium i przyjrzymy się mu w stanie oczekujących zmian. Oznacza to, że w plikach znajdujących się w repozytorium w systemie lokalnym wprowadzono zmiany, które nie zostały przygotowane (ani umieszczone w przechowalni) w celu dodania ich do historii projektu.

Aby zobaczyć ten kolejny przykład, najpierw otwórz plik myquote2.html. Wprowadź dowolne modyfikacji w zawartości pliku myquote2.html, a następnie zapisz go i zamknij. Wykonajmy raz jeszcze polecenie git status, aby przyjrzeć się repozytorium w tym stanie.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
 
Changes not staged for commit:
 (use "git add <file>..." to update what will be committed)
 (use "git checkout -- <file>..." to discard changes in working directory)
 
 Modified: myquote2.html
 
no changes added to commit (use "git add" and/or "git commit -a")
--

Wyświetlony w tym przypadku wynik wskazuje, że plik myquote2.html zawiera oczekujące modyfikacje. Dobre wieści! Jeśli, jak w powyższym przykładzie, zmiana, którą chcesz cofnąć, nie została jeszcze dodana do przechowalni, wystarczy edytować plik i kontynuować pracę. System Git zaczyna śledzić zmianę dopiero, gdy zostanie ona dodana do przechowalni, a następnie zatwierdzona w historii projektu.

Teraz „cofnijmy” zmiany wprowadzone w pliku myquote2.html. Jest to przykład uproszczony, a zmiany są minimalne, dlatego mamy do dyspozycji dwie metody cofania zmian. Jeśli wykonamy polecenie git checkout myquote2.html w repozytorium przywrócona zostanie poprzednio zatwierdzona wersja pliku myquote2.html. Możemy również wykonać polecenie git reset --hard, które spowoduje przywrócenie całego repozytorium do ostatniego commita.

git log

Za pomocą polecenia git log można wyświetlić listę historii projektu, zastosować do niej filtr i wyszukać konkretne zmiany. Polecenie git status pozwala sprawdzić katalog roboczy i przechowalnię, natomiast polecenie git log jedynie wyświetla historię commitów.

Ten sam rejestr historii commitów można znaleźć w interfejsie użytkownika Bitbucket, przechodząc do widoku „commitów” repozytorium. Widok commitów dla naszego demonstracyjnego repozytorium można znaleźć pod adresem: https://bitbucket.org/dans9190/tutorial-documentation-tests/commits/all. Zawartość tego widoku będzie przypominać wynik użycia polecenia git log w narzędziu wiersza polecenia. Można wykorzystać to polecenie do wyszukiwania oraz identyfikacji commitów, które mają być cofnięte.

W poniższym przykładzie widać kilka elementów w historii, jednak każda zmiana jest w istocie commitem, który musimy znaleźć i cofnąć.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

$ git log

commit 1f08a70e28d84d5034a8076db9103f22ec2e982c
Author: Daniel Stevens <dstevens@atlassian.com>
Date:   Wed Feb 7 17:06:50 2018 +0000

    Initial Bitbucket Pipelines configuration

commit 52f823ca251a132225dd1cc18ad768de8d336e84
Author: Daniel Stevens <dstevens@atlassian.com>
Date:   Fri Sep 30 15:50:58 2016 -0700

    repeated quote to show how a change moves through the process

commit 4801b87c2147dce83f1bf31acfcffa6cb1d7e0a5
Merge: 1a6a403 3b29606
Author: Dan Stevens [Atlassian] <dstevens@atlassian.com>
Date:   Fri Jul 29 18:45:34 2016 +0000

    Merged in changes (pull request #6)

    Changes

Przyjrzyjmy się nieco bliżej jednemu z commitów na liście:

commit 52f823ca251a132225dd1cc18ad768de8d336e84
Author: Daniel Stevens <dstevens@atlassian.com>
Date:   Fri Sep 30 15:50:58 2016 -0700
 
    repeated quote to show how a change moves through the process

Jak widać, każdy komunikat dotyczący commita składa się z czterech elementów:

Element Opis

Hash commita

Ciąg znaków alfanumerycznych (zakodowanych przy użyciu algorytmu SHA-1) będący identyfikatorem tej konkretnej zmiany.

Autor

Osoba, która zatwierdziła zmianę.

Data

Data zatwierdzenia zmiany w projekcie.

Komunikat dotyczący commita

Ciąg tekstowy zawierający opis zmian.

Praktyczna porada: pisz krótkie komunikaty dotyczące commita, aby utworzyć repozytorium, którego obsługa będzie dla wszystkich bardziej harmonijna.


 

 

Locate a specific commit

Najprawdopodobniej zmiana, którą chcesz cofnąć, będzie znajdowała się gdzieś wcześniej w historii projektu, która może być dość rozbudowana. Nauczmy się zatem kilku podstawowych operacji z użyciem polecenia git log, które pozwolą wyszukać konkretną zmianę.

  1. Otwórz okno terminala i za pomocą polecenia cd (zmień katalog) przejdź do najwyższego poziomu lokalnego repozytorium.
$ cd ~/repos/tutorial-documentation-tests/

Wprowadź polecenie got log --oneline. Dodanie opcji --oneline spowoduje wyświetlenie każdego commita w jednym wierszu, dzięki czemu można przeglądać w terminalu większy fragment historii.

W dowolnej chwili możesz nacisnąć klawisz q, aby zamknąć dziennik commitów i powrócić do wiersza polecenia.

Powinna się pojawić podobna zawartość jak w poniższym przykładzie:

$ git log --oneline
1f08a70 (HEAD -> master, origin/master, origin/HEAD) Initial Bitbucket Pipelines configuration
52f823c repeated quote to show how a change moves through the process
4801b87 Merged in changes (pull request #6)
1a6a403 myquote edited online with Bitbucket
3b29606 (origin/changes) myquote2.html edited online with Bitbucket
8b236d9 myquote edited online with Bitbucket
235b9a7 testing prs
c5826da more changes
...
  1. Naciśnij klawisz q, aby powrócić do wiersza polecenia.
  2. Zlokalizuj commit z hashem c5826da i komunikatem more changes na liście wygenerowanej po wykonaniu polecenia git log. Ktoś nie dodał opisowego komunikatu dotyczącego commita, więc będziemy musieli się dowiedzieć, czy zawiera on zmiany, o które nam chodzi.
  3. Zaznacz i skopiuj hash commita c5826da z wyniku polecenia git log w oknie terminala.
  4. Wpisz git show, a następnie wklej lub przepisz skopiowany hash commita i naciśnij klawisz Enter. Widok powinien być mniej więcej następujący:
$git show c5826daeb6ee3fd89e63ce35fc9f3594fe243605
commit c5826daeb6ee3fd89e63ce35fc9f3594fe243605
Author: Daniel Stevens <dstevens@atlassian.com>
Date:   Tue Sep 8 13:50:23 2015 -0700

    more changes

diff --git a/README.md b/README.md
index bdaee88..6bb2629 100644
--- a/README.md
+++ b/README.md
@@ -11,12 +11,7 @@ This README would normally document whatever steps are necessary to get your app
 ### How do I get set up? ###

 * Summary of set up
-* Configuration
-* Dependencies
-* Database configuration
-* How to run tests
-* Deployment instructions
-* more stuff and things
:

Wiersz u dołu będzie wypełniał się treścią, aż wyświetlona zostanie cała zmiana. Naciśnij klawisz q, aby powrócić do wiersza polecenia.

Filter the git log to find a specific commit

Zawartość wyświetlaną po użyciu polecenia git log można filtrować i dostosowywać przy użyciu następujących dodatków:

Filtr Sposób działania Przykładowe polecenie Wynik działania polecenia
-<n>

Ogranicza liczbę wyświetlanych commitów.

git log -10

10 najnowszych commitów w historii.

--after

--before

Ogranicza liczbę wyświetlanych commitów do odpowiednich ram czasowych.

Można również użyć filtru --after "rrrr-mm-dd" --before "rrrr-mm-dd"

git log --after 2017-07-04

Wszystkie commity po 4 lipca 2017 r.

--author="nazwa"

Wyświetla listę wszystkich commitów, których autor pasuje do podanej nazwy.

git log --author="Alana"

Wszystkie commity wykonane przez dowolnego autora z ciągiem Alana w polu nazwy.

--grep="ciąg komunikatu"

Zwraca wszelkie commity, których komunikat pasuje do wprowadzonego ciągu.

git log --grep="HOT-"

Wszystkie commity, które zawierają ciąg tekstowy HOT- w swoich komunikatach.

 

W bardzo dużym skrócie omówiliśmy polecenie git log. Jeśli podoba Ci się praca w wierszu polecenia, prawdopodobnie zechcesz zapoznać się z zaawansowanym samouczkiem dotyczącym polecenia git log.

Undo a change with git reset

Na początek cofnijmy ostatni commit w historii. Załóżmy, że w tym przypadku właśnie włączyliśmy usługę Pipelines rozwiązania CI/CD w Bitbucket, ale skrypt nie działa, jak należy.

  1. W oknie terminala wprowadź polecenie git log --oneline.
  2. Skopiuj hash drugiego commita w dzienniku: 52f823c, a następnie naciśnij klawisz q, aby zamknąć dziennik.
  3. W oknie terminala wprowadź polecenie git reset --soft 52f823c. Jeśli wszystko przebiegło pomyślnie, to polecenie powinno zostać uruchomione w tle. To wszystko. Właśnie udało Ci się cofnąć swoją pierwszą zmianę. Przyjrzyjmy się teraz rezultatowi tej czynności.
  4. W oknie terminala wprowadź polecenie git status. Zobaczysz, że commit został cofnięty i funkcjonuje teraz jako niezatwierdzona zmiana. Widok powinien być mniej więcej następujący:
$ git status
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)
 
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
 
    new file:   bitbucket-pipelines.yml
  1. W oknie terminala wprowadź polecenie git log --oneline. Widok powinien być mniej więcej następujący:
$ git log --oneline
52f823c repeated quote to show how a change moves through the process
4801b87 Merged in changes (pull request #6)
1a6a403 myquote edited online with Bitbucket
3b29606 (origin/changes) myquote2.html edited online with Bitbucket
8b236d9 myquote edited online with Bitbucket
235b9a7 testing prs
c5826da more changes
43a87f4 remivng
d5c4c62 a few small changes
23a7476 Merged in new-feature2 (pull request #3)
5cc4e1e add a commit message
cbbb5d6 trying a thing
438f956 adding section for permissions and cleaning up some formatting
23251c1 updated snipptes.xml organization into resources. other files misc changes
3f630f8 Adding file to track changes
...
  1. Widać, że nowy wskaźnik HEAD gałęzi to commit 52f823c, czyli dokładnie to, o co nam chodziło.
  2. Naciśnij klawisz q, aby zamknąć dziennik. Nie zamykaj jeszcze terminala. Wiesz już, jak wykonać prosty reset, dlatego teraz spróbujemy czegoś nieco bardziej złożonego.

Undo several changes with git reset

Załóżmy, że właśnie zdaliśmy sobie sprawę, że pull request nr 6 (4801b87) wymaga zmian, ale chcemy zachować czystą historię. Musimy więc zresetować wskaźnik HEAD do commita 1a6a403. Tym razem użyjemy polecenia git reset.

  1. Wprowadź polecenie git log --online.
  2. Skopiuj hash commita 1a6a403 (myquote edited online with Bitbucket), czyli commita znajdującego się tuż pod pull requestem nr 6, gdyż to on zawiera zmiany, które chcemy cofnąć.
  3. W oknie terminala wprowadź polecenie git reset 1a6a403. Powinien się pojawić mniej więcej następujący widok:
$ git reset 1a6a403
Unstaged changes after reset:
M README.md
M myquote2.html

Jak widać, zmiany mają teraz stan niezatwierdzony. Oznacza to, że usunęliśmy kilka zmian zarówno z historii projektu, jak i z przechowalni.

  1. W oknie terminala wprowadź polecenie git status. Powinien się pojawić mniej więcej następujący widok:

$ git status
On branch master
Your branch is behind 'origin/master' by 6 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
 
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
    modified:   README.md
    modified:   myquote2.html
 
Untracked files:
  (use "git add <file>..." to include in what will be committed)
 
    bitbucket-pipelines.yml
 
no changes added to commit (use "git add" and/or "git commit -a")

Widać teraz, że system git w ogóle nie śledzi pierwszej cofniętej zmiany (w pliku bitbucket-pipelines.yml). Stało się tak dlatego, że polecenie git reset usuwa zmianę zarówno ze wskaźnika HEAD gałęzi, jak i z obszaru śledzenia lub indeksu systemu git. Proces, jaki realizuje to polecenie, jest nieco zbyt złożony, abyśmy mogli go tutaj omówić. Więcej informacji na ten temat można przeczytać w opisie polecenia git reset.

  1. W oknie terminala wprowadź polecenie git log --oneline.
1a6a403 myquote edited online with Bitbucket
8b236d9 myquote edited online with Bitbucket
43a87f4 remivng
d5c4c62 a few small changes
23a7476 Merged in new-feature2 (pull request #3)
5cc4e1e add a commit message
cbbb5d6 trying a thing
438f956 adding section for permissions and cleaning up some formatting
23251c1 updated snipptes.xml organization into resources. other files misc changes
3f630f8 Adding file to track changes
e52470d README.md edited online with Bitbucket
e2fad94 README.md edited online with Bitbucket
592f84f Merge branch 'master' into new-feature2 Merge branch  especially if it merges an updated upstream into a topic branch.
7d0bab8 added a line
879f965 adding to the quote file
8994332 Merged in HOT-235 (pull request #2)
b4a0b43 removed sarcastic remarks because they violate policy.
b5f5199 myquote2.html created online with Bitbucket
b851618 adding my first file
5b43509 writing and using tests

Na liście dziennika widać teraz, że historia commitów również została zmodyfikowana i rozpoczyna się od commita 1a6a403. Na potrzeby niniejszej demonstracji oraz kolejnego przykładu przyjmijmy, że chcemy teraz cofnąć reset, który wykonaliśmy przed chwilą. Być może po dłuższym namyśle doszliśmy do wniosku, że chcemy zatrzymać zawartość pull requestu nr 6.  

Pushing resets to Bitbucket

Polecenia git reset są jedną z kilku metod „cofania”, jakie oferuje system Git. Resety uważa się zasadniczo za „niezbyt bezpieczną” opcję cofania zmian. Sprawdzają się one dobrze podczas pracy w środowisku lokalnym nad wyizolowanym kodem, ale w przypadku współdzielenia pracy z innymi członkami zespołu ich użycie może być ryzykowne.

Aby udostępnić zresetowaną gałąź zdalnemu zespołowi, trzeba wykonać „wymuszone wypchnięcie”. „Wymuszone wypchnięcie” inicjuje się za pomocą polecenia git push -f. Wymuszone wypchnięcie spowoduje zniszczenie całej historii gałęzi utworzonej po wypchnięciu.

Oto przykład tego „niebezpiecznego” scenariusza:

  • Programista A pracuje na gałęzi, tworząc nową funkcję.
  • Programista B pracuje na tej samej gałęzi, tworząc odrębną funkcję.
  • Programista B decyduje się zresetować gałąź do wcześniejszego stanu z okresu, zanim programiści A i B przystąpili do pracy.
  • Programista B wymusza wypchnięcie zresetowanej gałęzi do zdalnego repozytorium.
  • Programista A pobiera gałąź, aby otrzymać wszelkie aktualizacje. W trakcie tego pobrania programista A otrzymuje wymuszoną aktualizację. W efekcie lokalna gałąź programisty A zostaje przywrócona do stanu sprzed wykonania przez obu programistów jakichkolwiek prac, przez co traci on swoje commity.

Undo a git reset

Dotychczas do polecenia git reset przekazywaliśmy w systemie Git hashe SHA commitów. Teraz po użyciu polecenia git log nie będzie widać zresetowanych commitów. Jak je odzyskać? System Git nigdy nie usuwa całkowicie commita, chyba że odłączono wszelkie elementy, które się do niego odwołują. Ponadto system Git przechowuje odrębny dziennik wszystkich ruchów związanych z referencjami nazywany „reflog”. Aby wyświetlić dziennik reflog, należy użyć polecenia git reflog.

1a6a403 HEAD@{0}: reset: moving to 1a6a403
1f08a70 HEAD@{1}: reset: moving to origin/master
1f08a70 HEAD@{2}: clone: from git@bitbucket.org:dans9190/tutorial-documentation-tests.git

Po użyciu polecenia git reflog powinien się pojawić widok zbliżony do powyższego. Można w nim prześledzić historię czynności w repozytorium. Górny wiersz zawiera odniesienie do resetu wykonanego w celu zresetowania pull requestu nr 6. Zresetujmy zatem teraz ten reset, aby przywrócić pull request nr 6. W drugiej kolumnie tego widoku dziennika reflog znajduje się element odnoszący się do czynności modyfikacji wykonanej w repozytorium. W tym przypadku HEAD@{0} jest odniesieniem do uprzednio wykonanego polecenia resetowania. Nie chcemy odpowiadać na to polecenie resetu, dlatego przywrócimy repozytorium do stanu HEAD@{1}.

$ git reset --hard HEAD@{1}
HEAD is now at 1f08a70 Initial Bitbucket Pipelines configuration

Przeanalizujmy teraz historię commitów w repozytorium za pomocą polecenia git log --oneline:

$git log --online
1f08a70 Initial Bitbucket Pipelines configuration
52f823c repeated quote to show how a change moves through the process
4801b87 Merged in changes (pull request #6)
1a6a403 myquote edited online with Bitbucket
3b29606 myquote2.html edited online with Bitbucket
8b236d9 myquote edited online with Bitbucket
235b9a7 testing prs
c5826da more changes
43a87f4 remivng
d5c4c62 a few small changes
23a7476 Merged in new-feature2 (pull request #3)
5cc4e1e add a commit message
cbbb5d6 trying a thing
438f956 adding section for permissions and cleaning up some formatting
23251c1 updated snipptes.xml organization into resources. other files misc changes
3f630f8 Adding file to track changes
e52470d README.md edited online with Bitbucket
e2fad94 README.md edited online with Bitbucket
592f84f Merge branch 'master' into new-feature2 Merge branch  especially if it merges an updated upstream into a topic branch.
7d0bab8 added a line
:

Widać tutaj, że historia commitów tego repozytorium została przywrócona do poprzedniej wersji, od której rozpoczynaliśmy eksperymentowanie. Widać, że commit 4801b87 został przywrócony, mimo że po pierwszym resecie wydawało się, iż zniknął. Polecenie git reflog to zaawansowane narzędzie cofania zmian w repozytorium. Więcej informacji na temat jego użycia można znaleźć na stronie dotyczącej polecenia git reflog.

git revert

W poprzednim zestawie przykładów wykonaliśmy trochę podróży w czasie dzięki operacjom cofania przy użyciu poleceń git reset i git reflog. System Git zawiera inne narzędzie „cofania”, które często uważa się za „bezpieczniejsze” od resetowania. Przywracanie powoduje utworzenie nowych commitów, które zawierają odwrotność zmian zawartych w określonych commitach. Takie odwrotne commity można bezpiecznie wypchnąć do zdalnych repozytoriów, udostępniając je innym programistom.

Poniższy fragment ilustruje, w jaki sposób należy korzystać z polecenia git revert. Wykorzystajmy nasz przykład z poprzedniej części. Na początek przyjrzyjmy się dziennikowi, aby wyszukać commit do przywrócenia.

$ git log --online
1f08a70 Initial Bitbucket Pipelines configuration
52f823c repeated quote to show how a change moves through the process
4801b87 Merged in changes (pull request #6)
1a6a403 myquote edited online with Bitbucket
1f08a70 Initial Bitbucket Pipelines configuration
52f823c repeated quote to show how a change moves through the process
4801b87 Merged in changes (pull request #6)
1a6a403 myquote edited online with Bitbucket
3b29606 myquote2.html edited online with Bitbucket
8b236d9 myquote edited online with Bitbucket
235b9a7 testing prs
c5826da more changes
43a87f4 remivng
d5c4c62 a few small changes
23a7476 Merged in new-feature2 (pull request #3)
5cc4e1e add a commit message
cbbb5d6 trying a thing
438f956 adding section for permissions and cleaning up some formatting
23251c1 updated snipptes.xml organization into resources. other files misc changes
3f630f8 Adding file to track changes
e52470d README.md edited online with Bitbucket
e2fad94 README.md edited online with Bitbucket
592f84f Merge branch 'master' into new-feature2 Merge branch  especially if it merges an updated upstream into a topic branch.
7d0bab8 added a line
:

Do zaprezentowania procedury wybierzmy na przykład ostatni commit 1f08a70. Na potrzeby niniejszego scenariusza załóżmy, że chcemy cofnąć zmiany wprowadzone w tym commicie. Wykonaj polecenie:

$ git revert 1f08a70

Spowoduje ono uruchomienie przepływu pracy git merge. System Git utworzy nowy commit, którego zawartość będzie odwrotnością commita wskazanego do przywrócenia. Następnie system Git otworzy skonfigurowany edytor tekstu wraz z monitem o wprowadzenie komunikatu dotyczącego nowego commita. Z uwagi na ten przepływ pracy związany z commitem, przywracanie uznaje się za bezpieczniejszą opcję cofania zmian. Utworzenie odwrotnego commita pozostawia wyraźny ślad w historii commitów, wskazując jednoznacznie, kiedy operacja cofnięcia została wykonana.

You just learned how to undo changes!

Gratulacje! Udało Ci się. Możesz w dowolnej chwili powrócić do tego samouczka lub przejść do sekcji Cofanie zmian, aby dowiedzieć się więcej. Życzymy owocnej pracy w Bitbucket!