소개
이 랩에서는 로컬 Git 브랜치가 해당 원격 브랜치보다 앞서 있는지 확인하는 방법을 배우겠습니다. 이는 변경 사항을 푸시하기 전에 리포지토리의 상태를 이해하는 데 필수적인 기술입니다. "ahead" 상태를 확인하기 위해 git status를 사용하고, 앞선 특정 커밋을 보기 위해 @{u}..HEAD 구문을 사용하여 git log를 사용하는 두 가지 주요 방법을 살펴보겠습니다.
실습을 통해 로컬 커밋을 시뮬레이션한 다음, 이러한 명령을 사용하여 로컬 브랜치가 원격 브랜치와 어떻게 분기되었는지 Git 이 나타내는 방식을 관찰할 것입니다. 마지막으로, 동기화된 브랜치로 이러한 방법을 테스트하여 커밋이 앞서 있지 않을 때 예상되는 출력을 확인합니다.
git status 로 Ahead 상태 확인
이 단계에서는 Git 리포지토리의 상태를 확인하는 방법을 배우고, 특히 로컬 브랜치가 원격 브랜치보다 "ahead"인지 Git 이 어떻게 알려주는지에 중점을 둡니다. 이는 로컬에서 커밋을 했지만 아직 원격 리포지토리에 푸시하지 않은 경우의 일반적인 시나리오입니다.
먼저, 프로젝트 디렉토리에 있는지 확인해 보겠습니다. 터미널을 열고 my-time-machine 디렉토리로 이동합니다.
cd ~/project/my-time-machine
이제 새 파일을 만들고 내용을 추가해 보겠습니다. 결국 커밋할 변경 사항을 시뮬레이션할 것입니다.
echo "Another message for the future" >> message.txt
이 명령은 텍스트 "Another message for the future"를 기존 message.txt 파일에 추가합니다.
다음으로, git add를 사용하여 이 변경 사항을 스테이징합니다.
git add message.txt
이제 변경 사항을 설명하는 메시지와 함께 새 커밋을 생성해 보겠습니다.
git commit -m "Add another message"
다음과 유사한 출력이 표시되어 새 커밋이 생성되었음을 나타냅니다.
[master 1a2b3c4] Add another message
1 file changed, 1 insertion(+)
훌륭합니다! 이제 로컬 master 브랜치에 새 커밋을 만들었습니다. 그러나 이 커밋은 로컬에만 존재합니다. (GitHub 또는 GitLab 과 같은) 원격 리포지토리가 있는 경우 이 커밋은 아직 거기에 없을 것입니다.
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. 줄을 주목하십시오. 이는 Git 이 로컬 master 브랜치에 origin/master 브랜치 (가상의 origin이라는 원격 리포지토리의 master 브랜치를 나타냄) 에 없는 커밋이 하나 있음을 알려주는 것입니다.
이 "ahead" 상태는 다른 사람과 공유하거나 원격으로 백업하기 위해 원격 리포지토리에 푸시해야 하는 로컬 변경 사항이 있음을 나타내는 주요 지표입니다. 이 상태를 이해하는 것은 다른 사람과 협업하고 로컬 및 원격 리포지토리를 동기화하는 데 매우 중요합니다.
git log @{u}..HEAD 를 사용하여 앞선 커밋 확인
이전 단계에서 git status가 로컬 브랜치가 원격 추적 브랜치보다 "ahead"라고 알려주는 것을 확인했습니다. 하지만 어떤 커밋이 앞서 있는지 어떻게 알 수 있을까요? Git 은 git log를 사용하여 브랜치를 비교하는 강력한 방법을 제공합니다.
구문 @{u}..HEAD는 Git 의 약식 표현입니다. @{u}는 업스트림 브랜치 (현재 브랜치가 추적하도록 구성된 원격 추적 브랜치, 예를 들어 origin/master) 를 나타내고, HEAD는 현재 로컬 브랜치의 최신 커밋을 나타냅니다. 따라서 @{u}..HEAD는 "현재 브랜치 (HEAD) 에 있지만 업스트림 브랜치 (@{u}) 에는 없는 커밋을 표시"하는 것을 의미합니다.
터미널에서 이 명령을 시도해 보겠습니다. 여전히 ~/project/my-time-machine 디렉토리에 있는지 확인하십시오.
cd ~/project/my-time-machine
git log @{u}..HEAD
이전 단계에서 방금 만든 커밋에 대한 로그 항목이 표시되어야 합니다.
commit 1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0 (HEAD -> master, origin/master)
Author: Jane Doe <jane.doe@example.com>
Date: Mon Aug 7 10:00:00 2023 +0000
Add another message
(참고: 커밋 해시 및 날짜는 출력에서 다를 수 있지만 커밋 메시지는 동일해야 합니다.)
이 명령은 원격 리포지토리에 푸시하려는 변경 사항을 정확히 확인하는 데 매우 유용합니다. 작업을 검토하고 의도한 커밋만 푸시하는지 확인하는 데 도움이 됩니다.
@{u}..HEAD 구문은 git log에 대한 Git 의 범위 표기법의 특정 예입니다. 유사한 구문을 사용하여 두 개의 커밋 또는 브랜치를 비교할 수 있습니다. 예를 들어, branch1..branch2는 branch1에 없는 branch2의 커밋을 표시합니다.
git log를 범위 표기법과 함께 사용하는 방법을 이해하면 프로젝트의 기록을 보고 리포지토리의 서로 다른 상태를 비교하는 데 세밀한 제어가 가능합니다.
로그 보기를 종료하고 명령줄로 돌아가려면 q를 누르십시오.
동기화된 브랜치로 테스트
이전 단계에서 로컬 브랜치가 원격 추적 브랜치보다 앞선 경우의 상황을 확인했습니다. 이제 로컬 브랜치가 원격 추적 브랜치와 동기화되었을 때 git status 및 git log @{u}..HEAD가 어떻게 표시되는지 살펴보겠습니다.
이 랩 환경에서는 실제 원격 리포지토리가 없으므로 방금 만든 커밋을 제거하여 동기화된 상태를 시뮬레이션할 수 있습니다. 실제 시나리오에서 동기화 상태는 로컬 커밋을 원격 리포지토리에 푸시했음을 의미합니다.
git reset을 사용하여 로컬 브랜치 포인터를 이전 커밋으로 되돌릴 수 있습니다. 실제 프로젝트에서 git reset을 사용할 때는 변경 사항이 삭제될 수 있으므로 주의하십시오! 이 랩에서는 상태를 시뮬레이션하는 것이므로 안전합니다.
~/project/my-time-machine 디렉토리에 있는지 확인하십시오.
cd ~/project/my-time-machine
이제 브랜치를 마지막 커밋 이전의 커밋으로 재설정해 보겠습니다. 현재 HEAD 이전의 커밋을 참조하기 위해 HEAD~1을 사용할 수 있습니다.
git reset --hard HEAD~1
다음과 유사한 출력이 표시되어 HEAD 가 뒤로 이동하고 작업 디렉토리가 업데이트되었음을 나타냅니다.
HEAD is now at a1b2c3d Send a message to the future
(참고: 커밋 해시는 첫 번째 커밋의 해시와 일치합니다.)
이제 로컬 브랜치를 첫 번째 커밋의 상태로 재설정했으므로 상태를 다시 확인해 보겠습니다.
git status
이번에는 출력이 브랜치가 원격 추적 브랜치와 최신 상태임을 나타내야 합니다.
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
Your branch is up to date with 'origin/master'. 메시지는 로컬 master 브랜치가 원격 추적 브랜치와 동기화되었음을 알려줍니다.
마지막으로, git log @{u}..HEAD를 다시 사용하여 앞선 커밋이 있는지 확인해 보겠습니다.
git log @{u}..HEAD
이 명령은 로컬 브랜치 (HEAD) 에 업스트림 브랜치 (@{u}) 에도 없는 커밋이 없으므로 출력을 생성하지 않아야 합니다.
이는 로컬 브랜치가 이제 원격 추적 브랜치와 동기화되었음을 확인합니다. git status의 출력을 이해하고 git log @{u}..HEAD를 사용하는 것은 Git 워크플로우를 관리하고 효과적으로 협업하는 데 필수적인 기술입니다.
요약
이 랩에서는 로컬 Git 브랜치가 해당 원격 브랜치보다 앞서 있는지 확인하는 방법을 배웠습니다. 먼저 로컬 커밋을 만들고 git status를 사용하여 "ahead" 상태 메시지를 관찰했습니다. 이 메시지는 로컬 브랜치에 아직 원격에 없는 커밋이 포함되어 있음을 나타냅니다.
또한 git log @{u}..HEAD를 사용하여 원격 추적 브랜치보다 앞선 커밋을 구체적으로 나열하여 차이점에 대한 보다 자세한 보기를 제공하는 방법을 살펴보았습니다. 마지막으로, 동기화된 브랜치로 동작을 테스트하여 원격보다 앞선 로컬 커밋이 없을 때 git status가 브랜치를 최신 상태로 보고하는지 확인했습니다.



