Git 브랜치를 삭제한 이후, 다음에 같은 이름의 브랜치를 사용하는 것은 괜찮을까?

Photo by Yancy Min on Unsplash

Git 브랜치를 삭제한 이후, 다음에 같은 이름의 브랜치를 사용하는 것은 괜찮을까?

💡 저희 팀은 저번 회의에서 PR Merge 이후에 merge된 branch는 삭제하는 것이 좋을지에 대한 논의를 했었어요. GitFlow를 살펴보니 보통 pull request 이후에 merge 된 branch는 삭제한다는 전략을 사용한다 라는 말을 듣고, 삭제를 하기로 결정했어요.

저는 그 논의에서 궁금증이 생겼습니다. 그럼 merge된 브랜치를 삭제한 이후에, 같은 이름의 브랜치를 다시 사용하는 것은 문제가 없을까…?

✔️ Git 브랜치를 삭제한 이후, 다음에 같은 이름의 브랜치를 사용하는 것은 괜찮을까?

StackOverflow 답변에 따르면 이러하다

  1. Branch는 Commit에 대한 포인터이다.

  2. git branch는 commit pointer → SHA에만 관심이 있다.

  3. 브랜치를 삭제하고 나중에 다른 커밋에서 같은 이름으로 브랜치를 생성하면, 새로운 브랜치를 만드는 것과 같다.

즉, 문제없다!

🏃 실제로 해볼 경우

  1. local에서 A 브랜치에서 작업 후 PR Merge

  2. remote에서 A 브랜치 삭제

  3. local에서 A 브랜치 생성 → 이미 존재하는 브랜치라고 뜸

  4. git checkout A

     현재 브랜치가 'origin/A' 기반이지만, 업스트림이 없어졌습니다.
     (바로잡으려면 "git branch --unset-upstream"을 사용하십시오)
    

    현재 로컬 브랜치가 원격의 feat/A브랜치를 업스트림으로 바라보고 있는데, 없어져있어요.

    그래서 —unset-upstream 을 이용하여 참조를 끊어주세요!

💡 What is Upstream?

  • git에서 upstreamdownstream은 상대적인 개념이다.

  • origin과 local을 기준으로 생각하면, origin이 upstream, local이 downstream이 된다.

    • push, pull을 기준으로 생각했을 때, origin으로부터 local으로 흐르는 관계가 형성되기 때문.
  • 한번 로컬 브랜치의 upstream을 remote의 branch로 설정하고 나면, git push git pull 이라고만 명령어를 입력해도 자동으로 origin의 브랜치로부터 push와 pull을 진행한다.

💡 git push -u origin branchname 명령어로 업스트림을 셋팅할 수 있다.

💡upstream vs origin

두 비교는 어떤 Repo를 fork 했을 때를 가정하고 이해해야 한다.

이 때 Fork를 해서 생긴 레포를 origin, Forked 된 원본 레포를 upstream 이라고 한다.

🤔 위에서 설명한 upstream 하고 다른내용인것 같은데…

  • fork는 다른 사람의 repo를 내 소유의 repo로 복사하는 일이다.

  • 따라서 원래 소유자의 remote repository와, 내가 fork한 remote repository 사이에도 upstream, downstream 이라는 관계가 형성된다.

  • 그래서 보통 원래 소유자의 remote를 말할 때 upstream, 내가 포크한 remote를 말할 때 origin이라는 용어를 사용한다.

👂 그래서 결론!

  • git branch —unset-upstream 으로 연결한 remote branch 참조를 없앤 후,

  • git branch —set-upstream-to origin/branchanme 을 사용하여 upstream을 새로 연결해줘야 한다!

🚠 Other Ways… (혹은 이런 방법도 있어요)

  1. remote에서 branch를 삭제한 후,

  2. local에서 git remote prune origin or git fetch —prune 을 이용한다.

💡 prune local에서 remote를 참조하지 않는 것 중 유효하지 않은 것을 제거한다.

→ upstream과 연결되지 않은 브랜치 A를 삭제해준다.

  1. 이후 로컬에서 새로 같은 이름의 브랜치를 만든다.

세줄요약

  1. 일단가능

  2. 리모트에서 브랜치를 삭제한경우 → 로컬에서 업스트림 참조를 끊어주고 다시 연결해야 한다

  3. 혹은 prune을 이용해서 remote에서 삭제된 브랜치 상황을 로컬에 업데이트 해줘야 한다.

참고자료


Can you re-use deleted Git branch names?

GitHub에서 협업을 위한 remote repository와 upstream 이해하기

Git 리모트에 삭제된 브랜치 반영하기

[git] Git Prune 에 대해 알아보자

현재 브랜치가 'branch명' 기반이지만, 업스트림이 없어졌습니다. (git branch --unset-upstream)