본문 바로가기
ETC/Git

[Git] commit 내역 살펴보기

by 컴돈AI 2024. 5. 1.

목차

    git status(commit 되기 전의 상태 확인)

    • "git status"의 경우 commit 된 내역을 살펴보는 명령어가 아닌, commit 되기 전 Staging Area에 올라온 변경사항과 Staging Area에 올라오지 않은 변경사항을 확인할 때 사용하는 명령어입니다. 
    • 즉, git status는 commit 내역을 살펴보는 것이 아닌, commit을 하기 전 최근 commit 된 상태로부터 단순하게 현재 시점의 변경사항을 확인하는 명령어입니다.

    HEAD

    • "HEAD"는 여러 commit 내역들 중에서 현재 Working Directory의 상태가 어떤 commit에 있는지 표시해 주는 것입니다.
      • git으로 버전을 관리할 때는 commit이 여러 개 있을 뿐만 아니라 여러 개의 흐름(branch)으로 버전이 관리가 될 수 있습니다.
      • 따라서 현재 Working Directory가 어떤 commit으로부터 작업이 진행되는지 표시해 주기 위해 HEAD라는 표식이 있습니다.
    • 보통 HEAD는 해당 브랜치의 가장 최근 commit에 표시되어 있습니다.
      • (HEAD -> 브랜치명)
    • 간혹 HEAD가 해당 브랜치의 과거 commit에 지정될 수 있습니다. ("git checkout 해쉬값"을 통해 과거 commit으로 이동한 경우) 이러한 경우를 "detached HEAD" 상태라고 합니다.
      • "git log"를 했을 때 가장 위에 있는 커밋 해쉬값 옆에 (HEAD -> 브랜치명) 형식이 아닐 경우 해당 HEAD는 Detached HEAD 상태입니다.
        • 이 경우 git branch 결과 main 브랜치 이외의 detached HEAD 브랜치가 있는 것을 확인할 수 있습니다. 하지만 이는 실제 branch가 아닙니다. 만약 다른 브랜치로 checkout 을 진행하게 되면 detached HEAD에서 commit 한 내역들은 사라집니다.
        • 만약 detached HEAD에서 commit 했던 내역을 사라지게 하고 싶지 않다면, "git branch 새로운브랜치명"을 통해 detached HEAD에서 commit 했던 내역들 그대로 새로운 브랜치를 생성해 주면 됩니다. 이럴 경우 다른 브랜치로 checkout을 진행하더라도 해당 작업내용이 보존됩니다.
          • "git branch 새로운브랜치명" 을 하고서 "git checkout 새로운브랜치명" 까지 해줘야지 detached HEAD 상태가 아닌 새로운 브랜치의 최신 커밋(HEAD->새로운브랜치)에서 작업을 이어나갈 수 있습니다.
          • "git checkout -b 새로운브랜치명" 을 통해 한번에 브랜치를 생성하고 checkout까지 진행할 수 도 있습니다. (git branch 새로운브랜치 는 브랜치를 생성할 뿐 해당 브랜치로 이동해주지는 않습니다.)
        • 그림을 통한 이해
          • 더보기
            • HEAD가 main 브랜치의 가장 최근 commit을 가리키는 상태
            • "git checkout 과거커밋해쉬값" 을 통해 과거 commit으로 HEAD가 이동한 상태(임시 detached HEAD 브랜치가 생성됨)
            • detached HEAD에서 commit 생성
            • "git checkout main" 을 통해 다시 HEAD가 main 브랜치의 가장 최근 commit으로 이동
              • detached HEAD에서 commit 했던 내역들이 모두 사라집니다.
              • 만약 이 내역들을 복구하고 싶다면, HEAD가 가리켰던 커밋의 로그를 보여주는 "git reflog"를 통해 고아 상태가 된 커밋의 해시를 찾아 다시 체크아웃을 해주면 됩니다.
            • 참고 : detached HEAD commit 내역을 사라지게 하고 싶지 않을 경우 "git checkout -b 새로운브랜치명" 을 해주면 됩니다.
      • 만약 "git log"를 했을 때 (HEAD -> main)처럼 HEAD가 해당 브랜치를 가르킬경우 해당 HEAD는 해당 브랜치의 최신 commit을 의미합니다.
    • 참고 : 특정 commit 또는 특정 branch로 이동하기 (git checkout)
      • "git checkout"은 브랜치명으로 지정해도 되고, commit 해시 값으로 지정해도 됩니다.
        • 위처럼 "git checkout 해쉬값" 을 하게 되면 해당 해쉬값 commit으로 이동하고, detached HEAD 상태(HEAD가 해당 브랜치의 최신 commit에 있지 않은 상태)가 됩니다.
        • "git checkout 브랜치명" 을 하게 되면 해당 브랜치의 최신 commit으로 이동하게 되고, HEAD가 해당 브랜치의 가장 최근 commit을 가리킵니다. (즉, detached HEAD 상태가 아닙니다. (HEAD -> 브랜치명) )

    git log (commit 내역 확인)

    • "git log" 는 commit 된 전체 내역을 확인할 수 있습니다. (다양한 옵션을 통해 다양한 상태를 표시할 수 있습니다.)
    • 다양한 옵션
      • "git log --all"
        • --all 옵션을 사용하면 모든 브랜치에 대한 log를 보여줍니다. 만약 이 옵션을 사용하지 않으면 현재 브랜치에 대한 log만 보여줍니다.
      • "git log -[출력할 커밋 수]
        • HEAD기준 최근 n개의 커밋만 출력하고 싶을 때 사용합니다. 
        • 예시
          • "git log -2" : 최근 2개의 커밋만 출력
      • "git log -p" 또는 "git log --patch"
        • 각 커밋의 diff 결과를 보여줍니다. 즉, 코드의 변경사항을 확인할 수 있습니다.
        • 예시
          • "git log -p -2" : 최근 2개 커밋의 diff 결과를 보여줍니다.
      • "git log --oneline"
        • 커밋 아이디를 일곱 번째 값까지만 출력하고, 커밋 내역들이 한 줄로 간결하게 표현됩니다.
      • "git log --graph"
        • 커밋 내역들을 그래프 형태로 출력해줍니다. 보통 --oneline과 함께 사용하는 경우가 많습니다.
        • 예시
          • "git log --oneline --graph"

    git show (특정 commit의 상세정보 확인)

    • "git show" 특정 commit의 상세정보를 확인할 수 있습니다. 별다른 옵션을 지정하지 않으면 가장 최근 commit에 대한 상세정보를 확인합니다. 즉, 위에서 "git log -p -1"의 결과와 동일합니다. 
    • 특정 커밋의 상세 정보를 확인하고 싶다면 git show 명령어 뒤에 커밋 해시를 추가하면 됩니다.
      • "git show [커밋 해시값]"
    • n단계 이전의 커밋 정보를 출력하고 싶다면 HEAD~n을 사용하면 됩니다. (git log -p -n를 사용할 경우에는 최근 커밋부터 n단계까지 모든 커밋정보를 다 출력하게 됩니다.)
      • "git show HEAD~n"
      • 예시
        • "git show HEAD~3" : HEAD 기준 3번째 이전 커밋의 정보를 출력합니다.

    git reflog (HEAD가 가리켰던 모든 커밋 확인)

    • "git reflog" 는 HEAD가 가리켰던 모든 커밋들을 확인할 수 있습니다. 이를 통해 삭제된 커밋의 해시를 찾아 다시 체크아웃을 할 수 있습니다. 즉, 복구 용도로 사용할 수 있습니다.
    • 예를 들어 git reset --hard를 통해 이전 커밋상태로 reset 한 상태로 가정해 보겠습니다.
      • 1~5까지 커밋내역에서 2까지의 상태로 git reset --hard를 진행한 상태입니다.
        • git reset --hard 하기 전 
        • git reset --hard 2번 커밋아이디 한 상태
      • 이 상태에서 무엇인가 잘못된 것을 알고 다시 5로 돌아가고 싶습니다. 이럴 경우 git reflog를 통해 HEAD가 위치했던 commit 내역들을 확인해서 5번 커밋 해시값을 찾고 해당 해시값으로 git reset --hard를 진행하게 되면, reset 하기 이전 상태로 다시 돌아가게 됩니다. 
        • git reflog를 통해 해당 해쉬값 찾기 
        • git reset --hard 5번 커밋아이디 해주기
          • 완전히 2번 커밋으로 git reset --hard 하기 전 상태로 돌아가게 되었습니다. 

    git diff (파일 변경 사항 비교하기)

    • "git show""git log -p"를 통해서도 파일의 변경사항을 확인할 수 있었습니다. 하지만 이는 이전 커밋에 대해서만 변경사항을 확인할 수 있었습니다.
    • 이와 달리 "git diff"는 특정 커밋 2개를 지정해 주게 되면, 인접하지 않은 두 커밋 간의 파일 변경 사항을 확인할 수 있습니다
      • "git diff [변경 전 커밋 해시] [변경 후 커밋 해시]"
    • 또는 git diff는 git status처럼 Working Directory, Staging Area, 최근 커밋 간의 파일 변경사항을 확인할 수도 있습니다.
      • git status는 Working Directory나 Staging Area에서 단순하게 파일이 수정되었는지 삭제되었는지를 확인하는 명령어이지만, git diff는 좀 더 자세하게 파일의 변경사항까지 표시해 줍니다.
      • "git diff"
        • Staging Area에 파일이 존재하는 경우 (add 된 파일들이 있는 경우)
          • Working Directory  ↔️ Staging Area
        • Staging Area에 파일이 존재하지 않는 경우 (add된 파일들이 없는 경우)
          • Working Directory  ↔️ 최근 커밋
        • 예시
          • "git add."를 한 뒤에 "git diff"를 하게되면 아무런 변경사항도 없다고 뜰 것 입니다. 
            • Working Directory  ↔️ Staging Area
          • "git add ." 를 하기 전이라면 최근 커밋과 현재 Working Directory 사이의 변경사항을 비교할 것입니다.
            • Working Directory  ↔️ 최근 커밋
          • "git add ." 를 한 뒤에 Working Directory에 새로운 변경사항이 존재하는 경우
            • Working Directory  ↔️ Staging Area
      • "git diff --staged"
        • Staging Area ↔️ 최근 커밋 
        • git diff --staged는 Staging Area와 최근 커밋의 변경사항을 비교합니다.(즉, git add 된 파일들과 최근 커밋의 변경사항을 확인합니다.) 커밋하기 전에 전체적인 비교사항을 한번 확인해 볼 수 있습니다.