Git 저장소에 푸시되지 않은 커밋이 있는지 확인하는 방법

GitBeginner
지금 연습하기

소개

이 랩에서는 로컬 Git 저장소에 원격 저장소로 아직 푸시되지 않은 커밋이 있는지 확인하는 방법을 배우게 됩니다. 로컬 브랜치가 원격 브랜치보다 앞서 있는지 확인하기 위한 기본적인 git status 명령부터 시작하여 이러한 "푸시되지 않은" 커밋을 식별하는 다양한 방법을 살펴볼 것입니다.

그런 다음, 로컬에 존재하지만 업스트림 브랜치에는 없는 커밋을 구체적으로 나열하기 위해 git log @{u}..HEAD를 사용하는 방법을 배우게 됩니다. 마지막으로, 저장소 상태에 대한 포괄적인 이해를 보장하기 위해 모든 브랜치에서 상태를 확인하는 방법에 대해 간략하게 다룰 것입니다. 이 랩을 마치면 원격으로 푸시하기 전에 로컬 Git 변경 사항을 효과적으로 관리하고 추적하는 데 필요한 필수 명령을 갖추게 됩니다.

git status 로 앞선 커밋 확인

이 단계에서는 git status를 사용하여 로컬 브랜치가 원격 브랜치보다 "앞서" 있는지 확인하는 방법을 배우겠습니다. 이는 로컬에서 커밋을 했지만 아직 원격 저장소에 푸시하지 않은 경우의 일반적인 시나리오입니다.

먼저, 프로젝트 디렉토리에 있는지 확인해 보겠습니다. 터미널을 열고 my-time-machine 디렉토리로 이동합니다.

cd ~/project/my-time-machine

이제 새 파일을 만들고 내용을 추가해 보겠습니다. 결국 커밋할 변경 사항을 만드는 것을 시뮬레이션합니다.

echo "This is a new line for the future." >> message.txt

이 명령은 "This is a new line for the future." 텍스트를 이전에 생성한 message.txt 파일에 추가합니다.

다음으로, git add를 사용하여 이 변경 사항을 스테이징합니다.

git add message.txt

이제 변경 사항을 설명하는 메시지와 함께 새 커밋을 생성해 보겠습니다.

git commit -m "Add another message to the future"

새 커밋이 생성되었음을 나타내는 다음과 유사한 출력을 볼 수 있습니다.

[master a1b2c3d] Add another message to the future
 1 file changed, 1 insertion(+)

이제 로컬에 새 커밋이 있으므로 git status를 사용하여 저장소의 상태를 다시 확인해 보겠습니다.

git status

이번에는 출력이 다를 것입니다. 다음과 유사한 내용을 볼 수 있습니다.

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

"Your branch is ahead of 'origin/master' by 1 commit." 줄은 로컬 master 브랜치에 origin/master 브랜치 (브랜치의 원격 버전을 나타냄) 에 없는 커밋이 하나 있음을 알려줍니다. 이는 프로젝트에서 작업하고 다른 사람과 공유하기 전에 로컬에서 변경 사항을 만드는 경우 매우 일반적인 상황입니다.

git status를 이해하는 것은 저장소의 현재 상태를 명확하게 보여주기 때문에 중요합니다. 수정된 파일, 스테이징된 변경 사항, 로컬 브랜치가 원격 브랜치와 동기화되었는지 여부를 알려줍니다. 이를 통해 작업을 추적하고 변경 사항을 원격 저장소에 푸시할 준비를 할 수 있습니다.

git log @{u}..HEAD 사용

이전 단계에서 git status가 로컬 브랜치가 원격 브랜치보다 앞서 있다고 알려주는 것을 보았습니다. 하지만 어떤 커밋이 앞서 있는지 어떻게 알 수 있을까요? 이럴 때 git log @{u}..HEAD 명령이 유용합니다.

@\{u\} (또는 @{upstream}) 구문은 현재 브랜치가 추적하는 업스트림 브랜치를 나타냅니다. 이 경우, 업스트림 브랜치를 명시적으로 설정하지 않았으므로 Git 은 기본적으로 origin/master를 사용합니다 (여기서 origin은 원격 저장소의 이름이고 master는 브랜치 이름이라고 가정합니다). HEAD는 현재 로컬 브랜치의 최신 커밋을 나타냅니다.

따라서 @{u}..HEAD는 "현재 브랜치 (HEAD) 에 있지만 업스트림 브랜치 (@{u}) 에는 없는 커밋을 표시"한다는 의미입니다.

my-time-machine 디렉토리에서 시도해 보겠습니다.

cd ~/project/my-time-machine
git log @{u}..HEAD

다음과 유사한 출력을 볼 수 있습니다.

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Jane Doe <jane.doe@example.com>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Add another message to the future

이 출력은 이전 단계에서 방금 생성한 커밋을 보여줍니다. 이는 이 특정 커밋이 원격 브랜치보다 "앞선" 커밋임을 확인합니다.

git log @{u}..HEAD를 사용하면 원격 저장소에 푸시하려는 변경 사항을 정확히 확인할 수 있는 강력한 방법입니다. 작업을 검토하고 의도한 커밋만 푸시하는지 확인할 수 있습니다.

로그 보기를 종료하려면 q를 누르십시오.

모든 브랜치로 확인

이전 단계에서 git status를 사용하여 로컬 브랜치가 앞서 있음을 확인하고, git log @{u}..HEAD를 사용하여 앞서 있는 특정 커밋을 확인했습니다. 이제 git log --all --decorate --oneline --graph를 사용하여 모든 브랜치의 커밋 기록을 시각화하여 로컬 및 원격 브랜치 간의 관계를 이해하는 데 도움을 받겠습니다.

아직 ~/project/my-time-machine 디렉토리에 있는지 확인합니다.

cd ~/project/my-time-machine

이제 다음 명령을 실행합니다.

git log --all --decorate --oneline --graph

옵션을 자세히 살펴보겠습니다.

  • --all: 모든 브랜치의 기록을 표시합니다.
  • --decorate: 브랜치 및 태그 이름을 해당 커밋 옆에 표시합니다.
  • --oneline: 각 커밋을 한 줄에 표시합니다.
  • --graph: 출력의 왼쪽에 커밋 기록의 텍스트 기반 그래픽 표현을 그립니다.

다음과 유사한 출력을 볼 수 있습니다.

* a1b2c3d (HEAD -> master) Add another message to the future
* e4f5g6h (origin/master) Send a message to the future

이 출력에서:

  • 맨 위 줄은 "Add another message to the future" 메시지와 함께 최신 커밋 (a1b2c3d) 을 보여줍니다. (HEAD -> master)는 현재 HEAD(현재 작업 중인 위치) 와 로컬 master 브랜치가 이 커밋을 가리키고 있음을 나타냅니다.
  • 아래 줄은 "Send a message to the future" 메시지와 함께 이전 커밋 (e4f5g6h) 을 보여줍니다. (origin/master)origin/master 브랜치 (원격 추적 브랜치) 가 이 커밋을 가리키고 있음을 나타냅니다.

왼쪽의 그래프 (* 및 선) 는 로컬 master 브랜치가 origin/master 브랜치보다 한 커밋 앞서 이동했음을 시각적으로 보여줍니다. 이는 git status가 이전에 알려준 내용을 확인합니다.

이 명령은 특히 여러 브랜치가 있는 경우 저장소의 기록을 시각화하는 데 매우 유용합니다. 브랜치가 분기되고 병합되는 방식과 로컬 브랜치가 원격 브랜치와 관련하여 어디에 있는지 이해하는 데 도움이 됩니다.

로그 보기를 종료하려면 q를 누르십시오.

요약

이 랩에서는 Git 저장소에 푸시되지 않은 커밋이 있는지 확인하는 방법을 배웠습니다. 먼저 git status를 사용하여 로컬 브랜치가 원격 브랜치보다 "앞서" 있는지 확인했습니다. 여기에는 프로젝트 디렉토리로 이동하고, 새 파일을 생성하고 스테이징하고, 변경 사항을 커밋하는 작업이 포함되었습니다. 커밋 후 git status를 다시 실행하면 로컬 브랜치가 원격 브랜치보다 한 커밋 앞서 있음을 명확하게 보여주어 푸시되지 않은 변경 사항이 있음을 나타냈습니다.

이 랩은 푸시되지 않은 커밋을 식별하는 데 있어 git status의 실용적인 적용을 보여주었으며, 로컬 및 원격 저장소 간의 동기화 상태를 이해하는 데 있어 그 중요성을 강조했습니다.