Close

git revert

git revert 명령은 '실행 취소' 유형 명령으로 간주할 수 있지만, 일반적인 실행 취소 작업은 아닙니다. 프로젝트 기록에서 커밋을 제거하는 대신, 커밋으로 인한 변경 내용을 반전하는 방법을 알아내고 새 커밋에 결과적인 반전 콘텐츠를 덧붙입니다. 이러한 방법은 Git에서 기록이 손실되는 것을 방지하며 수정 기록의 무결성과 신뢰할 수 있는 협업에 중요한 요소입니다.

되돌리기는 프로젝트 기록에서 커밋의 반전을 적용하고 싶을 때 사용해야 합니다. 예를 들어, 버그를 추적하다가 단일 커밋으로 인해 버그가 발생한 것을 발견한 경우 유용할 수 있습니다. 수동으로 들어가서 수정하고 새 스냅샷을 커밋하는 대신 git revert를 사용하면 이 모든 작업을 자동으로 수행할 수 있습니다.


작동 방식


git revert 명령은 리포지토리의 커밋 기록에 대한 변경 사항을 취소하는 데 사용됩니다. git checkoutgit reset 등의 다른 '실행 취소' 명령은 HEAD 및 브랜치 참조 포인터를 지정된 커밋으로 이동시킵니다. Git revert는 지정된 커밋도 가져오지만 git revert는 참조 포인터를 이 커밋으로 이동시키지 않습니다. 되돌리기 작업은 지정된 커밋을 가져와서 해당 커밋의 변경 사항을 반전하고 새 "되돌리기 커밋"을 만듭니다. 그러면 참조 포인터가 새 되돌리기 커밋을 가리키도록 업데이트되고 브랜치 끝에 가게 됩니다.

아래 명령줄 예를 사용하여 예시 리포지토리를 만들어 이 내용을 설명하겠습니다.

$ mkdir git_revert_test
$ cd git_revert_test/
$ git init .
Initialized empty Git repository in /git_revert_test/.git/
$ touch demo_file
$ git add demo_file
$ git commit -am"initial commit"
[main (root-commit) 299b15f] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 demo_file
$ echo "initial content" >> demo_file
$ git commit -am"add new content to demo file"
[main 3602d88] add new content to demo file
n 1 file changed, 1 insertion(+)
$ echo "prepended line content" >> demo_file
$ git commit -am"prepend content to demo file"
[main 86bb32e] prepend content to demo file
 1 file changed, 1 insertion(+)
$ git log --oneline
86bb32e prepend content to demo file
3602d88 add new content to demo file
299b15f initial commit
Git 로고
관련 자료

Git 치트 시트

Bitbucket 로고
솔루션 보기

Bitbucket Cloud에서 Git에 대해 알아보기

여기서는 새로 만든 git_revert_test 디렉터리에서 리포지토리를 초기화했습니다. demo_file 파일을 추가하고 콘텐츠를 두 번 수정한 리포지토리에 커밋을 3번 했습니다. 리포지토리 설정 절차가 끝날 때 git log를 호출하여 커밋 기록을 표시하면 총 3개의 커밋이 표시됩니다. 리포지토리가 이 상태이면 git revert를 시작할 준비가 끝납니다.

$ git revert HEAD
[main b9cd081] Revert "prepend content to demo file" 1 file changed, 1 deletion(-)

Git revert는 커밋 참조가 전달된 것으로 예상하고 커밋 참조가 없는 경우 실행되지 않습니다. 여기서는 HEAD 참조에서 전달했습니다. 이렇게 하면 최근 커밋을 되돌립니다. 커밋 3602d8815dbfa78cd37cd4d189552764b5e96c58로 되돌린 것과 동일한 동작입니다. 병합과 유사하게, 되돌리기는 새 커밋을 만듭니다. 그리고 새 커밋은 구성된 시스템 편집기를 열어 새 커밋 메시지를 표시합니다. 커밋 메시지를 입력하고 저장하면 Git이 작업을 재개합니다. 이제 git log를 사용하여 리포지토리 상태를 검사하고 이전 로그에 새 커밋이 추가된 것을 확인할 수 있습니다.

$ git log --oneline 1061e79 Revert "prepend content to demo file" 86bb32e prepend content to demo file 3602d88 add new content to demo file 299b15f initial commit

되돌리기 후 세 번째 커밋은 아직 프로젝트 기록에 남아 있습니다. git revert는 이 커밋을 삭제하는 대신 이 변경 사항을 실행 취소하는 새 커밋을 추가했습니다. 그 결과, 두 번째 커밋과 네 번째 커밋은 완전히 같은 코드베이스를 나타내고, 세 번째 커밋은 나중에 되돌리고 싶을 경우를 대비해서 계속해서 기록에 남아 있습니다.

일반적인 옵션


-e
--edit

기본 옵션이며 별도로 지정할 필요 없습니다. 이 옵션을 선택하면 구성된 시스템 편집기가 열리고 되돌리기를 커밋하기 전에 커밋 메시지를 편집하라는 메시지가 표시됩니다

--no-edit

-e 옵션을 반전합니다. 이 되돌리기는 편집기를 열지 않습니다.

-n
--no-commit

이 옵션을 전달하면 git revert가 대상 커밋을 반전시키는 새 커밋을 만들지 못합니다. 이 옵션은 새 커밋을 만드는 대신 스테이징 색인 및 작업 디렉터리에 반전 변경 사항을 추가합니다. Git이 리포지토리 상태를 관리하는 데 사용하는 다른 트리도 있습니다. 자세한 내용은 git reset 페이지를 참조하세요.

재설정 및 되돌리기 비교


git revert가 단일 커밋을 실행 취소한다는 것을 이해해야 합니다. 모든 후속 커밋을 제거하여 프로젝트의 이전 상태로 다시 "되돌리기"하는 것이 아닙니다. 실제로 Git에서는 이를 되돌리기가 아닌 재설정이라고 합니다.

다이어그램 재설정 vs 되돌리기

되돌리기는 재설정과 비교했을 때 두 가지 중요한 이점이 있습니다. 첫째, 프로젝트 기록을 변경하지 않습니다. 따라서 공유 리포지토리에 이미 게시된 커밋을 “안전하게” 작업할 수 있습니다. 공유 기록 변경이 위험한 이유에 대해 자세히 알아보려면 git reset 페이지를 참조하세요.

둘째, git revert는 임의 시점에 기록에 있는 개별 커밋을 대상으로 할 수 있지만, git reset은 현재 커밋의 반대로만 작동할 수 있습니다. 예를 들어 git reset으로 이전 커밋을 실행 취소하려면 대상 커밋 이후에 발생한 모든 커밋을 제거한 다음 후속 커밋을 모두 다시 커밋해야 합니다. 말할 필요도 없이 효과적인 실행 취소 솔루션이 아닙니다. git revert와 기타 '실행 취소' 명령의 차이점에 대한 자세한 설명은 재설정, 체크아웃, 되돌리기를 참조하세요.

요약


git revert 명령은 변경 사항을 안전하게 실행 취소할 수 있도록 도와주는 순방향 실행 취소 작업입니다. 되돌리기는 커밋 기록에서 커밋을 삭제하거나 분리하는 대신, 지정된 변경 사항을 반전시키는 새 커밋을 생성합니다. git revert는 작업 손실 측면에서 git reset보다 안전한 대안입니다. git revert의 효과를 설명하기 위해 개별 페이지에 자세한 설명서가 있는 git log, git commit, git reset 명령어를 활용했습니다.


이 문서 공유
다음 토픽

여러분께 도움을 드릴 자료를 추천합니다.

이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.

도구로 가득한 벽을 사용하여 협업하는 사람들

Bitbucket 블로그

DevOps 일러스트레이션

DevOps 학습 경로

Atlassian 전문가와 함께 하는 Demo Den 기능 데모

Bitbucket Cloud가 Atlassian Open DevOps와 작동하는 방법

DevOps 뉴스레터 신청

Thank you for signing up