조상이 아닌 커밋 테스트
이전 단계에서는 git merge-base --is-ancestor를 사용하여 이전 커밋이 동일한 브랜치의 이후 커밋의 조상임을 확인했습니다. 이제 서로의 조상이 아닌 커밋을 테스트할 때 어떤 일이 발생하는지 살펴보겠습니다.
저장소 디렉토리로 이동합니다.
cd ~/project/git-ancestor-lab
현재 세 개의 커밋이 있는 단일 브랜치 (master) 가 있습니다. 조상 관계가 아닌 것을 테스트하려면 새 브랜치를 만들고 해당 브랜치에서 커밋을 해야 합니다. 이렇게 하면 분기된 히스토리가 생성됩니다.
먼저, feature라는 새 브랜치를 만들어 보겠습니다.
git branch feature
이 명령어는 feature라는 새 브랜치 포인터를 생성하며, 이는 master와 동일한 커밋 (최신 커밋, <commit-hash-3>) 을 가리킵니다.
이제 feature 브랜치로 전환해 보겠습니다.
git checkout feature
브랜치가 전환되었음을 나타내는 출력을 보게 됩니다.
Switched to branch 'feature'
이제 feature 브랜치에 있습니다. 이 브랜치에서 새 커밋을 만들어 보겠습니다. 새 파일을 만듭니다.
echo "Feature content" > file2.txt
git add file2.txt
git commit -m "Add file2 on feature branch"
feature 브랜치에서 커밋을 확인하는 출력을 보게 됩니다.
[feature <commit-hash-4>] Add file2 on feature branch
1 file changed, 1 insertion(+)
create mode 100644 file2.txt
이제 git log --oneline --all --graph를 사용하여 히스토리를 살펴보겠습니다. --all 플래그는 모든 브랜치의 커밋을 표시하고, --graph는 커밋 히스토리의 텍스트 기반 표현을 그립니다.
git log --oneline --all --graph
출력은 분기된 히스토리를 표시합니다. 다음과 유사하게 표시될 수 있습니다 (커밋 해시는 다를 수 있습니다).
* <commit-hash-4> (HEAD -> feature) Add file2 on feature branch
* <commit-hash-3> (master) Add final content to file1
* <commit-hash-2> Add more content to file1
* <commit-hash-1> Add file1 with initial content
이 그래프에서 <commit-hash-4>는 feature 브랜치의 최신 커밋이고, <commit-hash-3>은 master 브랜치의 최신 커밋입니다. 이 두 커밋은 서로의 조상이 아닙니다. 그들은 공통 조상인 <commit-hash-3>(feature 브랜치가 생성된 커밋) 을 공유합니다.
git merge-base --is-ancestor를 사용하여 <commit-hash-4>와 <commit-hash-3> 간의 관계를 테스트해 보겠습니다. 자리 표시자를 실제 커밋 해시로 바꿉니다.
git merge-base --is-ancestor <commit-hash-4> <commit-hash-3>
echo $?
이 명령어는 <commit-hash-4>가 <commit-hash-3>의 조상인지 확인합니다. 그래프를 기반으로, 그렇지 않습니다. 따라서 명령어는 상태 1로 종료되어야 합니다.
이제 반대로 테스트해 보겠습니다. <commit-hash-3>이 <commit-hash-4>의 조상입니까?
git merge-base --is-ancestor <commit-hash-3> <commit-hash-4>
echo $?
이 명령어는 <commit-hash-3>이 <commit-hash-4>의 조상인지 확인합니다. 그래프를 보면, <commit-hash-4>의 부모는 <commit-hash-3>입니다. 따라서 <commit-hash-3>은 <commit-hash-4>의 조상입니다. 명령어는 상태 0으로 종료되어야 합니다.
이것은 git merge-base --is-ancestor를 사용하여 저장소의 히스토리에서 서로 다른 브랜치 간에도 두 커밋 간의 관계를 프로그래밍 방식으로 확인할 수 있음을 보여줍니다.