Git 에서 "Cannot Delete Branch Checked Out" 오류 해결하기

GitBeginner
지금 연습하기

소개

이 랩에서는 Git 에서 흔히 발생하는 "cannot delete branch checked out" 오류를 살펴보고, 이를 해결하기 위한 단계별 안내를 제공합니다. Git 브랜치와 브랜치 관리에 대한 이해는 깔끔하고 체계적인 저장소를 유지하는 데 필수적입니다. 이 랩을 마치면 현재 브랜치를 식별하고 Git 에서 브랜치를 안전하게 삭제하여 원활하고 효율적인 Git 워크플로우를 보장할 수 있습니다.

Git 환경 설정

이 단계에서는 이 랩을 위해 설정된 Git 저장소에 익숙해지겠습니다. 저장소 구조를 살펴보고 기존 브랜치를 알아보겠습니다.

프로젝트 디렉토리로 이동

먼저, Git 저장소가 있는 프로젝트 디렉토리로 이동해 보겠습니다.

cd ~/project/git-branch-demo

저장소 상태 확인

Git 저장소의 상태를 확인하기 위해 git status 명령을 사용할 수 있습니다.

git status

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

On branch master
nothing to commit, working tree clean

이는 현재 master 브랜치에 있으며 커밋되지 않은 변경 사항이 없음을 나타냅니다.

기존 브랜치 목록

저장소의 모든 브랜치를 나열하여 무엇을 작업하고 있는지 확인해 보겠습니다.

git branch

출력 결과는 모든 브랜치를 표시하며, 현재 체크아웃된 브랜치 옆에는 별표 (*) 가 표시됩니다.

  bugfix-branch
  feature-branch
* master

이는 저장소에 master, feature-branch, bugfix-branch의 세 개의 브랜치가 있음을 보여줍니다. 별표는 현재 master 브랜치에 있음을 나타냅니다.

브랜치 기본 사항 이해

Git 브랜치는 저장소 내의 별도 개발 라인입니다. 브랜치를 사용하면 주 코드베이스에 영향을 주지 않고 다른 기능 또는 수정 사항을 작업할 수 있습니다. 브랜치에 대한 몇 가지 주요 사항은 다음과 같습니다.

  • 각 브랜치는 저장소의 특정 커밋을 가리킵니다.
  • 기본 브랜치는 일반적으로 master (또는 최신 저장소에서는 main) 라고 합니다.
  • 브랜치를 생성, 전환, 병합 및 삭제할 수 있습니다.
  • 브랜치는 가볍고 관리하기 쉽습니다.

이제 저장소 구조와 기존 브랜치를 이해했으므로 다음 단계에서 이러한 브랜치를 관리하는 방법을 살펴볼 준비가 되었습니다.

브랜치 생성 및 전환

이 단계에서는 새 브랜치를 생성하고, 브랜치 간을 전환하며, Git 이 현재 체크아웃된 브랜치를 추적하는 방법을 배우겠습니다.

새 브랜치 생성

가상의 기능에 대해 작업하기 위해 새 브랜치를 생성해 보겠습니다.

git branch new-feature

이 명령은 new-feature라는 새 브랜치를 생성하지만, 해당 브랜치로 전환하지는 않습니다. 브랜치가 생성되었는지 확인해 보겠습니다.

git branch

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

  bugfix-branch
  feature-branch
* master
  new-feature

새 브랜치가 생성되었지만, 별표로 표시된 것처럼 여전히 master 브랜치에 있습니다.

다른 브랜치로 전환

새 브랜치로 전환하려면 git checkout 명령을 사용합니다.

git checkout new-feature

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

Switched to branch 'new-feature'

브랜치가 전환되었는지 확인하기 위해 다음을 실행해 보겠습니다.

git branch

이제 출력 결과는 다음과 같아야 합니다.

  bugfix-branch
  feature-branch
  master
* new-feature

별표가 new-feature로 이동하여 현재 브랜치임을 나타냅니다.

브랜치에서 변경 사항 만들기

브랜치가 어떻게 작동하는지 보여주기 위해 간단한 변경을 해보겠습니다.

echo "This is a new feature" > feature.txt
git add feature.txt
git commit -m "Add feature description"

커밋 명령의 출력은 다음과 유사해야 합니다.

[new-feature xxxxxxx] Add feature description
 1 file changed, 1 insertion(+)
 create mode 100644 feature.txt

HEAD 포인터 이해

Git 은 현재 작업 중인 브랜치 또는 커밋을 추적하기 위해 HEAD라는 특수한 포인터를 사용합니다. HEAD가 어떤 브랜치를 가리키는지 확인할 수 있습니다.

git symbolic-ref HEAD

이것은 다음을 출력해야 합니다.

refs/heads/new-feature

이는 HEAD가 현재 new-feature 브랜치를 가리키고 있음을 나타냅니다.

이제 브랜치를 생성하고 전환하는 방법을 이해했으므로, 다음 단계에서는 현재 체크아웃된 브랜치를 삭제하려고 할 때 어떤 일이 발생하는지 살펴보겠습니다.

"Cannot Delete Branch Checked Out" 오류 이해

이 단계에서는 "Cannot delete branch checked out" 오류를 의도적으로 발생시켜 왜 발생하는지, 그리고 Git 이 현재 사용 중인 브랜치를 삭제하는 것을 어떻게 보호하는지 이해해 보겠습니다.

현재 브랜치 삭제 시도

현재 사용 중인 브랜치 (new-feature) 를 삭제해 보겠습니다.

git branch -d new-feature

다음과 유사한 오류 메시지가 표시됩니다.

error: Cannot delete branch 'new-feature' checked out at '/home/labex/project/git-branch-demo'

이 오류는 Git 이 현재 사용 중인 브랜치를 삭제하는 것을 방지하기 때문에 발생합니다. 그 이유는 간단합니다. 작업 중인 브랜치를 삭제하면 Git 은 작업 디렉토리를 어떤 브랜치와 연결해야 할지 알 수 없게 되어 혼란과 잠재적인 작업 손실을 초래할 수 있습니다.

이 오류가 발생하는 이유

Git 에서 브랜치를 체크아웃하면 다음과 같은 몇 가지 일이 발생합니다.

  1. Git 은 해당 브랜치의 상태와 일치하도록 작업 디렉토리를 업데이트합니다.
  2. HEAD 포인터가 해당 브랜치를 가리키도록 업데이트됩니다.
  3. 작업 디렉토리가 해당 브랜치와 연결됩니다.

현재 사용 중인 브랜치를 삭제하면 다음과 같은 문제가 발생합니다.

  • HEAD 포인터가 존재하지 않는 브랜치를 가리키게 됩니다.
  • 변경 사항이 어떤 브랜치와도 연결되지 않습니다.
  • 작업 내용을 추적하지 못할 수 있습니다.

이러한 이유로 Git 은 현재 사용 중인 브랜치를 삭제하는 것을 방지합니다.

현재 브랜치 상태 보기

현재 사용 중인 브랜치와 변경 사항을 다시 확인하기 위해 다음을 사용해 보겠습니다.

git status

출력 결과는 다음과 유사해야 합니다.

On branch new-feature
nothing to commit, working tree clean

이는 우리가 new-feature 브랜치에 있음을 확인합니다. 이 브랜치를 삭제하려면 먼저 다른 브랜치로 전환해야 하며, 다음 단계에서 이를 수행합니다.

"Cannot Delete Branch Checked Out" 오류 해결

체크아웃된 브랜치를 삭제할 수 없는 이유를 이해했으므로, 먼저 다른 브랜치로 전환하여 브랜치를 올바르게 삭제하는 방법을 배우겠습니다.

다른 브랜치로 전환

new-feature 브랜치를 삭제하기 전에 다른 브랜치로 전환해야 합니다. master 브랜치로 다시 전환해 보겠습니다.

git checkout master

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

Switched to branch 'master'

이제 master 브랜치에 있는지 확인해 보겠습니다.

git branch

출력 결과는 다음과 같아야 합니다.

  bugfix-branch
  feature-branch
* master
  new-feature

별표가 이제 master 옆에 있어 현재 브랜치임을 나타냅니다.

브랜치 안전하게 삭제

이제 다른 브랜치에 있으므로 new-feature 브랜치를 안전하게 삭제할 수 있습니다.

git branch -d new-feature

브랜치에 병합되지 않은 변경 사항이 있는 경우 Git 은 다음과 같은 메시지와 함께 삭제를 방지할 수 있습니다.

error: The branch 'new-feature' is not fully merged.
If you are sure you want to delete it, run 'git branch -D new-feature'.

이것은 Git 의 또 다른 안전 기능입니다. -d 플래그는 완전히 병합된 브랜치만 삭제하는 반면, -D는 병합 상태에 관계없이 강제로 삭제합니다. master에 병합되지 않은 변경 사항을 new-feature 브랜치에서 만들었으므로 -D 플래그를 사용해야 합니다.

git branch -D new-feature

삭제를 확인하는 출력을 볼 수 있습니다.

Deleted branch new-feature (was xxxxxxx).

브랜치 삭제 확인

브랜치가 삭제되었는지 확인해 보겠습니다.

git branch

이제 출력 결과는 다음과 같아야 합니다.

  bugfix-branch
  feature-branch
* master

new-feature 브랜치가 더 이상 나열되지 않아 성공적으로 삭제되었음을 확인합니다.

브랜치 삭제 이해

Git 에서 브랜치를 삭제하면 일련의 커밋에 대한 포인터만 삭제하는 것입니다. 커밋 자체는 가비지 수집이 실행될 때까지 Git 저장소에 남아 있습니다. 즉,

  • 실수로 브랜치를 삭제한 경우, 종종 복구할 수 있습니다.
  • 브랜치를 삭제해도 해당 브랜치에서 수행된 작업이 삭제되지 않습니다.
  • 브랜치 삭제는 주로 정리 및 저장소 정리에 관한 것입니다.

브랜치를 올바르게 삭제하는 방법을 배우면 깨끗한 Git 저장소를 유지하고 "Cannot delete branch checked out" 오류를 방지할 수 있습니다.

브랜치 관리 모범 사례

이 마지막 단계에서는 Git 에서 브랜치를 관리하기 위한 몇 가지 모범 사례를 살펴보고, 저장소를 깨끗하고 체계적으로 유지하는 방법을 포함합니다.

브랜치 명명 규칙

일관된 브랜치 명명 규칙을 채택하면 팀의 모든 구성원이 각 브랜치의 목적을 이해하는 데 도움이 됩니다. 몇 가지 일반적인 패턴은 다음과 같습니다.

  • feature/feature-name - 새로운 기능
  • bugfix/issue-description - 버그 수정
  • hotfix/issue-description - 프로덕션에 대한 중요한 수정 사항
  • release/version-number - 릴리스 준비

적절하게 명명된 기능 브랜치를 만들어 보겠습니다.

git checkout -b feature/user-authentication

checkout -b 명령은 새 브랜치를 생성하고 한 단계에서 해당 브랜치로 전환합니다. 다음을 볼 수 있습니다.

Switched to a new branch 'feature/user-authentication'

저장소 깨끗하게 유지

병합되고 오래된 브랜치를 정기적으로 정리하면 저장소를 체계적으로 유지하는 데 도움이 됩니다. 삭제할 수 있는 브랜치를 식별하는 방법은 다음과 같습니다.

현재 브랜치에 병합된 브랜치를 나열하려면:

git branch --merged

이것은 -d 플래그로 안전하게 삭제할 수 있는 브랜치를 보여줍니다.

병합되지 않은 브랜치를 나열하려면:

git branch --no-merged

이러한 브랜치는 손실될 수 있는 작업이 포함될 수 있으므로 삭제하려면 -D 플래그가 필요합니다.

Git 브랜치 명령 효과적으로 사용

Git 은 효과적인 브랜치 관리를 위해 branch 명령과 함께 많은 옵션을 제공합니다.

## 원격 브랜치를 포함한 모든 브랜치 나열
git branch -a

## 각 브랜치에 대한 자세한 정보 표시
git branch -v

## 원격 브랜치 삭제
git push origin --delete branch-name

## 현재 브랜치 이름 변경
git branch -m new-name

빠른 워크플로우 예시 생성

일반적인 브랜치 워크플로우를 시뮬레이션해 보겠습니다.

  1. 기능 브랜치에서 작은 변경 사항을 만듭니다.
echo "User authentication feature" > auth.txt
git add auth.txt
git commit -m "Start user authentication feature"
  1. master 브랜치로 다시 전환합니다.
git checkout master
  1. 기능 브랜치를 병합합니다.
git merge feature/user-authentication

병합을 확인하는 출력을 볼 수 있습니다.

Updating xxxxxxx..xxxxxxx
Fast-forward
 auth.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 auth.txt
  1. 이제 기능 브랜치가 병합되었으므로 안전하게 삭제할 수 있습니다.
git branch -d feature/user-authentication

출력:

Deleted branch feature/user-authentication (was xxxxxxx).

최종 브랜치 상태

최종 브랜치 상태를 확인해 보겠습니다.

git branch

출력 결과는 다음과 같아야 합니다.

  bugfix-branch
  feature-branch
* master

이러한 모범 사례를 따르면 Git 저장소에서 브랜치를 효과적으로 관리하고 "Cannot delete branch checked out" 오류를 방지하며 깨끗하고 체계적인 코드베이스를 유지할 수 있습니다.

요약

이 랩에서는 Git 브랜치를 효과적으로 관리하고 일반적인 "Cannot delete branch checked out" 오류를 해결하는 방법을 배웠습니다. 다음은 수행한 작업입니다.

  1. 여러 브랜치가 있는 Git 저장소 구조를 설정하고 탐색했습니다.
  2. 새 브랜치를 생성하고 브랜치 간을 전환하는 방법을 배웠습니다.
  3. Git 이 현재 사용 중인 브랜치를 삭제하지 못하도록 하는 이유를 이해했습니다.
  4. 먼저 다른 브랜치로 전환하여 브랜치를 삭제하는 올바른 절차를 배웠습니다.
  5. 명명 규칙 및 저장소 정리와 같은 브랜치 관리에 대한 모범 사례를 탐색했습니다.

이러한 기술은 특히 여러 브랜치가 있는 복잡한 프로젝트에서 작업할 때 체계적인 Git 워크플로우를 유지하는 데 필수적입니다. Git 이 브랜치를 추적하는 방식을 이해하고 브랜치 관리에 대한 올바른 절차를 따르면 일반적인 오류를 방지하고 깨끗하고 효율적인 저장소를 유지할 수 있습니다.

브랜치를 올바르게 생성, 관리 및 삭제하는 능력은 Git 을 사용하는 모든 개발자에게 기본적인 기술이며, 이 랩에서 얻은 지식은 향후 프로젝트에서 Git 저장소를 보다 효과적으로 사용할 수 있도록 도와줍니다.