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
    • 두 문서 사이에는 당연히 차이가 발생한다.
  • 이 때 문서명과 서로 다름을 표시해주는 역할을 해주는 것이 메시지라고 보면 된다.
    • 따라서, 커밋 메시지는 반드시 작성해야 한다.
  • 이제 커밋 메시지를 남긴다.
$ 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 상태가 없다.
  • 또한, 기존에 작업했던 소스코드들이 아예 사라지는 것을 확인할 수 있다.

요약

  • 기본편과 마찬가지로 stagedunstaged의 개념은 여전히 중요하다.
  • git commit취소하는 방법은 크게 3가지가 있지만, 방법 3을 사용하게 되면 기존 코드가 삭제되는 경향이 있으니 주의한다.

Reference