소개
본 랩에서는 일반적인 Git 시나리오, 즉 로컬 브랜치가 원격 저장소보다 앞서 있을 때(ahead) 이를 처리하는 방법을 학습합니다. 이러한 상황은 로컬에서 커밋을 했지만 아직 원격 저장소에 푸시(push)하지 않았을 때 발생합니다. 본 랩이 끝날 때쯤이면, 자신의 브랜치가 원격보다 앞서 있는지 식별하는 방법과 로컬 및 원격 저장소를 적절하게 동기화하는 방법을 이해하게 될 것입니다.
로컬 변경 사항 만들기
이 단계에서는 원격 저장소에 아직 푸시되지 않은 변경 사항을 로컬 저장소에 만들어 "origin보다 앞선(ahead of origin)" 시나리오를 생성합니다.
저장소 설정
먼저, 우리가 작업할 저장소를 설정해야 합니다. 시작점으로 git-playground 저장소를 사용할 것입니다. 이 랩을 완료하려면 푸시 권한이 필요하므로, 먼저 저장소를 포크(fork)해야 합니다.
저장소 포크하기
- 브라우저에서 https://github.com/labex-labs/git-playground 로 이동합니다.
- 오른쪽 상단 모서리에 있는 "Fork" 버튼을 클릭하여 저장소의 자신만의 복사본을 만듭니다.
- 포크가 완료되면 GitHub 사용자 이름을 기록해 두십시오. 다음 단계에서 필요합니다.
포크한 저장소 클론하기
이제 포크한 저장소를 로컬 머신으로 클론(clone)해 보겠습니다. YOUR_USERNAME을 실제 GitHub 사용자 이름으로 바꾸십시오:
cd ~/project
git clone https://github.com/YOUR_USERNAME/git-playground.git
cd git-playground
클론 후, 원격 저장소가 올바르게 구성되었는지 확인합니다:
git remote -v
origin 원격 저장소로 포크한 저장소가 표시되는 출력을 보게 될 것입니다:
origin https://github.com/YOUR_USERNAME/git-playground.git (fetch)
origin https://github.com/YOUR_USERNAME/git-playground.git (push)
로컬 및 원격 저장소 이해하기
Git은 분산 모델로 작동하며, 각 개발자는 로컬 머신에 저장소의 전체 복사본을 가지고 있습니다. 로컬에서 이루어진 변경 사항은 원격 저장소와 명시적으로 동기화되어야 합니다.
이제 저장소의 현재 상태를 확인해 보겠습니다:
git status
다음과 유사한 출력이 표시되어야 합니다:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
이는 로컬 저장소가 현재 원격 저장소와 동기화되었음을 의미합니다.
새 파일 생성하기
저장소에 새 파일을 만들어 보겠습니다:
echo "This is a new file for our project." > new_file.txt
파일을 생성한 후, Git의 스테이징 영역(staging area)에 추가해야 합니다:
git add new_file.txt
이제 이 파일을 로컬 저장소에 커밋(commit)합니다:
git commit -m "Add new_file.txt"
커밋이 확인되는 출력을 보게 될 것입니다:
[master 1a2b3c4] Add new_file.txt
1 file changed, 1 insertion(+)
create mode 100644 new_file.txt
브랜치 상태 확인하기
로컬 커밋을 만들었으므로, 저장소 상태를 다시 확인해 보겠습니다:
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
이 메시지는 로컬 브랜치에 아직 원격 저장소에 푸시되지 않은 커밋이 하나 있음을 나타냅니다. 이것이 바로 우리가 만들고자 했던 상황입니다. 이제 귀하의 브랜치는 "origin보다 앞서" 있습니다.
브랜치 차이점 보기
이제 로컬 브랜치가 원격 브랜치보다 앞서 있으므로, 로컬 및 원격 브랜치 간의 구체적인 차이점을 보는 방법을 살펴보겠습니다.
브랜치 참조 이해하기
Git에서 원격 브랜치는 origin/branch-name 형식으로 참조합니다. origin은 원격 저장소의 기본 이름이며, branch-name은 브랜치 이름입니다 (이 경우 master입니다).
커밋 차이점 보기
로컬 브랜치에는 있지만 원격 브랜치에는 없는 커밋을 보려면 다음 명령을 사용합니다:
git log origin/master..HEAD
출력에는 로컬 브랜치(HEAD)에는 있지만 원격 브랜치(origin/master)에는 없는 커밋이 표시됩니다:
commit 1a2b3c4d... (HEAD -> master)
Author: LabEx User <labex@example.com>
Date: ...
Add new_file.txt
파일 차이점 보기
로컬 및 원격 브랜치 간에 파일이 어떻게 다른지 보려면 다음을 사용합니다:
git diff --name-status origin/master..HEAD
출력에는 다음이 표시되어야 합니다:
A new_file.txt
이는 new_file.txt가 로컬 브랜치에 추가되었지만 원격 브랜치에는 존재하지 않음을 나타냅니다.
차이점 시각화 이해하기
실제 내용 차이를 보려면 다음을 사용할 수 있습니다:
git diff origin/master..HEAD
이것은 각 파일에 적용된 구체적인 변경 사항을 보여줍니다:
diff --git a/new_file.txt b/new_file.txt
new file mode 100644
index 0000000..3b2aed8
--- /dev/null
+++ b/new_file.txt
@@ -0,0 +1 @@
+This is a new file for our project.
이러한 명령은 로컬 브랜치에 있지만 아직 원격 저장소에 푸시되지 않은 변경 사항이 정확히 무엇인지 이해하는 데 도움이 됩니다.
원격으로 변경 사항 푸시하기
로컬 브랜치에 어떤 변경 사항이 있는지 이해했으므로, 이제 변경 사항을 푸시하여 로컬 저장소를 원격 저장소와 동기화할 차례입니다.
Git Push 이해하기
git push 명령은 로컬 커밋을 원격 저장소로 보냅니다. 푸시할 때 원격 브랜치를 로컬 브랜치와 동기화하여 두 브랜치를 동일하게 만듭니다.
변경 사항 푸시하기
로컬 커밋을 원격 저장소로 푸시하려면 다음을 사용합니다:
git push origin master
다음과 유사한 출력이 표시되어야 합니다:
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 324 bytes | 324.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/YOUR_USERNAME/git-playground.git
abcd123..1a2b3c4 master -> master
출력은 다음을 보여줍니다:
- Git이 커밋의 객체를 계산하고 압축했습니다.
- 변경 사항이 원격 저장소로 성공적으로 전송되었습니다.
- 이전 및 새 커밋 해시 식별자
- 업데이트된 브랜치 (
master -> master)
푸시 확인하기
저장소 상태를 다시 확인해 보겠습니다:
git status
이제 다음을 보게 될 것입니다:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
이는 로컬 브랜치가 이제 원격 브랜치와 동기화되었음을 확인시켜 줍니다. 두 브랜치 모두 동일한 커밋을 포함하게 되었으므로 "origin보다 앞선" 메시지는 사라졌습니다.
원격 저장소 내용 확인하기
원격 저장소의 로그를 검토하여 변경 사항이 이제 원격 저장소에 있는지 확인할 수 있습니다:
git log origin/master -1
이 명령은 원격 브랜치의 가장 최근 커밋을 보여주며, 여기에는 이제 우리의 새 파일이 포함되어야 합니다:
commit 1a2b3c4d... (HEAD -> master, origin/master)
Author: LabEx User <labex@example.com>
Date: ...
Add new_file.txt
이제 HEAD -> master와 origin/master가 모두 동일한 커밋을 가리키고 있어 두 브랜치가 동기화되었음을 확인할 수 있습니다.
원격보다 여러 커밋 앞서기 (Creating and Resolving Multiple Commits Ahead)
실제 시나리오에서는 원격 브랜치보다 여러 커밋이 앞서 있을 수 있습니다. 이 상황을 만들고 이를 해결하는 방법을 배워보겠습니다.
여러 로컬 커밋 생성하기
여러 변경 사항을 생성하고 커밋해 보겠습니다:
## Create a second file
echo "This is the second file." > second_file.txt
git add second_file.txt
git commit -m "Add second_file.txt"
## Modify the README
echo "### Additional Information" >> README.md
echo "This project demonstrates Git branch synchronization." >> README.md
git add README.md
git commit -m "Update README with additional information"
이제 상태를 확인해 보겠습니다:
git status
다음과 같이 표시되어야 합니다:
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
여러 커밋 차이점 보기
원격에는 없는 로컬 커밋이 무엇인지 확인해 보겠습니다:
git log origin/master..HEAD --oneline
두 개의 새 커밋이 표시되어야 합니다:
abcd123 Update README with additional information
efgh456 Add second_file.txt
여러 커밋 푸시하기
모든 로컬 커밋을 원격 저장소와 동기화하려면 동일한 푸시 명령을 사용합니다:
git push origin master
출력에는 두 커밋 모두 푸시되는 것이 표시됩니다:
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 574 bytes | 574.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0), pack-reused 0
To https://github.com/YOUR_USERNAME/git-playground.git
1a2b3c4..abcd123 master -> master
모든 커밋이 푸시되었는지 확인하기
상태를 다시 확인해 보겠습니다:
git status
다음과 같이 표시되어야 합니다:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
이는 모든 로컬 커밋이 원격 저장소로 성공적으로 푸시되었음을 확인시켜 줍니다.
요약
본 랩(Lab)에서는 로컬 Git 브랜치가 원격 브랜치보다 앞서 있는 상황을 처리하는 방법을 배웠습니다. 다음을 성공적으로 수행했습니다:
- 로컬 브랜치를 원격 브랜치보다 앞서게 만드는 로컬 커밋을 생성했습니다.
- Git 명령어를 사용하여 로컬 브랜치와 원격 브랜치 간의 구체적인 차이점을 확인했습니다.
- 변경 사항을 푸시하여 로컬 저장소와 원격 저장소를 동기화했습니다.
- 로컬에서 여러 커밋을 생성하고 이들을 한 번에 원격 브랜치로 푸시했습니다.
이러한 기술은 일상적인 Git 워크플로우에 필수적입니다. 로컬 및 원격 저장소를 동기화 상태로 유지하는 것은 소프트웨어 개발 프로젝트에서 효과적인 협업을 위해 매우 중요하기 때문입니다. 정기적으로 브랜치를 동기화하면 충돌을 방지하고 협업을 원활하게 하는 데 도움이 된다는 점을 기억하십시오.



