소개
이 랩에서는 Git 브랜치가 고아 (orphaned) 인지 확인하는 방법을 배우게 됩니다. git log 명령어를 사용하여 부모 커밋이 없는 커밋을 이해할 것입니다. 이는 저장소의 초기 커밋의 특징입니다.
또한, git branch --no-merged 명령어를 사용하여 현재 브랜치에 변경 사항이 통합되지 않은 브랜치를 식별할 것입니다. 마지막으로, 새로운 고아 브랜치를 생성하고 검사하여 이러한 개념을 테스트할 것입니다.
이 랩에서는 Git 브랜치가 고아 (orphaned) 인지 확인하는 방법을 배우게 됩니다. git log 명령어를 사용하여 부모 커밋이 없는 커밋을 이해할 것입니다. 이는 저장소의 초기 커밋의 특징입니다.
또한, git branch --no-merged 명령어를 사용하여 현재 브랜치에 변경 사항이 통합되지 않은 브랜치를 식별할 것입니다. 마지막으로, 새로운 고아 브랜치를 생성하고 검사하여 이러한 개념을 테스트할 것입니다.
이 단계에서는 git log 명령어를 더 자세히 살펴보고, 특히 부모 커밋이 없는 저장소에서 어떻게 동작하는지 살펴보겠습니다. 이는 저장소의 첫 번째 커밋의 경우입니다.
먼저, my-time-machine 디렉토리에 있는지 확인하십시오.
cd ~/project/my-time-machine
이제 --pretty=oneline 옵션과 함께 git log 명령어를 사용해 보겠습니다. 이 옵션은 각 커밋을 한 줄에 표시하여 기록을 간결하게 볼 수 있습니다. 또한 가장 최근 커밋만 표시하기 위해 --max-count=1 옵션을 추가합니다.
git log --pretty=oneline --max-count=1
다음과 유사한 출력을 볼 수 있습니다.
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master) Send a message to the future
이 출력은 커밋 해시 (긴 문자열), 브랜치 (HEAD -> master), 그리고 커밋 메시지를 보여줍니다.
이제 이 커밋의 부모를 확인해 보겠습니다. 이것이 첫 번째 커밋이므로 부모가 없습니다. git log와 함께 --no-walk=parent 옵션을 사용하여 부모 커밋을 표시하려고 시도할 수 있습니다.
git log --no-walk=parent --pretty=oneline --max-count=1
이 명령어는 출력을 생성하지 않거나, 표시할 부모 커밋이 없다는 오류 메시지를 생성할 것입니다. 이는 초기 커밋에 대한 예상된 동작입니다.
첫 번째 커밋에 부모가 없다는 것을 이해하는 것은 Git 이 어떻게 기록을 구축하는지 이해하는 데 기본입니다. 각 후속 커밋은 하나 이상의 부모를 가지며, 변경 사항의 체인을 형성합니다.
이 단계에서는 git branch 명령어와 특히 --no-merged 옵션에 대해 배우겠습니다. 이 옵션은 현재 브랜치에 아직 통합되지 않은 변경 사항이 포함된 브랜치를 식별하는 데 도움이 됩니다.
먼저, 새로운 브랜치를 생성해 보겠습니다. 브랜치를 주 타임라인 (master) 에 영향을 주지 않고 새로운 기능이나 실험을 수행할 수 있는 대체 타임라인이라고 생각하십시오.
~/project/my-time-machine 디렉토리에 있는지 확인하십시오.
cd ~/project/my-time-machine
이제 experiment라는 새 브랜치를 생성합니다.
git branch experiment
이 명령어는 새 브랜치를 생성하지만, 해당 브랜치로 전환하지는 않습니다. 여전히 master 브랜치에 있습니다.
git branch 명령어를 사용하여 저장소의 모든 브랜치를 나열해 보겠습니다.
git branch
다음과 유사한 출력을 볼 수 있습니다.
experiment
* master
별표 (*) 는 현재 있는 브랜치, 즉 master를 나타냅니다.
이제 git branch --no-merged 명령어를 사용해 보겠습니다. 이 명령어는 현재 브랜치 (master) 에 병합되지 않은 브랜치를 나열합니다.
git branch --no-merged
다음과 같은 출력을 볼 수 있습니다.
experiment
이 출력은 experiment 브랜치가 master 브랜치에 없는 변경 사항을 포함하고 있음을 알려줍니다. 이 경우, master에서 experiment 브랜치를 방금 생성했고 아직 변경 사항을 적용하지 않았기 때문에 직관적이지 않을 수 있습니다. 그러나 --no-merged 옵션은 현재 브랜치의 tip에서 도달할 수 없는 tip 커밋을 가진 브랜치를 표시하도록 설계되었습니다. 현재 experiment가 master와 동일한 커밋을 가리키지만, master가 experiment를 "병합"하지 않았기 때문에 (이 컨텍스트에서는 의미가 없음), 여전히 experiment를 나열합니다.
실제 시나리오에서는 일반적으로 새 브랜치를 생성하고, 해당 브랜치에서 몇 가지 커밋을 수행한 다음, 주 브랜치 (예: master) 에서 git branch --no-merged를 사용하여 병합할 준비가 된 기능 브랜치를 확인합니다.
이 단계에서는 새로운 "orphan" 브랜치를 생성합니다. orphan 브랜치는 이전 브랜치에서 기록이 시작되지 않는 브랜치입니다. 마치 타임머신에서 완전히 새로운 타임라인을 시작하는 것과 같습니다. 이는 문서 브랜치 또는 웹사이트의 gh-pages 브랜치와 같이 주 코드의 기록을 포함하고 싶지 않은 경우에 유용합니다.
~/project/my-time-machine 디렉토리에 있는지 확인하십시오.
cd ~/project/my-time-machine
이제 new-start라는 새로운 orphan 브랜치를 생성해 보겠습니다.
git checkout --orphan new-start
다음과 유사한 출력을 볼 수 있습니다.
Switched to a new branch 'new-start'
이제 new-start 브랜치로 전환되었습니다. master 브랜치의 파일이 작업 디렉토리에 여전히 존재한다는 것을 알 수 있습니다. 이는 git checkout --orphan이 새로운 루트 커밋을 위해 작업 디렉토리와 인덱스를 준비하지만 기존 파일을 제거하지 않기 때문입니다.
상태를 확인해 보겠습니다.
git status
다음과 유사한 내용을 볼 수 있습니다.
On branch new-start
Untracked files:
(use "git add <file>..." to include in what will be committed)
message.txt
nothing added to commit but untracked files present (use "git add" to track)
Git 은 message.txt를 추적되지 않은 파일로 인식합니다. 왜냐하면 new-start 브랜치의 기록이 master와 완전히 분리되어 있기 때문입니다.
이 orphan 브랜치에서 정말로 새롭게 시작하려면 일반적으로 이전 파일을 제거한 다음 이 브랜치에 대한 새 콘텐츠를 추가합니다. message.txt 파일을 제거해 보겠습니다.
rm message.txt
이제 상태를 다시 확인해 보겠습니다.
git status
다음과 같은 내용을 볼 수 있습니다.
On branch new-start
No commits yet
nothing to commit (create/copy files and use "git add" to track)
작업 디렉토리가 이제 깨끗해졌고, 새롭고 독립적인 타임라인에서 첫 번째 커밋을 생성할 준비가 되었습니다.
이 브랜치에 특정한 새 파일을 생성해 보겠습니다.
echo "This is a fresh start!" > readme.md
새 파일을 스테이징 영역에 추가합니다.
git add readme.md
마지막으로, new-start 브랜치에서 첫 번째 커밋을 생성합니다.
git commit -m "Initial commit for new-start branch"
다음과 유사한 출력을 볼 수 있습니다.
[new-start (root-commit) a1b2c3d] Initial commit for new-start branch
1 file changed, 1 insertion(+)
create mode 100644 readme.md
이 커밋이 master 브랜치의 첫 번째 커밋과 마찬가지로 "(root-commit)"임을 알 수 있습니다. 이는 부모가 없고 새로운 기록의 시작임을 확인합니다.
이제 이 브랜치의 로그를 살펴보겠습니다.
git log --pretty=oneline
방금 만든 단일 커밋만 볼 수 있습니다.
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> new-start) Initial commit for new-start branch
이는 new-start 브랜치가 master 브랜치와 별개로 자체적인 독립적인 기록을 가지고 있음을 보여줍니다.
이 랩에서는 Git 브랜치가 orphan 인지 확인하는 방법을 배웠습니다. 먼저, git log 명령어를 탐색하여, 특히 --no-walk=parent를 사용하여 저장소의 초기 커밋에 부모 커밋이 없는지 식별하는 방법을 살펴보았습니다. 이는 첫 번째 커밋에 부모가 없는 Git 기록의 기본 개념을 보여주었습니다.
다음으로, git branch --no-merged 명령어를 소개받았습니다. 이 명령어는 현재 브랜치에 병합되지 않은 브랜치를 나열하는 데 사용되며, orphan 이거나 통합되지 않은 변경 사항을 포함할 수 있는 브랜치를 식별하는 핵심 기술입니다. 또한 이 랩에는 새로운 orphan 브랜치를 생성하고 검사하여 이러한 개념을 테스트하는 단계도 포함되었습니다.