Git 명령어 중급편
Page content
개요
- 커밋을 하기 전에 확인해야 할 기본적인 명령어 등을 확인해본다.
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
- 두 문서 사이에는 당연히 차이가 발생한다.
- 이 때 문서명과 서로 다름을 표시해주는 역할을 해주는 것이 메시지라고 보면 된다.
- 따라서, 커밋 메시지는 반드시 작성해야 한다.
- 이제 커밋 메시지를 남긴다.
- 커밋 메시지에 대한 내용은 다음 URL에서 확인해보자.
- 올바르게 커밋하기
$ 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로 돌려보내기
- 방법1과 동일하지만 종착지가 다른 경우이다.
$ 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
- 이호진(2020). Git 교과서. 서울: 길벗. Retreieved from https://thebook.io/080212/
- Git 도구: Reset 명확히 알고 가기, https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0#r_git_reset