Joonas' Note

Joonas' Note

All about git - 상태(status) 관리하기 본문

개발

All about git - 상태(status) 관리하기

2023. 7. 15. 15:34 joonas

    git에 대한 개념과 용어가 헷갈리시는 분들은 아래 글을 참고하면 좋다.

     

    All about git - 핵심 개념 정리

    소스코드를 저장할 개념으로 학생때부터 git과 github을 꾸준히 사용했는데, 어느덧 거의 10년차가 되었다. 그렇다보니 주변에 git 에 대한 내용을 설명하는 경우가 많았는데, 사람들이 항상 혼란스

    blog.joonas.io


    상태(status)

    git에는 파일의 상태(status)라는 개념이 있다.
    아래의 명령어를 한번이라도 본 적이 있지만 자세히 생각해본적이 없다면, 이번 글은 무척 도움이 될 것이다.

    $ git status

    이전 글에서 설명했듯이, git은 "파일이 변경된 기록"을 관리한다. 그리고 그 기록을 저장하는 단위이자 행위가 바로 커밋(commit)이다.

    commit은 실제로 "이번엔 이렇게 바꿨습니다"라고 save 버튼을 누르듯 제출을 하는 행동이다.
    저장 버튼을 누르듯이 커밋된다면 좋겠지만, 실제로는 그렇게 단순하지 않다.

    나중에 다뤄질 "충돌(conflict)"을 생각해본다면 앞으로 말할 "상태", 자세히는 스테이지(stage)라는 공간은 무척 감사하다.

    stage

    시작부터 비유를 들자면, commit은 마트에서 물건을 계산하는 것으로 볼 수 있다.
    여기서 물건은 "파일 변경들(changes)"인데, 장바구니가 없다면 어떻게 될까?
    매번 모든 물건을 집어와서 바코드를 바로 찍어야할 것이다.

    Staging area는 commit 하기 위한 파일 변경들을 관리할 수 있는 공간이다.
    이를테면 계산할 때 장바구니에서 물건 몇 개는 다음 계산으로 미룰 수 있다는 의미이다. 일종의 버퍼인 셈.

    file status life cycle 그리고 commit

    • Untracked : git으로 변경 사항이 추적되지 않는 파일들 (보통은 새로 생긴 파일)
    • Unmodified : git에서 파일의 변경을 추적하고 있지만, 이전 commit과 비교할 때 변경이 없는 상태이다.
    • Modified : 추적하고 있는 파일 중 변경이 일어난 부분을 말한다. 파일의 특정 라인이 될 수도 있다.
    • Staged : "commit" 할 때 그 커밋에 포함할 변경 사항들이다.

    git status

    실제로 git status 를 실행했을 때의 출력

    이제 git status 명령어를 입력했을 때 나오는 말들을 해석할 수 있을 것이다.

    어떤 파일이 commit 에 포함되는 지, 상태를 확인하기 위해서 git commit 명령어를 실행하기 전에 git status 를 확인하는 습관을 들이면 좋다.


    명령어 정리

    변경 추가하기

    git add

    git add 는 파일을 추가하는 것이 아니라, 파일의 "변경 사항"을 추가하는 것이다.
    즉, 특정 파일이나 내용이 삭제되는 것도 add 로 처리한다.

    그렇기때문에 위의 git status 에서 "deleted: script1.js" 과 같이 삭제된 내용도 스테이지에 올라갈 수 있는 것이다.

    변경 취소하기

    여기서 말하는 "변경 취소하기"란, 스테이지에 올렸던 변경 사항을 취소하는 것을 말한다.
    어떤 commit에서 했던 변경을 되돌리는 작업은 "revert" 이다.

    스테이지의 변경 사항을 취소하는 방법은 여러 가지가 있는데, 설명할 내용 중 하나는 git reset, 다른 하나는 git checkout 을 이용하는 방법이다.

    git reset

    git reset 은 스테이지를 특정 상태로 "재설정"하는 기능이다.
    사용법을 참고하면 꽤 고급 기능들도 제공하는데, 가장 기본적인 기능은 "git add"의 반대라고 설명하고 있다.

     

    git reset -- build/date.txt

    스테이지에 올라갔던 파일의 변경 내용을 다시 Unmodified 로 내리는 기능이다.

    그 외의 기능

    스테이지에서 내리는 게 아니라 과거의 상태로 설정하는 것도 가능하다. (알고 싶지 않다면 스킵)

    git reset <tree-ish> <path>
    # git reset 894c15 xxx.txt
    # git reset HEAD~2 xxx.txt

    위 명령어는 "xxx.txt" 파일을 894c15인 commit 에서 가져와 스테이지에 적용하겠다는 의미이다.

    git에서 직접 실행하면서 결과를 확인해보자.

    894c15 커밋 내용과 현재 파일 상태

    894c15 커밋에서는 build/date.txt 파일의 내용을 "2021-10-08..." 에서 "2023-07-14..." 로 바꾸었다.
    그렇다면 트리에서 894c15 일 때의 date.txt 파일에는 "2023-07-14..." 라고 적혀있을 것이다.

    하지만 그 뒤로 몇 번의 커밋을 거치면서, 현재 HEAD의 date.txt 는 "2023-07-15..." 인 상태이다. (위 스크린샷에서 cat 결과 확인)

    이 상태에서 git reset 을 실행해보자.

    git reset 전/후 비교

    reset은 스테이지894c15 당시의 파일 상태로 바꾸는 내용을 추가하고, Modified 에는 복구할 수 있는 그 반대 내용을 추가한다.

    스테이지에는 "2023-07-15..." → "2023-07-14..." 가 적혀있고, Modified에는 "2023-07-14..." → "2023-07-15..." 가 적혀있다.

    이 외에도 많은 기능이 있는 데, 더 자세한 내용은 공식 문서를 확인하는 것을 추천한다.

     

    Git - git-reset Documentation

    In the first three forms, copy entries from to the index. In the last form, set the current branch head (HEAD) to , optionally modifying index and working tree to match. The / defaults to HEAD in all forms. git reset [-q] [ ] [--] …​ git reset [-q] [--

    git-scm.com

    git checkout

    checkout 에는 아래의 포맷으로 명령어를 실행해서 파일 상태를 되돌릴 수 있다.

    git checkout -- build/date.txt

    "--" 뒤에 파일 이름을 붙이면 해당 파일의 상태를 HEAD 상태와 동일하게 만든다. (즉, 변경이 없었던 상태로 되돌린다.)

    git rm

    git rm 은 "파일 삭제 + 그것을 git add" 입니다. 아래와 같이 리눅스 명령어를 따로 입력해도 동일하게 동작합니다.

    rm <file> && git add <file>

    삭제된 파일은 checkout 으로 복구할 수 없습니다. 그렇기 때문에 파일을 다시 살릴려면 아래와 같이 실행해야합니다.

    git reset -- <file> && git checkout -- <file>

    참고

     

    Git - Recording Changes to the Repository

    In the simple case, a repository might have a single .gitignore file in its root directory, which applies recursively to the entire repository. However, it is also possible to have additional .gitignore files in subdirectories. The rules in these nested .g

    git-scm.com

    다음 글

     

    All about git - 충돌(conflict)과 merge/rebase 쉽게 이해하기

    git에 대한 기본적인 컨셉과 용어는 아래의 글에서 정리했다. All about git - 핵심 개념 정리 소스코드를 저장할 개념으로 학생때부터 git과 github을 꾸준히 사용했는데, 어느덧 거의 10년차가 되었다.

    blog.joonas.io

     

    Comments