[Git 기초] Commit, Revert, Reset 하기
이번 포스팅부터는 저번에 말씀드린대로 기본적인 Git 사용을 위한 명령어들을 정리하겠습니다.
명령어들은 프로젝트의 루트 폴더의 터미널에서 실행하거나 Git Bash 등의 환경에서 이용하시면 됩니다.
우선 오늘은 Git이 추적, 관리한 내역을 등록하고 복구하는 방법을 주제로 이야기하도록 하겠습니다.
그리고 그 이전에 Git이 관리하는 영역과 파일 상태에 대해서도 간단히 정리해보도록 하겠습니다.
1. Git 폴더 생성 및 3가지 상태
먼저 프로젝트 루트 폴더의 터미널을 통해 다음 git명령어를 실행하여 파일들을 Git 관리하에 두겠습니다.
(쉽게 이야기하면 프로젝트 폴더에 .git
숨김폴더를 생성합니다.)
git init
참고로 .gitignore
파일(이름은 없고 확장자만)을 루트폴더에 생성하여 Git 관리 밖의, 커밋하지 않을
파일들을 지정할 수 있습니다. 주로 저장효율성, 특히 ‘Github’ 등의 원격저장소에 Git 내역을 공유할 때
용량을 최소화하고 호환성과 보안을 향상시키기 위해 사용됩니다.
보통 프로그램 실행시 자동 생성되는 빌드 파일이나, 각 IDE의 고유 확장자, 개별적인 보안 파일들이 해당됩니다.
(Spring Initializr로 프로젝트 생성시 따라오는 .gitignore
의 리스트를 참고하시면 좋습니다.)
다시 본론으로, Git의 관리 하에 들어간 폴더의 파일들은 working directory
, staging area
, repository
영역에 각각 차례로 (unmodified
) modified
/ staged
/ committed
라는 상태로 존재하게 됩니다.
각각의 내용은 이름에서 쉽게 유추가 가능합니다. modified
는 변경사항이(생성, 삭제포함) 생긴 상태,
staged
는 커밋을 시킬 후보로 선택된 상태 committed
는 커밋되어 변경된 스냅샷이 저장된 상태입니다.
이 때 주의할 점은 변경된modified
파일들은 바로 commit
이 가능하지 않고 반드시 add
로 staged
상태를 거쳐야 한다는 점입니다.
+) working directory
에는 새로 추가되어 아직 Git의 관리(추적tracked
)을 받지 않는 untracked
상태의
파일도 있습니다. 이 경우 add
로 staged
된 이후부터 위의 3가지(정확히는 4가지) 상태에 속하게 됩니다.
2. Commit 하기
변경된modified
상태의 파일을staged
를 거쳐repository
영역에 committed
상태로 저장하는 방법입니다.
우선 위에 말씀드린 것처럼 커밋할 파일이staging area
영역에 옮겨져 있는지 아래 명령어로 확인합니다.
git status
출력된 로그에서 Untracked files
(새로 추가된 추적되지 않은 파일) Changes not staged
(변경된 파일) 중
커밋할 파일들을 아래 add
명령어로 staged
상태로 전환합니다.
add .
add 파일명
add *.확장자
add 폴더경로/*/
add --update
.
은 working directory
전체를 의미하며 위에서 처럼 파일을 하나하나 지정하거나 확장자나 폴더를
기준으로 한번에 처리도 가능합니다. (.gitignore
를 잘 설정했다면 add .
로 한 방에 처리하면 편합니다.)
--update
는 (Untracked files
가 아닌) 추적상태의 파일들을 선택하게 해주는 옵션입니다.
만약 staged
된 파일들 중 취소하여 다시 working directory
의 영역에서만 유지하고 싶은 경우가 생기면 다음 명령어를 사용합니다.
git rm --cached 파일명
추가적으로 add
명령어로 staged
상태로 옮기기 ‘전’, 파일의 변경내역을 취소해 이전 상태로 되돌리려면
git checkout .
git checkout --파일명
으로 working directory
의 작업내역(변경내역)을 없애 버전상태로 돌릴 수 있습니다.
(그런데 작업내역이 사라지기 때문에 보통 파일을 다시 직접 수정하시는게 나으실 수 있습니다.)
이제 staging area
에 존재하는 변경사항들을 다음 명령어로 repository
영역에 저장 및 하나의 버전으로
등록할 수 있습니다. (add
이후 modified
된 부분은 다시 add
하지 않으면 commmit
에서 제외됩니다.)
git commit
git commit -m "커밋메시지"
일반적으로 -m
옵션을 통해 커밋메시지를 지정해 변경 내역을 간단히 브리핑 해줍니다.
만약 최근 커밋의 메시지를 수정할 경우 다음과 같이 --amend
옵션을 사용하시면 됩니다.
git commit --amend -m "수정메시지"
3. 되돌리기 Reset, 취소하기 Revert
Git은 커밋으로 등록된 버전을 기준으로 reset
이나 revert
명령을 통해 되돌리거나 취소가 가능합니다.
저의 경우 되돌리기와 취소하기로 각각을 표현하였는데,
reset
의 경우 되돌아간 버전 이후의 commit
내역들이 모두 취소 및 삭제되며
revert
는 선택한 버전의 변경내역만 취소되기에(삭제된 파일을 살린다거나) commit
내역이 유지됩니다.
우선 위 명령을 실행하기 위해 적용시킬 커밋 정보를 확인해야하므로 아래 명령 중 하나를 실행합니다.
git log
git reflog
git log
의 경우는 커밋해시ID
를 포함해 작성자나 날짜 커밋메시지 등 정보를 전체적으로 보여줍니다.
git reflog
의 경우 commit
, reset
, rebase
등 내역을 간소화된 커밋해시ID
와 HEAD번호
, 커밋메시지로 간단하게 보여줍니다.
이제 여기서 알게된 커밋해시ID
혹은 HEAD번호
를 이용하여 reset
이나 revert
처리를 하면 됩니다.
(커밋ID는 전체를 복붙해도 되지만 간략화된 7자리, 혹은 앞 6자리만 이용해도 됩니다.)
먼저 reset
명령은 다음과 같은 형태로 이뤄집니다.
git reset [옵션] [돌아갈커밋]
우선 reset
옵션은 reset
지점 이후 취소된 커밋내역을 처리하는 방법에 대해 지정하며 다음과 같습니다.
디폴트 옵션은 mixed
입니다.
git --soft 돌아갈커밋
git --mixed 돌아갈커밋
git --hard 돌아갈 커밋
--soft
옵션의 경우 취소된 변경(rollback
)내역을 전부 staging area
로 옮깁니다.
--mixed
옵션은 rollback
내역을 working directory
까지 옮겨 staged 상태 이전
으로 만듭니다.
--hard
는 아예 rollback
내역을 모두 삭제시켜 버립니다. (위험성이 큽니다. 특히 협업에서)
그리고 ‘돌아갈 커밋’을 지정하는 방법은 위에서 언급한 커밋해시ID
나 HEAD번호
를 사용합니다.
HEAD번호
를 사용하는 경우 최근 커밋(HEAD~1
= HEAD^
)부터 최대 뒤로 6번째까지 가능합니다.
git --hard 커밋해시ID
git --hard HEAD^
git --hard HEAD~6
reset
은 로컬환경 개인작업에서 깔끔하게 뒤로 갈 경우 편할수 있지만 위에서처럼 되돌아간 이후 내역을
모두 날리기 때문에 보통 일반적으로 revert
를 사용합니다.
특히 뒤에 나올 Github와 같은 원격저장소를 사용하게 되면 어디까지나 로컬환경에서 작용하는 reset
이
제거한 커밋내역이 원격저장소와 충돌해 push
할 수 없게 됩니다. (--force
로 가능하나 협업에서 위험↑)
revert
의 명령은 다음과 같이 간단히 실행시킵니다.
git revert 취소할커밋해시ID
그런데 당연히 생각해볼 문제로 취소시킨 부분 ‘이후의 커밋내역이 남아’있으므로 ‘다시 수정된 내역’과
충돌(conflict)
을 일으킬 수 있습니다.
4. 충돌 Conflict
Git에서 충돌(conflict)
은 이런 revert
나 뒤에 나올 merge
, rebase
, push
, pull
등 이미 커밋된 변경
사항 사이에서 병합되는 부분에 차이가 있을 경우나 히스토리 앞뒤가 맞지 않는 경우 발생합니다.
보통 Git에서 콘솔을 통해 어느 부분이 문제인지 알려주는데, 이 경우 어느 한쪽의 내용에 맞춰 수정하지 않으면 위 명령들이 수행되지 않습니다.
따라서 어느 한쪽을 채택하여 적절히 다른 한쪽을 삭제하는 등의 방법으로 맞춘뒤,
다시 add
명령 작업과 commit
작업을 수행해 수정된 내역을 커밋하면 알아서 위 명령들이 다시 수행되어 해결됩니다.
언제나 읽어주셔서 감사합니다.^^
개인 공부용 블로그입니다.
잘못된 부분에 언제든지 댓글이나 메일로 지적해주시면 감사하겠습니다.
Leave a comment