Git 기능 브랜치를 삭제할 적절한시기는 언제입니까?


89

82 개의 기능 브랜치 로 끝나고 싶지 않기 때문에 마스터에 병합하자마자 기능 브랜치를 단순히 삭제하는 것이 잠재적 인 단점이 무엇인지 궁금합니다.

워크 플로우 :

git co -b feat-xyz
hack hack
git ci
hack some more
git ci
git co master
git merge feat-xyz
smoke test
git br -d feat-xyz

여기에 문제가 있습니까?


1
정말로 필요하다면 나중에 삭제 된 브랜치를 언제든지 부활시킬 수 있기 때문에 문제가 없다고 말할 것입니다.
slebetman 2010 년

@slebetman 내가 아는 한 삭제 된 분기는 부활 할 수 없습니다. 그러나 브랜치를 삭제하기 전에 마스터에 완전히 병합 된 경우 더 이상 브랜치가 필요하지 않습니다.
Simeon

1
@Simeon 네 할 수 있습니다. Git은 커밋을 절대 삭제하지 않으므로 브랜치를 삭제하면 이름 만 삭제됩니다. 삭제 된 브랜치를 되살리려면 해당 브랜치에 마지막으로 커밋 한 것을 기억하고 검색 할 수 있습니다 git reflog. 그런 다음 해시 체크 아웃
slebetman

@slebetman은 브랜치가 결국 병합 된 경우에만 적용됩니다. 커밋이 남겨지면 결국 도달 할 수 없게되고 일정 시간 후에 가비지 수집 대상이됩니다. reflog의 항목도 결국 제거되며 기본적으로 약 90 일이 있습니다.
goldenratio

@goldenratio : 그에 대한 참조가 있습니까?
slebetman

답변:


62

병합 후 삭제는 일반적인 방법입니다. 이것이 git branch -d yourbranchname삭제되기 전에 분기가 완전히 병합되었는지 확인하는 이유 입니다.

분기를 유지해야하는 몇 가지 이유가 있습니다. 프로덕션에 도달 한 후 버그가 다시 발생하는 경우이를 유지하고 싶을 수도 있고, 과거 기록을 원할 수도 있습니다.

두 경우 모두 브랜치의 헤드를 삭제하기 전에 태그를 지정할 수 있습니다. 태그는 몇 가지 사소한 차이점을 제외하고는 커밋에 대한 포인터라는 점에서 브랜치와 같습니다. 1) porcelain은 일반적으로 체크 아웃시 git show-branch 또는 tab-auto complete와 같은 탐색 명령에 태그를 표시하지 않습니다. 2) 하나를 체크하면 분리 된 (비 참조) HEAD에 놓이게됩니다. 3) " 태그 지정 메시지 "를 남길 수 있습니다. 그러면 태그가 커밋처럼 객체 저장소에 객체로 저장됩니다.

이렇게하면 기록을 보존 할 수 있으며 버그 수정이 필요한 경우 수정을 위해 master에서 새 분기를 만드는 것이 좋습니다.


1
태그를 체크 아웃하면 HEAD가 설정되지만 브랜치를 자동으로 생성하지는 않습니다. 브랜치가없는 커밋의 HEAD는 분리 된 원인입니다.
Binarian

1
맞습니다. HEAD를 ref가 아닌 커밋 ID로 설정합니다. 내 OP의 해당 부분이 잘못되었습니다. 업데이트해야합니다.
masonk

97

병합 후 삭제하지만 git merge --no-ff, 분기 기록이 그래프에 표시되도록 빨리 감기를 방지하기 위해 항상을 수행합니다 . 기능 브랜치가 개발 브랜치에서 출발 한 위치와 다시 결합 된 위치에 대한 기록을 갖고 싶습니다.

빨리 감기를 사용하거나 사용하지 않고 병합

이것은 Vincent Driessen 의 성공적인 Git 분기 모델 에서 가져 왔으며 , 대부분의 프로젝트에 적용하는 git과 함께 사용하기에 매우 좋은 워크 플로입니다.


이것은 마스터가 아닌 기능에서 도달 할 수있는 커밋을 선택할 수 있기 때문에 히스토리를 보존하는 또 다른 좋은 방법입니다 : rev ^ 1..rev ^ 2. 단점은 마스터 브랜치에서 수행 할 수있는 리베이스를 망가 뜨리는 것입니다 (예 : 마스터 리베이스를 업스트림 원격으로 유지하려는 경우 매우 일반적입니다).
masonk

1
나는 그 문제가 없었습니다. 우리 팀은 github를 통해 동기화하고, 일반적으로 리베이스 할 필요가 없지만 여기서 단점은 없다고 생각합니다. 개발 및 기능 브랜치를 리베이스하더라도 브랜치는 그래프에 계속 표시되며 중요한 것은 해당 브랜치를 만들 때 원래 떠난 커밋이 아니라 개발과 관련된 기능 브랜치에있는 것이 무엇인지입니다.
lkraider 2010 년

@Ikraider, 알림 주셔서 감사합니다. 내가 처음 git을 배울 때 그 기사를 봤는데, 지금은 더 이해가 간다. 나는 내 기능 브랜치를 리베이스하지만, merge --no-ff당신이 말한 것처럼 역사를 볼 수 있기 때문에 마스터로 돌아갑니다.
bstpierre 2010 년

7

기능 분기를 잠시 유지하려는 두 가지 이유를 생각할 수 있습니다.

  • 업스트림에서 더 많은 작업을 위해 다시 쫓겨날 가능성이 있습니다.
  • 다른 개발자는 마스터에서 다른 모든 것을 원하지 않고 해당 기능을 원할 수 있습니다.

실제로 병합 후 삭제하는 대부분의 경우 괜찮습니다.


6

일반적인 워크 플로우는 다음과 같습니다.

 // Create new branch
 $ git checkout -b myfeature
 // and then do some changes and commit them

 // Switch to master branch
 $ git checkout master

 // Merge myfeature to master. --no-ff will always keep branch information.
 $ git merge --no-ff myfeature

 // Delete myfeature branch
 $ git branch -d myfeature

 // Push the changes
 $ git push origin master

1

이것이 일반적인 워크 플로우라고 생각합니다 (병합 후 삭제)

편집 그래서 적어도 짧은 분기의 경우 병합하는 대신 마스터에 다시 기반을 두는 것이 아이디어라고 생각합니다. 그런 다음 선형 변경 내역으로 끝나고 전체 분기가 메인 트렁크의 일부가됩니다. 이 경우 모든 변경 사항이 있으므로 분명히 사본이 필요하지 않습니다.


그래서 정말로 가지를 유지하는 데 아무런 의미가 없습니다.
bstpierre 2010 년

1
"rebase"를 피하는 것이 좋습니다. 리베이스는 일반적으로 유해하며 일부 경우에만 유용합니다.
Dietrich Epp

9
Rebasing은 지역의 개인 지점에 대해 완벽하게 합리적인 워크 플로입니다. 예를 들어 리베이스 ( "리베이스 다운 ") 하여 업스트림 작업과 동기화를 유지하는 것은 매우 일반적 입니다. rebase up *은 훨씬 덜 일반적이며 일반적으로 해 롭습니다. 두 번째의 대답은 실제로 의미가 없습니다. 왜냐하면 업스트림 변경에서 리베이스하거나 병합하든 관계없이 어떻게 든 그 내용을 "위로"올려야하기 때문입니다. 로컬 브랜치에서도 어느 시점에서 마스터하려면 기능을 병합해야합니다. 기능 기반을 유지하는 이점은이 병합이 빠르게 진행된다는 것입니다.
masonk

1
그러나 최근에 나를 물었던 rebasing branch와 함께 조심해야 할 것이 있습니다. 지금은 분명하지만, 나는 항상 마스터에 대해 전체를 리베이스하면서 오래 지속되는 지점에서 몇 달 동안 갔다. 600 개 정도의 훌륭하고 세분화 된 커밋으로 끝났지 만 master는 크게 리팩토링되었고 거의 여러 번 완전히 변경되었습니다. 매번 전체 브랜치를 리베이스하여 이전 커밋을 연결에서 그들에게 의미가있는 마스터 커밋으로 잘라 냈습니다. 이제는 필요할 때 마스터에 병합하는 것을 선호합니다. 브랜치의 역사가 절대적으로 영향을받지 않는 경우에만 리베이스 할 것입니다.
게리 Fixler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.