자식 브랜치의 이름을 지정하는 데 일반적으로 사용되는 몇 가지 예는 무엇입니까? [닫은]


1121

몇 달 동안 내 그룹의 CVS 저장소와 상호 작용하는 로컬 자식 저장소를 사용하고 있습니다. 나는 거의 신경질적인 수의 가지를 만들었습니다. 그러나 이름이 문제가되고 있습니다. 간단한 레이블로 쉽게 이름이 지정된 작업이 있지만 각각 자체 분기 및 병합 상황을 포함하는 세 단계로 수행하면 매번 분기 이름을 반복 할 수 있지만 역사는 약간 혼란 스럽습니다. 각 단계마다 별도의 설명과 함께 이름을 더 구체적으로 지정하면 지점 이름이 길고 다루기 어려워지기 시작합니다.

나는 오래된 스레드를 통해 이름 / / 이름, 즉 주제 / 작업 또는 이와 유사한 이름으로 분기 이름을 지정할 수 있다는 것을 배웠습니다. 나는 그 일을 시작하고 그것이 더 나은 조직을 유지하는 데 도움이되는지 볼 수 있습니다.

자식 분기의 이름을 지정하는 모범 사례는 무엇입니까?

편집 : 실제로 아무도 명명 규칙을 제안하지 않았습니다. 작업이 끝나면 지점을 삭제합니다. 경영진이 끊임없이 우선 순위를 조정하기 때문에 몇 가지 상황이 발생합니다. :) 하나의 작업에 두 개 이상의 분기가 필요한 이유의 예로, 작업의 첫 번째 개별 마일스톤을 그룹의 CVS 리포지토리에 커밋해야한다고 가정합니다. 그 시점에서 CVS와의 불완전한 상호 작용으로 인해 커밋을 수행 한 다음 해당 분기를 종료합니다. (그 시점에서 동일한 브랜치를 계속 사용하려고하면 CVS와 상호 작용하는 이상한 점이 너무 많습니다.)


그렇습니다. 아마도 가지를 끝내거나 사용한 후에는 유용하지 않은 가지를 밀거나 밀지 않는 것이 좋습니다. 주제 분기를 유지해야하는 적절한 이유가없는 경우 (예 : 나중에 문의) 주제를 삭제하는 데 아무런 문제가 없습니다. 힘내는 분기를 쉽게하고, 추론은 많은 사소한 가지없이 정리할 수있는 사소한 가지가 많이 생길 수 있다는 것입니다.
Eric Walker



18
StackExchange 네트워크 내에 이러한 종류의 질문을위한 장소가 있어야합니다. 누군가가 이와 같은 좋은 질문을 할 때 매우 성가신 것은 규칙을 따르지 않기 때문에 폐쇄됩니다. 그것이 계속 발생한다면 아마도 이런 종류의 질문을 어떻게 든 지원해야 할 것입니다. 프로그래밍 유형 질문과 밀접한 관련이 있기 때문에 오버플로 사이트 내에서만 구현해야합니다. 오버플로는 나에게 "객관적으로 대답 할 수있는 질문"이 아니라 "프로그래밍 질문"입니다.
Nick Res

@Wim 우리는 짧은 제목과 함께 jira 이슈 키를 사용합니다 :KEY-1234/allow-users-to-do-smart-stuff
RobAu

답변:


938

다음은 내가 사용하는 지점 명명 규칙과 그 이유입니다.

지점 명명 규칙

  1. 지점 이름의 시작 부분에 그룹화 토큰 (단어)을 사용하십시오.
  2. 짧은 리드 토큰을 정의하고 사용하여 워크 플로우에 의미있는 방식으로 분기를 차별화하십시오.
  3. 슬래시를 사용하여 브랜치 이름의 일부를 분리하십시오.
  4. 맨 앞에 숫자를 사용하지 마십시오.
  5. 오래 지속되는 가지에 대해 긴 설명 이름을 사용하지 마십시오.

그룹 토큰

지점 이름 앞에 "그룹화"토큰을 사용하십시오.

group1/foo
group2/foo
group1/bar
group2/bar
group3/bar
group1/baz

워크 플로우에 맞게 그룹 이름을 지정할 수 있습니다. 나는 짧은 명사를 사용하고 싶습니다. 더 명확하게 읽으십시오.

잘 정의 된 짧은 토큰

짧은 토큰을 선택하면 모든 지사 이름에 너무 많은 소음이 발생하지 않습니다. 나는 이것을 사용한다 :

wip       Works in progress; stuff I know won't be finished soon
feat      Feature I'm adding or expanding
bug       Bug fix or experiment
junk      Throwaway branch created to experiment

이러한 각 토큰을 사용하여 각 분기가 속한 워크 플로의 어느 부분을 알려줄 수 있습니다.

서로 다른 변경주기에 대해 여러 개의 분기가있는 것 같습니다. 나는 당신의 사이클이 무엇인지 모르지만, 그것이 '신규', '테스트'및 '확인'이라고 가정합시다. 이 태그를 축약 된 버전의이 태그로 이름을 지정할 수 있으며 항상 같은 방식으로 철자하여 그룹화하고 현재 단계를 알려줍니다.

new/frabnotz
new/foo
new/bar
test/foo
test/frabnotz
ver/foo

서로 다른 단계에 도달 한 지점을 신속하게 파악할 수 있으며 Git의 패턴 일치 옵션을 사용하여 쉽게 분기를 그룹화 할 수 있습니다.

$ git branch --list "test/*"
test/foo
test/frabnotz

$ git branch --list "*/foo"
new/foo
test/foo
ver/foo

$ gitk --branches="*/foo"

슬래시를 사용하여 부품 분리

분기 이름에 원하는 구분 기호를 대부분 사용할 수 있지만 슬래시가 가장 유연합니다. 대시 또는 점을 사용하는 것이 좋습니다. 그러나 슬래시를 사용하면 리모콘으로 밀거나 가져올 때 분기 이름을 바꿀 수 있습니다.

$ git push origin 'refs/heads/feature/*:refs/heads/phord/feat/*'
$ git push origin 'refs/heads/bug/*:refs/heads/review/bugfix/*'

나에게 슬래시는 쉘의 탭 확장 (명령 완성)에 더 효과적입니다. 내가 구성한 방식으로 파트의 첫 문자를 입력하고 Tab 키를 눌러 다른 하위 파트가있는 분기를 검색 할 수 있습니다. 그런 다음 Zsh는 내가 입력 한 토큰의 일부와 일치하는 분기 목록을 제공합니다. 이것은 내장 토큰뿐만 아니라 이전 토큰에도 적용됩니다.

$ git checkout new<TAB>
Menu:  new/frabnotz   new/foo   new/bar


$ git checkout foo<TAB>
Menu:  new/foo   test/foo   ver/foo

(Zshell은 명령 완료에 대해 매우 구성 가능하며 대시, 밑줄 또는 점을 같은 방식으로 처리하도록 구성 할 수도 있습니다. 그러나 나는하지 않기로 선택합니다.)

또한 다음과 같이 많은 git 명령에서 분기를 검색 할 수 있습니다.

git branch --list "feature/*"
git log --graph --oneline --decorate --branches="feature/*" 
gitk --branches="feature/*" 

주의 사항 : Slipp이 주석에서 지적한 것처럼 슬래시가 문제를 일으킬 수 있습니다. 분기는 경로로 구현되므로 "foo"라는 분기와 "foo / bar"라는 다른 분기를 가질 수 없습니다. 새로운 사용자에게는 혼란 스러울 수 있습니다.

베어 번호를 사용하지 마십시오

분기 이름 지정 체계의 일부로 베어 숫자 (또는 16 진수)를 사용하지 마십시오. 참조 이름의 탭 확장 내에서 git은 숫자가 지점 이름 대신 sha-1의 일부라고 결정할 수 있습니다. 예를 들어, 내 이슈 트래커는 10 진수로 버그를 명명합니다. 혼란을 피하기 위해 nnnnn 대신 관련 지점의 이름을 CRnnnnn으로 지정합니다.

$ git checkout CR15032<TAB>
Menu:   fix/CR15032    test/CR15032

15032 만 확장하려고하면 git은 SHA-1 또는 분기 이름을 검색할지 여부를 확신 할 수 없으며 선택 사항이 다소 제한적입니다.

긴 설명 이름을 피하십시오

긴 지점 이름은 지점 목록을 볼 때 매우 유용합니다. 그러나 분기 이름이 대부분의 한 줄을 차지하고 로그의 보이는 부분을 줄여서 장식 된 한 줄 로그를 볼 때 방해가 될 수 있습니다.

반면에 긴 브랜치 이름은 습관적으로 손으로 다시 쓰지 않으면 "커밋 병합"에서 더 도움이 될 수 있습니다. 기본 병합 커밋 메시지는 Merge branch 'branch-name'입니다. 병합 메시지 Merge branch 'fix/CR15032/crash-when-unformatted-disk-inserted'를 그냥 대신 표시하는 것이 더 도움이 될 수 있습니다 Merge branch 'fix/CR15032'.


156
같은 형태의 혼합을 사용하는 한 가지 단점 bug/20574/frabnotz-finderbug/20424당신이 하위 토큰없이 시작하면, 당신은 반대 나중에 하나 부사장을 추가 할 수 있다는 것입니다. EG : bug/20424지점 을 만들면 지점 bug/20424/additional-fixing을 삭제하지 않는 한 나중에 지점을 만들 수 없습니다 bug/20424. 마찬가지로 bug/20574/frabnotz-finder이미 지점 인 경우 bug/20574지점을 만들 수 없습니다 . 이 경우 (예 :) 하위 토큰 이외의 구분 기호를 사용하거나 하위 토큰 bug/20574_frabnotz-finder의 기본 이름 (예 :)을 선택하는 경향이 있습니다 bug/20424/main.
Slipp D. Thompson

5
또한 Git GUI 기반 도구를 프롬프트하여 디렉토리 목록보기와 같은 축소 토큰 분할을 허용하는 이점이 있습니다. 위의 예에서, 당신은 볼 것 feature그룹과 bug확장 가능한 그룹이 보여 foo, bar이전과 태그 20574, 20592그룹과 20424, 21334후자에 대한 태그를.
Slipp D. Thompson

47
자식 분기 이름 지정에 슬래시를 사용하지 않도록 캠페인을 시작하겠습니다. 그 이유는 예를 들어 CI에서 코드를 패키징 할 때 분기 이름을 참조하려는 경우 uri 또는 PATH (예 : 빌드)를 빌드 할 때 분기 이름을 참조하려는 것입니다. bash 스크립트의 URI; URL 부분을 추가하는 슬래시로 인해 URI를 작성하는 데 문제가 있습니다. 예, 슬래시를 교체하는 것이 가능하지만 정렬하는 데 많은 시간이 걸립니다.
Adam Spence

13
슬래시가 git에 의미가있는 문제입니까? 예를 들어, git branch -a및 에 대한 응답으로 remotes/origin/mastergit이 분기에 대해 알려 주면 슬래시를 사용하지 않으므로 슬래시를 사용하면 "특별한"참조라는 것을 알 수 있습니다.
Dogweather

11
foo와 bar 대신 몇 가지 예를 사용할 수 있습니까?
Worthy7

329

Vincent Driessen 의 성공적인 Git 브랜칭 모델 에는 좋은 제안이 있습니다. 사진은 아래와 같습니다. 이 브랜칭 모델이 매력적이라면 git 흐름 확장을 고려하십시오 . 다른 사람들은 흐름에 대해 언급했습니다

Driessen의 모델은 다음과 같습니다.

  • 릴리스에만 사용되는 마스터 분기입니다. 전형적인 이름 master.

  • 해당 지점에서 "개발"지점 그것은 대부분의 주요 작업에 사용되는 것입니다. 일반적으로 이름이 develop입니다.

  • 개발 지점에서 여러 기능 지점. 기능 이름을 기반으로 한 이름입니다. 이들은 마스터 또는 릴리스 브랜치가 아닌 개발로 다시 병합됩니다.

  • 버그 수정 및 새로운 기능이없는 후보 릴리스를 보유하는 릴리스 브랜치. 전형적인 이름 rc1.1.

핫픽스는 마스터에서 제공되는 변경 사항을위한 단기 브랜치이며 개발 브랜치가 없어도 마스터로 변경됩니다.

여기에 이미지 설명을 입력하십시오


129
이 사용자에게 규칙을 명명 한 무리의 잎 때문에 정말 (그들은 "마스터를 제외하고 아무것도 개발, 릴리스 - 특히 확대 할 수 있습니다 기능 나뭇 가지에 대해, 문제를 해결하지 않는 것을 제외하고 , 또는 hotfix- "
브라이언

1
@Brian 기능 명명 규칙은 모델이 해결하는 문제의 맥락에서 어떤 도움을 줍니까? 나는 현재 기능을 더욱 차별화시키는 것이 실제로 어떻게 도움이되는지 알지 못한다. 어쩌면 미래 대 다음 릴리스 일 수도 있지만 협상이 가능하므로 이름의 일부가되어서는 안됩니다. 가독성을 위해 feature- *를 앞에 붙이는 것으로 충분합니다. 당신은 몇 번 투표를해서 당신의 사고 과정을 듣고 싶어합니다.
Nick Res

2
좋은 정보이지만이 답변은 명명 규칙보다는 흐름 문제를 해결합니다. 나는 OP가 실제 단어 (명사 대 동사), 구분자, 대소 문자 등을 알고 싶어한다고 생각합니다.
Caltor

6
Continuous Delivery (p. 36)라는 책은이 모델이 Continuous Integration과는 반대로 일종의 주장이라고 주장합니다. 본질적으로 실제로 "민첩한"것은 아닙니다.
Markon

이것은 실제로 질문에 대답하지 않습니다. 이를 통해 특정 git 워크 플로 를 중요한 개발 및 릴리스 일정 에 통합하는 데 대한 통찰력을 얻을 수 있지만 op는 실제로 지점을 호출하는 것에 대한 규칙에 대한 조언을 찾고 있습니다.
휠러

56

개인적으로 선호하는 것은 토픽 브랜치가 끝나면 브랜치 이름을 삭제하는 것입니다.

브랜치의 의미를 설명하기 위해 브랜치 이름을 사용하는 대신, "브랜치 :"를 사용하여 해당 브랜치의 첫 번째 커밋에서 커밋 메시지의 제목 줄을 시작하고 제목이 다음과 같은 경우 메시지 본문에 추가 설명을 포함시킵니다. 공간이 충분하지 않습니다.

내가 사용하는 브랜치 이름은 순전히 토픽 브랜치를 다루는 핸들입니다. 토픽 브랜치에 대한 작업이 끝나면 브랜치 이름을 제거하고 때로는 나중에 참조하기 위해 커밋에 태그를 지정합니다.

따라서 출력의 git branch유용성도 향상됩니다. 모든 분기가 아니라 오래 지속되는 분기 및 활성 주제 분기 만 나열합니다.


53

나는 내가 본 다른 도구와 내가 사용하는 툴링을 기반으로 혼합하고 일치했습니다.
완성 된 지점 이름은 다음과 같습니다.

이름 / 기능 / 문제 추적기 번호 / 짧은 설명

이것은 다음과 같이 번역됩니다.

마이크 / 블로그 / RSSI-12 / 로고 수정

부품은 쉽게 정리할 수 있도록 SourceTree에서 폴더로 해석되므로 슬래시로 구분됩니다. Jira는 이슈 추적에 Jira를 사용하므로 숫자를 포함하면 시스템에서 쉽게 조회 할 수 있습니다. 이 번호를 포함하면 풀 요청을 제출하려고 할 때 Github에서 해당 문제를 찾을 때 검색 할 수 있습니다.


커밋 메시지의 버그 / 기능 번호 (GitHub-> Pivotal Tracker 통합의 경우)를 제외하고 동일합니다.
Leo

RSSI의 의미가 궁금합니다.
Renshuki

@renshuki는 일반적인 Jira 프로젝트 키입니다. 어떤 이슈 트래커를 사용 하든지 티켓 ID
MikeG

@MikeG 정밀 감사합니다!
Renshuki

3
설명과 함께 문제 번호를 전달하는 것을 제외하고는 동일하게 사용합니다.name/feature/issue-tracker-number-short-description
lephleg

22

모든 작업에 세 개의 지점 / 병합이 필요한 이유는 무엇입니까? 그것에 대해 더 자세히 설명해 주시겠습니까?

버그 추적 시스템을 사용하는 경우 지점 이름의 일부로 버그 번호를 사용할 수 있습니다. 이렇게하면 분기 이름이 고유하게 유지되고 짧고 설명적인 단어 앞에 접두어를 붙여서 사람이 읽을 수있게합니다 "ResizeWindow-43523". 또한 관련된 버그를 찾을 수 있기 때문에 분기를 정리할 때 작업을보다 쉽게 ​​수행 할 수 있습니다. 이것이 내가 보통 지점 이름을 짓는 방법입니다.

이러한 브랜치는 결국 마스터로 다시 병합되므로 병합 후 안전하게 삭제해야합니다. 와 병합하지 않는 한 --squash지점의 전체 기록은 여전히 ​​필요합니다.


12

참고에 도시 된 바와 같이 e703d7 커밋 또는 b6c2a0d 커밋 힘내 2.0 (2014 월)을, 지금의, 다른 명명 규칙을 (당신이 지점에 적용 할 수있는) 찾을 수 있습니다.

"공간을 사용해야 할 때 대시를 사용하십시오"는 공백을 사용해서는 안된다는 이상한 방법입니다.
명령 행 설명에서 대시 다중 단어를 사용하는 것이 더 일반적이므로이 위치에는 공백을 사용하지 않아도됩니다.

브랜치 이름은 공백을 가질 수 없습니다 ( " 브랜치 이름에서 어떤 문자가 유효하지 않습니까? "및 git check-ref-format매뉴얼 페이지 참조 ).

따라서 여러 단어로 표현되는 모든 분기 이름에 대해 ' -'(대시)를 구분 기호로 사용하는 것이 좋습니다.


7

farktronix의 제안에 따라, 우리는 수은과 유사하게 Jira 티켓 번호를 사용하고 있으며 git 브랜치에 계속 사용할 계획입니다. 그러나 티켓 번호 자체는 충분히 독창적이라고 생각합니다. farktronix가 지적한대로 브랜치 이름에 설명적인 단어를 사용하는 것이 도움이 될 수 있지만 브랜치 사이를 자주 전환하는 경우 타이핑을 원치 않을 수 있습니다. 그런 다음 지점 이름을 알아야하는 경우 Jira에서 티켓의 관련 키워드를 모르는 경우 해당 키워드를 찾으십시오. 또한 각 주석에 티켓 번호를 포함시켜야합니다.

지점이 버전을 나타내는 경우 일반적인 규칙은 지점 이름으로 xxx (예 : "1.0.0") 형식을 사용하고 태그 이름으로 vx.xx (예 : "v1.0.0")를 사용하여 충돌을 피하는 것 같습니다. . 참조 : 표준 이름 지정 컨벤션-git-tags


1
충돌에 문제가 있습니까? v1.2.4브랜치가 결국 v1.2.4태그 로 엔드 포인트로 이어질 의도라면 (버전 이후 브랜치와 태그의 이름을 지정하는 상황이라고 가정하면 정확 합니까?) 태그는 여전히에 도달 refs/tags/v1.2.4하고 분기는에 도달 할 수 있으며 refs/heads/v1.2.4, 모호한 경우 (경고와 함께) 태그 이름을 선호하는 것으로 보입니다.
Slipp D. Thompson 1

1
버전 예제의 경우, 대답에서 언급했듯이 제안 된 방법은 분기가 아닌 태그 이름에 "v"를 접두어로 사용하는 것입니다. 잘못된 의사 소통을 피할 수 있다면 다음 모호한 VCS가 무엇이든간에 마이그레이션 문제가 발생할 수 있으므로 모호성을 피하십시오.
게리 S. 위버

2
나는 최근에 우리가 같은 이름의 태그로 각 버전 분기를 막는 저장소와 함께 일했습니다. 모호성이 거의 없거나 (태그가 대부분의 경우 해당 분기의 마지막 커밋을 가리키는) 거의 없기 때문에 Git은“올바른 일”(경고와 함께)을 수행합니다. 누군가가 골머리 실수를하고 뚜껑이 달린 가지를 더 저지르면 Git은 태그를 계속 선택하므로 의도합니다. 모호성은 시스템이 모든 것을 통제 할 수 있고 의도가 분명 할 때 일을 더 단순하게 만들 수 있습니다.
슬립 D. 톰슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.