💡 저희 팀은 저번 회의에서 PR Merge 이후에 merge된 branch는 삭제하는 것이 좋을지에 대한 논의를 했었어요. GitFlow를 살펴보니 보통 pull request 이후에 merge 된 branch는 삭제한다는 전략을 사용한다 라는 말을 듣고, 삭제를 하기로 결정했어요.
저는 그 논의에서 궁금증이 생겼습니다. 그럼 merge된 브랜치를 삭제한 이후에, 같은 이름의 브랜치를 다시 사용하는 것은 문제가 없을까…?
✔️ Git 브랜치를 삭제한 이후, 다음에 같은 이름의 브랜치를 사용하는 것은 괜찮을까?
StackOverflow 답변에 따르면 이러하다
Branch는 Commit에 대한 포인터이다.
git branch는 commit pointer → SHA에만 관심이 있다.
브랜치를 삭제하고 나중에 다른 커밋에서 같은 이름으로 브랜치를 생성하면, 새로운 브랜치를 만드는 것과 같다.
즉, 문제없다!
🏃 실제로 해볼 경우
local에서 A 브랜치에서 작업 후 PR Merge
remote에서 A 브랜치 삭제
local에서 A 브랜치 생성 → 이미 존재하는 브랜치라고 뜸
git checkout A
현재 브랜치가 'origin/A' 기반이지만, 업스트림이 없어졌습니다. (바로잡으려면 "git branch --unset-upstream"을 사용하십시오)
현재 로컬 브랜치가 원격의 feat/A브랜치를 업스트림으로 바라보고 있는데, 없어져있어요.
그래서
—unset-upstream
을 이용하여 참조를 끊어주세요!
💡 What is Upstream?
git에서 upstream과 downstream은 상대적인 개념이다.
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… (혹은 이런 방법도 있어요)
remote에서 branch를 삭제한 후,
local에서
git remote prune origin
orgit fetch —prune
을 이용한다.
💡 prune local에서 remote를 참조하지 않는 것 중 유효하지 않은 것을 제거한다.
→ upstream과 연결되지 않은 브랜치 A를 삭제해준다.
- 이후 로컬에서 새로 같은 이름의 브랜치를 만든다.
세줄요약
일단가능
리모트에서 브랜치를 삭제한경우 → 로컬에서 업스트림 참조를 끊어주고 다시 연결해야 한다
혹은 prune을 이용해서 remote에서 삭제된 브랜치 상황을 로컬에 업데이트 해줘야 한다.
참고자료
Can you re-use deleted Git branch names?
GitHub에서 협업을 위한 remote repository와 upstream 이해하기
현재 브랜치가 'branch명' 기반이지만, 업스트림이 없어졌습니다. (git branch --unset-upstream)