개요
- 커밋을 하기 전에 확인해야 할 기본적인 명령어 등을 확인해본다.
tracked 상태의 파일을 untracked 상태로 변경하는데, 스테이지에 등록하는 것과 반대 과정이라고 보면 된다.
stage 상태에 있는 것을 unstage 상태로 변경하려면 삭제(rm)나 리셋(reset) 명령어를 사용한다.
파일 등록 취소
- rm 명령어로 삭제 하려면, 기억해야 하는 것은
스테이지 영역에서만 등록된 파일을 삭제하려면 --cached 옵션을 함께 사용한다.
$ git rm --cached main.py
rm 'main.py'
- 캐시 목록에서 파일이 삭제가 된 이후에
git status를 실행해본다.
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: main.py
Untracked files:
(use "git add <file>..." to update what will be committed)
main.py <-- 스테이지 삭제
nothing added to commit but untracked files present (use "git add" to track)
- 사실 이 때 부터가 조금 중요하다.
deleted: main.py의 뜻은 삭제 또는 변화된 것으로 간주하기 때문에, 이 때에는 리셋 후 정리하라는 명령어이다.
$ git reset HEAD main.py ---> 리셋 시도
- 그리고 다시
status 명령어를 실행하면 정상적으로 커밋이 정리가 된다.
$ git status --> 상태 확인
On branch master
nothing to commit, working tree clean
파일 이름 변경
- 파일 이름 변경시에는
git mv old_file_name new_file_name와 같이 작업하면 된다.
- 단, 이 때 주의해야 하는 것은 파일의 경로다.
$ git mv folder/main.py folder/test.py
- 이와 같은 형태로 수정을 해줘야 한다.
- 만약,
fatal: not under version control, source=folder/main.py, destination=folder/test.py와 같은 에러가 발생을 한다면, 이 때는 새로 추가된 파일을 git add를 하지 않은 untracked 상태인 것을 재 확인한다.
git commit의 의미
commit은 크게 HEAD와 스테이지를 결합하여 새로운 객체를 만드는 것과 유사하다. 즉, 변경된 파일의 차이를 깃 저장소에 기록하는 것을 말한다.
- 그런데, 변경된 파일을 구별하려면 별도의 메시지를 같이 작성해야 하는데, 이를 커밋 메시지라고 해야 한다.
- 조금 더 쉽게 설명하면 아래와 같다.
- 제안서 작업을 하기 위해 워드파일을 만들 때, 다음과 같이 저장하는 경우가 종종 있다.
- 예) 제안서_1201.docx, 제안서_1202.docx
- 두 문서 사이에는 당연히 차이가 발생한다.
- 이 때 문서명과 서로 다름을 표시해주는 역할을 해주는 것이 메시지라고 보면 된다.
- 따라서, 커밋 메시지는 반드시 작성해야 한다.
- 이제 커밋 메시지를 남긴다.
$ git commit -m "message"
git commit후의 수정
git commit이 실행한 뒤에는 git status를 실행해보면 다음과 같다.
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
- 이 상태가 되면
git push를 하면 된다.
파일 수정
- 그런데,
git push 이후에 수정할 것이 생겼다고 가정해보자.
- 파일을 수정하면
modified 상태로 돌아가게 된다.
- 그런데, 수정하는 과정에서 파일을 잘못 수정할 수도 있다.
- 깃을 이용하면 수정한 파일을 커밋 전 마지막내용으로 쉽게 되돌릴 수 있다. 즉 이전 커밋으로 되돌리는 명령어는 다음과 같다.
- 다만, 이 때에는 커밋 이후에 작업한 수정 내역은 모두 삭제가 된다.
$ git checkout -- 수정파일 이름
$ git add 수정파일이름
$ git status
$ git commit -m "00 file updated"
git commit 취소
- 이번에는 파일 수정이 아니라, 커밋을 취소하는 방법이다.
- 그런데, 이 때에도 주의해야 하는 것은 취소한 해당파일들을
stage로 보낼 것인지, 아니면 unstage로 보낼 것인지를 결정해야 한다.
- 시나리오는 다음과 같다.
- 새로운 test.py을 만들어 1차 커밋을 한 뒤, 파일을 재 수정하여 2차 커밋을 진행한 상태이다. (물론,
git add 포함)
방법 1. stage로 돌려보내기
commit취소 후, 해당 파일들은 staged 상태로 워킹 디렉터리에 보존하는 방법이다.
$ git reset --soft HEAD^
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test.py
- 여전히
modified 된 상태이며 여전히 워킹 디렉터리 상태에 있음을 확인할 수 있다.
- 이 때에는
git add만 해준다.
방법 2. unstage로 돌려보내기
$ git reset --mixed HEAD^
$ git reset HEAD^
$ git reset HEAD~2 // 마지막 2개의 commit을 취소
- 필자는 git reset –mixed HEAD^를 사용했다.
$ git reset --mixed HEAD^
Unstaged changes after reset:
M kaggle/test.py
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.py
no changes added to commit (use "git add" and/or "git commit -a")
- 첫번째 했을 때와 조금 다른 결과값을 나오는데, 아직까지는 현재는
modified 이고 워킹 디렉터리에 보존되는 것을 확인할 수 있다.
방법 3. unstage로 돌려보내고 워킹 디렉터리에서 삭제
- 방법1과 방법2는 파일들을 삭제하지는 않지만, 다음 명령어를 이용하면 워킹 디렉터리에서 삭제하는 것이다.
$ git reset --hard HEAD^
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
- 이 때에는
modified 상태가 없다.
- 또한, 기존에 작업했던 소스코드들이 아예 사라지는 것을 확인할 수 있다.
요약
- 기본편과 마찬가지로
staged와 unstaged의 개념은 여전히 중요하다.
git commit취소하는 방법은 크게 3가지가 있지만, 방법 3을 사용하게 되면 기존 코드가 삭제되는 경향이 있으니 주의한다.
Reference