Learn Git with Bitbucket Cloud

Learn how to undo changes in Git using Bitbucket Cloud

Objective

다른 사람과 협업하는 중에 로컬 컴퓨터 및 Bitbucket Cloud 리포지토리에서 변경 내용을 실행 취소하는 방법을 알아보세요.

Mission Brief

이 자습서에서 다루는 명령: git revert, git reset, git loggit status

시간 관객 필수 조건

40분

이 자습서는 다음 git 명령을 잘 알고 있다고 가정합니다.

git clone, git commit, git pullgit push
Git이 설치되어 있습니다.
Bitbucket 계정이 있습니다.

누구나 실수를 합니다. 모든 푸시가 완벽하지는 않기 때문에 이 자습서에서는 변경 내용을 안전하게 실행 취소하기 위한 가장 일반적인 git 기능을 사용하는 데 도움이 되는 방법을 살펴봅니다.

이 자습서는 다음 git 명령을 잘 알고 있다고 가정합니다.

이러한 명령을 잘 모르시는 경우 Git와 Bitbucket Cloud 알아보기를 살펴보세요. 그런 다음, 여기로 돌아와 변경 내용을 취소하는 방법을 알아보세요. 이러한 git 명령은 Windows 또는 Unix 환경에 적용 가능합니다. 이 자습서는 파일 시스템 탐색을 설명할 때 Unix 명령줄 유틸리티를 활용합니다.

Undoing changes on your local machine

취소하려는 변경 내용이 로컬 시스템에 있고 원격 리포지토리에 푸시되지 않은 경우, 변경 내용을 실행 취소하는 데는 두 가지 기본적인 방법이 있습니다.

명령 정의

git revert

'취소' 명령으로, 기존의 실행 취소 작업과는 다릅니다. 이 명령은 커밋을 제거하는 대신, 커밋의 변경 내용을 반전하는 방법을 파악한 후 반전 콘텐츠가 있는 새 커밋을 추가합니다. 이러한 방법은 Git에서 기록이 손실되는 것을 방지하며 수정 기록의 무결성과 신뢰할 수 있는 협업에 중요한 요소입니다.

git reset

변경 내용을 실행 취소하는 다용도 git 명령입니다. git reset 명령에는 여러 가지 강력한 옵션이 있지만, 이 자습서에서는 다음과 같은 초기화 모드만 사용합니다.

  • --soft: 선택한 커밋에 대해 HEAD만 초기화합니다. 기본적으로 git checkout 과 동일하게 작동하지만, 분리된 헤드 상태를 만들지 않습니다.
  • --mixed: 기록에서 선택한 커밋에 대해 HEAD를 초기화하고, 인덱스의 변경 내용을 실행 취소합니다.
  • --hard: 기록에서 선택한 커밋에 대해 HEAD를 초기화하고, 인덱스의 변경 내용을 실행 취소하고, 작업 디렉터리의 변경 내용을 실행 취소합니다. 이 자습서에서는 hard 초기화를 테스트하지 않습니다.

git reset의 작동 방식에 대한 전체 설명은 git-scm.com의 Git 도구 - 초기화 이해하기를 확인하세요.

자습서를 진행하면서 변경 내용을 실행 취소하는 방법을 알아보며 몇 가지 다른 git 명령을 살펴볼 예정입니다. 그러면 이제 시작하겠습니다.

Fork a repository

원본의 모든 코드가 있는 고유한 리포지토리를 만드는 것부터 시작하겠습니다. 이 프로세스는 "리포지토리 포크"라고 합니다. 포크는 공유 리포지토리를 Bitbucket과 같은 타사 호스팅 서비스에서 호스팅할 때 사용하는 확장된 git 프로세스입니다.

  1. 다음 URL을 클릭하거나 입력하세요. https://bitbucket.org/atlassian/tutorial-documentation-tests/commits/all
  2. 왼쪽 사이드바에서 + 기호를 클릭한 후 이 리포지토리 포크를 선택하고, 대화 상자를 검토한 후 리포지토리 포크를 클릭합니다.
  3. 새 리포지토리의 개요로 이동하게 됩니다.
  4. + 기호를 클릭하고 이 리포지토리 복제를 선택합니다.
  5. 컴퓨터에서 이 리포지토리를 복제합니다.
  6. 복제된 리포지토리가 있는 디렉터리로 이동합니다.

이제 로컬 시스템에 코드와 기존 기록이 채워진 리포지토리가 있으므로, 이제 몇 가지 변경 내용의 실행 취소를 시작할 수 있습니다.

Find changes on your local system

실행 취소하려는 변경 내용을 찾고 참조할 수 있어야 합니다. 그러려면 Bitbucket에서 커밋 UI를 찾아보야 하며 특정한 변경 내용을 찾을 수 있는 몇 가지 명령줄 유틸리티가 있습니다.

git status

Git status는 작업 디렉터리(로컬 시스템에 리포지토리의 위치) 및 스테이징 영역(프로젝트 기록에 추가할 변경 내용 집합을 준비하는 곳)의 상태를 반환하며, 변경 내용이 있는 모든 파일과 해당 변경 내용이 스테이징 영역에 추가되었는지 표시합니다. 이제 git status를 실행하고 리포지토리의 현재 상태를 살펴보겠습니다.

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

여기서 git status의 출력을 보면 원격 마스터 브랜치의 모든 것이 최신 상태이며 커밋을 기다리는 보류 중인 변경 내용이 없다는 것을 알 수 있습니다. 다음 예시에서는 리포지토리를 편집하고 이를 보류 중인 변경 내용 상태에서 살펴볼 것입니다. 로컬 시스템의 리포지토리의 파일에 프로젝트 기록에 추가하기 위한 준비(또는 스테이지)되지 않은 변경 내용이 있다는 뜻입니다.

다음 예시를 보여주기 위해, 먼저 myquote2.html 파일을 엽니다. myquote2.html의 콘텐츠를 수정한 후, 저장하고 파일을 종료합니다. 이 상태의 리포지토리를 살펴보기 위해 git status를 다시 실행해 보겠습니다.

$ 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")
--

여기서 출력을 보면 리포지토리에 myquote2.html에 대한 보류 중인 수정 사항이 있다는 것을 알 수 있습니다. 좋은 소식이네요! 실행 취소하고 싶은 변경 내용이 위의 예시처럼 아직 스테이징 영역에 추가되지 않았다면 파일을 편집하고 계속 진행하면 됩니다. Git는 스테이징 영역에 변경 내용을 추가하고 프로젝트 기록에 커밋한 후에만 추적을 시작합니다.

이제 myquote2.html의 변경 내용을 "실행 취소"해 보겠습니다. 최소한의 변경 사항을 포함한 단순화된 예시이므로, 변경 내용을 실행 취소하기 위해 두 가지 방법을 사용할 수 있습니다. git checkout myquote2.html을 실행하면, 리포지토리는 myquote2.html을 이전에 커밋한 버전으로 복원합니다. 또는 git reset --hard를 실행할 수 있으며 전체 리포지토리는 마지막 커밋으로 되돌아갑니다.

git log

git log 명령을 사용하면 프로젝트 기록을 나열하고, 필터링하고, 특정한 변경 내용을 검색할 수 있습니다. git status를 사용하면 작업 디렉터리 및 스테이징 영역을 검사할 수 있지만, git log는 커밋된 기록만 표시합니다.

커밋된 기록의 동일한 로그는 리포지토리의 "커밋" 보기에 액세스하여 Bitbucket UI 내에서 찾을 수 있습니다. 데모 리포지토리에 대한 커밋 보기는 https://bitbucket.org/dans9190/tutorial-documentation-tests/commits/all에서 확인할 수 있습니다. 이 보기의 출력은 git log 명령줄 유틸리티의 출력과 비슷합니다. 이는 실행 취소할 커밋을 찾고 파악하는 데 사용할 수 있습니다.

다음 예시에서는 기록에서 여러 가지 내용을 볼 수 있지만, 각 변경 사항이 근본적으로 커밋이므로 이를 찾아서 실행 취소해야 합니다.

$ 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

목록에서 커밋 중 하나를 자세히 살펴보겠습니다.

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

각 커밋 메시지에는 네 가지 요소가 있습니다.

요소 설명

커밋 해시

이 특정 변경 내용을 식별하는 영숫자 문자열(SHA-1 인코딩)

작성자

변경 내용을 커밋한 사람

날짜

변경 내용이 프로젝트에 커밋된 날짜

커밋 메시지

변경 내용을 설명하는 텍스트 문자열입니다.

모범 사례 팁: 짧은 커밋 설명 메시지를 작성하면, 모두를 위한 더 조화로운 작업 리포지토리를 만드는 데 도움이 됩니다.


Locate a specific commit

대개 실행 취소하고 싶은 변경 내용은 광범위한 프로젝트 기록의 뒤쪽에 자리 잡고 있을 가능성이 큽니다. 따라서 특정 변경 내용을 찾을 때 git log를 사용하는 몇 가지 기본 작업을 알아보겠습니다.

  1. 터미널 창에서 cd(디렉터리 변경) 명령을 사용하여 로컬 리포지토리의 최상위 수준으로 이동합니다.
$ cd ~/repos/tutorial-documentation-tests/

git log --oneline 명령을 입력합니다. --oneline을 추가하면 각 커밋이 한 줄에 표시되며 터미널에서 기록을 더 많이 볼 수 있습니다.

언제든지 q 키를 눌러 커밋 로그를 종료하고 명령 프롬프트로 돌아갑니다.

다음 예시와 비슷하게 표시될 것입니다.

$ 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. q 키를 눌러 명령 프롬프트로 돌아갑니다.
  2. git log 명령이 생성한 목록에서 해시 c5826damore changes로 커밋을 찾습니다. 누군가 커밋 설명 메시지를 작성하지 않았으므로 필요한 변경 내용이 여기에 있는지 알아내야 합니다.
  3. 터미널 창의 git log 결과에서 커밋 해시 c5826da를 강조 표시하고 복사합니다.
  4. git show를 입력한 후 복사한 커밋 해시를 붙여넣거나 옮겨 쓰고 Enter 키를 누릅니다. 다음과 비슷하게 표시될 것입니다.
$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
:

하단의 프롬프트에는 변경 내용이 전부 표시될 때까지 계속해서 채워집니다. 종료하고 명령 프롬프트로 이동하려면 q를 누릅니다.

Filter the git log to find a specific commit

다음을 추가하여 git log의 출력을 필터링 및 조정할 수 있습니다.

필터 수행 작업 예시 명령 반환 결과
-

표시하는 커밋의 수를 제한

git log -10

기록에서 최근 커밋 10개

--after

--before

표시하는 커밋을 해당하는 시간 프레임으로 제한

--after "yyyy-mm-dd" --before "yyyy-mm-dd"도 사용할 수 있음

git log --after 2017-07-04

2017년 7월 4일 이후의 모든 커밋

--author="name"

이름과 일치하는 작성자의 모든 커밋을 나열함

git log --author="Alana"

이름 필드가 Alana인 모든 작성자가 만든 모든 커밋

--grep="message string"

입력한 문자열과 일치하는 커밋 메시지가 있는 모든 커밋을 반환함

git log --grep="HOT-"

메시지에 HOT- 텍스트 문자열이 있는 모든 커밋

지금까지 git log 명령을 아주 간단하게 살펴봤습니다. 명령으로 작업하는 것을 좋아하시는 경우, 고급 git log 자습서를 확인해 보세요.

Undo a change with git reset

먼저 기록에 있는 최근 커밋을 실행 취소하는 것부터 시작해 보겠습니다. 여기서는 방금 Bitbucket의 CI/CD 솔루션 파이프라인을 사용하도록 설정했지만 스크립트가 올바르지 않다는 것을 알게 되었다고 가정해 보겠습니다.

  1. 터미널 창에 git log --oneline을 입력합니다.
  2. log: 52f823c의 두 번째 커밋에 대한 커밋 해시를 복사한 후 q를 눌러 로그를 종료합니다.
  3. 터미널 창에 git reset --soft 52f823c를 입력합니다. 성공할 경우 명령은 백그라운드에서 실행됩니다. 다 됐습니다. 첫 번째 변경 내용을 실행 취소했습니다. 이제 이 작업의 결과를 확인해 보겠습니다.
  4. 터미널 창에 git status를 입력하면 커밋이 실행 취소되었으며 이제 커밋되지 않은 변경 내용임을 알 수 있습니다. 다음과 비슷하게 표시될 것입니다.
$ 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. 터미널 창에 git log --oneline을 입력합니다. 다음과 비슷하게 표시될 것입니다.
$ 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. 브랜치의 새 HEAD가 커밋 52f823c임을 알 수 있으며 원하는 바로 그 결과입니다.
  2. q를 눌러 로그를 종료합니다. 지금까지 간단한 초기화 방법을 알아보았습니다. 이제 약간 더 복잡한 작업을 할 것이므로 터미널을 열어 두시기 바랍니다.

Undo several changes with git reset

풀 리퀘스트 #6(4801b87)을 다시 작업해야 한다는 것을 알게 되었고 깔끔한 기록을 유지하고 싶어서 HEAD를 커밋 1a6a403으로 초기화하고 싶다고 가정해 보겠습니다. 이번에는 git reset 명령을 사용하겠습니다.

  1. git log --online을 입력합니다.
  2. 실행 취소하려는 변경 내용이 있는 풀 리퀘스트 #6의 바로 아래에 있는 커밋의 커밋 해시 1a6a403(Bitbucket으로 온라인에서 편집한 myquote)을 복사합니다.
  3. 터미널 창에 git reset 1a6a403을 입력합니다. 출력은 다음과 비슷하게 표시될 것입니다.
$ git reset 1a6a403
Unstaged changes after reset:
M README.md
M myquote2.html

변경 내용이 이제 커밋되지 않은 상태임을 알 수 있습니다. 프로젝트 기록 및 스테이징 영역에서 모두 일부 변경 내용을 제거했다는 의미입니다.

  1. 터미널 창에 git status를 입력합니다. 출력은 다음과 비슷하게 표시될 것입니다.

$ 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")

이제 git가 실행 취소한 첫 번째 변경 내용(bitbucket-pipelines.yml 파일)의 추적을 완전히 해제했음을 알 수 있습니다. 이것은 git reset을 호출하면 브랜치의 헤드와 git의 추적 또는 인덱스 영역에서 모두 변경 내용을 제거하기 때문입니다. 내부 프로세스는 여기서 다루기엔 약간 복잡하므로, git reset에서 자세한 내용을 읽어 보시기 바랍니다.

  1. 터미널 창에 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

이제 로그 출력을 보면 커밋 기록이 수정되었으며 커밋 1a6a403에서 시작한다는 것을 알 수 있습니다. 사용 사례와 추가 예시를 보여주기 위해 방금 실행한 초기화를 취소하고 싶다고 가정해 보겠습니다. 좀 더 생각해 본 결과, 풀 리퀘스트 #6의 콘텐츠를 유지하는 것이 좋을 것 같습니다.

Pushing resets to Bitbucket

Git resetsgit에서 제공하는 몇 가지 "실행 취소" 방법 중 하나입니다. 초기화는 일반적으로 변경 내용을 실행 취소하기 위한 '안전하지 않은' 옵션으로 간주됩니다. 초기화는 고립된 코드에서 로컬로 작업할 때는 괜찮지만, 팀원과 공유하는 경우에는 위험합니다.

초기화한 브랜치를 원격 팀과 공유하려면 '강제 푸시'를 실행해야 합니다. '강제 푸시'는 git push -f를 실행하면 시작됩니다. 강제 푸시는 푸시 시점 이후에 빌드된 브랜치의 모든 기록을 삭제합니다.

이 '안전하지 않은' 시나리오의 예시는 다음과 같습니다.

  • 개발자 A는 브랜치에서 새 기능을 개발하고 있습니다.
  • 개발자 B는 같은 브랜치에서 다른 기능을 개발하고 있습니다.
  • 개발자 B는 개발자 A 및 개발자 B가 작업을 시작하기 전의 상태로 브랜치를 초기화하기로 했습니다.
  • 개발자 B는 초기화된 브랜치를 원격 리포지토리로 강제 푸시합니다.
  • 개발자 A는 업데이트를 받기 위해 브랜치를 끌어옵니다. 끌어오는 중에 개발자 A는 강제 업데이트를 받습니다. 이로 인해 개발자 A의 로컬 브랜치가 기능 작업이 완료되기 이전의 시점으로 초기화되며 커밋을 잃게 됩니다.

Undo a git reset

지금까지 우리는 git commit SHA 해시를 git reset으로 전달했습니다. 이제 git log 출력을 보면 초기화한 커밋이 누락되어 있음을 알 수 있습니다. 이러한 커밋을 되찾으려면 어떻게 해야 할까요? Git에서는 커밋을 가리키는 모든 포인터가 분리되지 않은 이상, 커밋을 완전히 삭제하지 않습니다. 또한 git에서는 "참조 로그"라고 하는 모든 참조 이동에 대한 별도의 로그를 저장합니다. 참조 로그는 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

git reflog의 출력은 위와 비슷할 것입니다. 리포지토리에서 작업의 기록을 볼 수 있습니다. 맨 윗줄은 풀 리퀘스트 #6에 실행한 초기화에 대한 참조입니다. 이제 풀 리퀘스트 #6을 복원하기 위해 이 초기화를 초기해 보겠습니다. 이 참조 로그 출력의 두 번째 열은 리포지토리에서 수행된 수정 작업에 대한 참조 포인터를 나타냅니다. 여기서 HEAD@{0}은 이전에 실행한 초기화 명령에 대한 참조입니다. 해당 초기화 명령에 응답하고 싶지 않으므로, 리포지토리를 HEAD@{1}로 복원할 것입니다.

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

이제 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
:

여기서 리포지토리의 커밋 기록이 실험하던 이전 버전으로 복원되었음을 알 수 있습니다. 커밋 4801b87이 첫 번째 초기화 작업에서 사라진 것으로 나타났지만 복원되었음을 볼 수 있습니다. git reflog는 리포지토리의 변경 내용을 실행 취소할 수 있는 강력한 도구입니다. git reflog 페이지에서 사용법에 대해 자세하게 알아보세요.

git revert

이전의 예시에서는 git resetgit reflog를 사용하여 시간을 거슬러 올라가 실행을 취소하는 작업을 해 보았습니다. Git에는 대개 초기화보다 '더 안전한' 방법으로 간주되는 또다른 '실행 취소' 유틸리티가 있습니다. 되돌리기를 하면 지정한 커밋 변경 내용의 반전을 포함하는 새 커밋을 만듭니다. 이렇게 되돌린 커밋은 다른 개발자들과 공유할 수 있도록 원격 리포지토리에 안전하게 푸시할 수 있습니다.

다음 섹션에서는 git revert를 사용하는 방법을 살펴보겠습니다. 이전 섹션에서 이용한 예시를 계속 사용하겠습니다. 시작하려면 로그를 살펴보고 되돌릴 커밋을 찾습니다.

$ 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
:

이 예시에서는 작업할 커밋으로 최근의 커밋 1f08a70을 선택하겠습니다. 이 시나리오에서는 해당 커밋의 편집 내용을 취소한다고 가정하겠습니다. 다음을 실행합니다.

$ git revert 1f08a70

이렇게 하면 git merge 워크플로를 시작합니다. Git에서는 되돌리기에 대해 지정된 커밋의 반전 콘텐츠가 포함된 새 커밋을 만듭니다. 그런 다음, 구성된 텍스트 편집기를 열어 새 커밋 메시지를 표시합니다. 되돌리기는 이 커밋 워크플로 덕분에 더 안전한 실행 취소 옵션으로 간주됩니다. 되돌린 커밋을 만들면 실행 취소 작업이 언제 실행되었는지에 대한 커밋 기록이 분명히 남게 됩니다.

You just learned how to undo changes!

축하합니다. 자습서를 마치셨습니다! 언제든지 이 자습서로 돌아올 수 있으며, 더 자세한 내용을 알아보려면 변경 내용 취소 섹션을 확인하세요. Bitbucket을 계속 잘 사용해 주세요!