Skip to content
TUWLAB.com
모든 게시물에 대하여 '링크'
방식의 퍼가기만 허용합니다.
한양대학교 전자통신컴퓨터공학부
바라미
  • 159
  • 2573531
DNS Powered by DNSEver.com
일반

[GIT] 실행취소와 Commit 삭제: reflog, reset, checkout, revert

Posted 2014. 10. 23 Updated 2019. 04. 28 Views 64546 Replies 0

 

프로그램을 작성할 때 에디터가 제공해야 할 가장 중요한 기능을 세 가지 꼽는다면, 자동완성(Tab)과 복붙(Ctrl+C,V), 그리고 실행취소(Ctrl+Z)를 들 수 있습니다.

GIT에서는 개발자가 실수를 만회할 수 있도록 언제든지 작업을 취소할 수 있는 강력한 실행취소 기능을 제공합니다.

 

작업 실행취소

GIT에서 수행한 작업은 작업 History에 저장되고, 이 History를 토대로 작업 실행취소(Ctrl+Z)를 할 수 있습니다.

 

작업 내역 확인하기

가장 최근에 수행한 작업부터 순서대로 작업 History를 볼 수 있습니다.

git reflog

 

작업 실행취소하기

다음과 같이 입력하면 작업 History의 가장 최상단에 있는 1개 작업을 실행취소 합니다.

git reset HEAD@{1}

 

파일 수정 내용 초기화하기

작업을 하다가 문득 수정한 특정 파일을 초기화 하고 싶은 경우가 있을 것입니다. 이 경우 다음과 같이 입력하면 해당 파일을 HEAD 상태로 되돌립니다.

git checkout -- {되돌릴 파일 이름}

 

Commit 삭제하기 - Hard reset

이미 수행한 Commt을 삭제하기 위해서는 Reset 명령어에 --hard 옵션을 붙이면 됩니다. 예를 들어, 다음과 같이 입력하면 HEAD로부터 3개의 Commit을 삭제합니다.

git reset --hard HEAD~3

혹은, 다음과 같이 입력해도 됩니다. '^'의 갯수가 HEAD로부터 몇 개의 Commit을 삭제할 지 나타냅니다.

git reset --hard HEAD^^^

마지막 HEAD 이후 수정한 내용 (Unstaged changes)을 모두 날리고 깨끗한 상태로 돌아가려는 경우 다음 명령을 사용합니다.

git reset --hard HEAD

※ Hard reset을 하더라도 새로 추가된 Untracked file들은 삭제되지 않으며, 직접 수동으로 삭제해야 합니다.

 

샌드위치 되어 있는 특정 Commit 무력화하기 - revert

위에서 설명한 Hard reset은 HEAD부터 특정 Commit까지를 삭제를 하는 경우에만 사용할 수 있습니다. 즉, 반드시 HEAD부터만 삭제할 수 있으며, 작업 타임라인의 중간에 있는 Commit만 뽑아내어 없앨 는 없습니다.

작업 타임라인의 중간에 끼어 있는 Commit만 뽑아서 삭제하고 싶다면 Rebase 명령을 수행해서 삭제하려는 Commit을 제외하고 이후에 발생한 Commit들을 하나씩 다시 쌓는 작업을 해 줘야 하며, 이 때 Commit ID가 바뀌는 문제를 감수해야 합니다. 따라서, 이미 Push된 Commit에 대해서는 Rebase작업을 해서는 안 되며, 불가피하게 해야 할 경우에는 PM및 다른 개발자들에게 이 사실을 알린 뒤 신중하게 작업해야 합니다.

물론, Rebase이후 Forced Push를 하면 Repository의 Commit들을 모두 갈아 엎으면서 Commit을 삭제하는 소기의 목적을 달성할 수 있지만, 이는 개인 프로젝트와 같이 Commit ID가 바뀌어도 그닥 문제가 없는 제한적인 상황에서만 사용할 수 있습니다.

대개 특정 Commit의 작업을 취소하려는 경우, Rebase보다는 취소하려는 Commit의 작업 내용과 정 반대되는 새로운 Commit을 만들어 붙이는 방법(Revert)으로 Commit을 삭제한 것과 동일한 효과를 만들어 줍니다. (e.g. (+1) + (-1) = 0)

이렇게 하면 소스코드 타임라인이 다소 지저분해지기는 하지만, Rebase작업으로 인해 Commit ID가 바뀌면서 발생하는 혼란에 비하면 아주 작은 문제입니다.

git revert {무력화할 Commit ID}

이 명령을 실행하면 Commit 명령을 실행했을 때와 마찬가지로 로그를 입력하는 에디터가 나타납니다.

Revert작업은 결과적으로 보면 대상 Commit의 작업내용과 정 반대되는 작업의 새로운 Commit을 작성하는 것과 같으며, 개발자가 삭제할 Commit의 수정 사항을 일일이 반대로 편집하여 다시 Commit하는 수고를 덜어주기 위한 일종의 Commit매크로와 같습니다.

각각의 Commit은 소스코드의 상태를 저장하고 있는 것이 아니라, 이전 Commit과 비교한 변경 사항에 대한 정보를 담고 있습니다. Commit에 대한 Patch를 떠서 그 파일 내부를 열어 보면 이게 무슨 말인지 잘 이해할 수 있을 것입니다.

이와 같이 "상태가 아닌 변경 내역을 기록하는" Commit의 특성이 Revert명령을 가능하게 하는 것입니다.

 

TAG •
서비스 선택
이용중인 SNS 버튼을 클릭하여 로그인 해주세요.
SNS 계정을 통해 로그인하면 회원가입 없이 댓글을 남길 수 있습니다.
댓글
?
Powered by SocialXE

List of Articles
번호 분류 제목 글쓴이 최근 수정일 조회 수
161 Python [Django Tutorial] 6. Database 연동하기 - Model설계, Migration file TUW 2017.06.16 29398
160 Python [Django Tutorial] 5. Static 파일 사용하고 관리하기 file TUW 2017.06.16 8706
159 Python [Django Tutorial] 4. URL Config, Template 및 View의 동작에 대한 이해 file TUW 2017.06.16 8624
158 Python [Django Tutorial] 3. 프로젝트 및 App 생성, settings.py수정(DB연동, Migration), Runserver file TUW 2017.06.14 11739
157 Python [Django Tutorial] 2. 개발 환경 세팅하기 - pyenv 및 virtualenv 활용 TUW 2017.02.26 6079
156 Python [Django Tutorial] 1. 파이썬 기반 웹 프레임워크 Django에 대한 소개 2 TUW 2017.02.26 10419
155 Python VirtualEnv를 통한 Python Sandbox 개발환경 구축하기 file TUW 2017.06.02 3763
154 Python pyenv를 이용하여 여러 버전의 Python 동시에 사용하기 3 TUW 2016.07.12 14274
153 Linux 한글 입력기 나비(Nabi)에서 한/영 키가 인식되지 않는 경우 file TUW 2017.06.02 2403
152 Linux [VirtualBox] 가상머신 Windows 7 에서 Aero 기능 활성화하기 file TUW 2017.06.02 3307
151 Linux [VirtualBox] Windows 7 물리 디스크 부팅 (Raw Disk Booting or Native Booting) - 방법 1 file TUW 2017.06.14 2946
150 Linux [VirtualBox] Windows 7 물리 디스크 부팅 (Raw Disk Booting or Native Booting) - 배경 file TUW 2017.06.02 5418
149 일반 [GIT] Submodule (Nested Repository) 사용하기 file TUW 2020.08.28 10922
148 Linux [Linux] Screen 터미널 에뮬레이션 프로그램 사용하기 TUW 2015.08.19 3042
147 일반 정규식(Regular Expression)에 대한 소개와 입문, 튜토리얼 1 file TUW 2017.12.11 36240
146 Linux Intelli Backup: File system 및 Database 백업 자동화 Bash 스크립트 TUW 2017.06.14 3252
목록
Board Pagination Prev 1 2 3 4 5 6 7 ... 13 Next
/ 13

Powered by Xpress Engine / Designed by Sketchbook

sketchbook5, 스케치북5

sketchbook5, 스케치북5