2011-03-16 5 views
210

안정적인 응용 프로그램이 있다고 가정 해 보겠습니다.Git에서 분기를 삭제할시기?

내일 누군가가 우리가 바로 핫픽스로 결정할 큰 버그를보고합니다. 따라서 우리는 "master"에서 그 핫픽스를위한 브랜치를 만들고, 우리는 그것을 "2011_Hotfix"라고 이름을 짓고 모든 개발자들이 그것을 고칠 수 있도록 그것을 밀어 붙입니다.

버그를 수정하고 "2011_Hotfix"를 현재 개발 지점뿐만 아니라 "마스터"에 병합합니다. 그리고 "master"를 누르십시오.

"2011_Hotfix"로 무엇을할까요? 시간이 끝날 때까지 지부처럼 영원히 앉아 있어야합니까? 아니면 목적을 달성 했으므로 삭제해야합니까? 가지의 목록이 매우 길어질 것이므로 대부분의 것들이 더 이상 필요하지 않기 때문에 모든 곳에 주변에 가지를 두는 것이 더러운 것처럼 보입니다.

삭제해야하는 경우 그 기록은 어떻게됩니까? 실제 지점을 더 이상 사용할 수 없더라도 유지 관리됩니까? 또한 원격 지점을 제거하려면 어떻게해야합니까?

+20

을 사용하여 지점을 삭제할 수 있습니다. 지점을 아이디어로 생각하는 것이 도움이됩니다. 엄밀히 말하면, 브랜치가 나타내는 아이디어 (예 : 테스트 완료 및 마스터에 병합)에 대한 작업을 완료했다면 브랜치 자체에 대한 작업이 완료된 것입니다. – Cascabel

+2

내가 알고 싶은 점 : 원격 핫픽스가 제거되면 공동 작업하는 모든 개발자가 로컬에서 제거 할 수 있습니까? 그렇지 않으면; 이 일을 성취하는 방법? 한 사람이 핫픽스를 마스터로 마이그레이션한다고 생각하지만, 이후에는 모든 공동 작업자를 위해 정리해야 해당 분기에 커밋을 추가 할 수 없습니다. – rolandow

+0

동료 컴퓨터의 로컬 리포지토리에는 영향을 미치지 않습니다. 로컬에 지사를 삭제하라고 명령해야하거나 지트 후크/지사 보안을 사용하여이 서버 측을 강제로 삭제하여 지우려는 지점의 푸시를 방지 할 수 있습니다. – srz2

답변

130

git branch -d yourbranch으로 지점을 안전하게 제거 할 수 있습니다. 병합되지 않은 변경 사항이 포함 된 경우 (즉, 분기를 삭제하여 커밋을 잃을 수 있음) git이 알려주고 삭제하지 않습니다.

따라서 병합 된 분기를 삭제하면 비용이 적게 들며 기록을 잃지 않습니다.

원격 분기를 삭제하려면 원격 이름이 origin이고 삭제할 원격 분기가 mybranch 인 것으로 가정하고 git push origin :mybranch을 사용하십시오.

+25

"합병 된 지점 삭제는 저렴합니다" 그것 주위에. 당신이 그것을 지키면 시간이나 공간 git의 관점에서 중요한 성능이 없습니다. 즉, 모든 커밋이'master '의 이력에 이미 있기 때문에 지사를 삭제할 것이므로 훨씬 더 깔끔하게 정리할 수 있습니다. – MatrixFrog

+13

브랜치를 지우려는 이유 중 하나는 브랜치 (실제로는 모든 변경 사항)에서 많은 변경을 수행하므로 결국 'git branch'명령을 사용할 때 긴 목록을 얻게됩니다. 개요를 보려면 해당 목록을 짧게하고 싶습니다. 따라서 오래된 가지가 삭제 될 것입니다. Reale 릴리스에는 태그가 지정되어 있으므로 나에게 이처럼 불쾌감을주지는 않습니다. –

+5

이미 병합 된 분기를 삭제하는 것에 동의하지만 현재 분기에 병합되지 않은 분기 목록을 보려면 다음을 사용할 수 있습니다. git branch --no-merged – lsklyut

1

성공적으로 병합되었거나 태그가 추가 된 경우 더 이상 사용하지 않는다고 말할 수 있습니다. 따라서 안전하게 git branch -d branchname을 할 수 있습니다.

41

내가해야 할 일은 내가 출시 한 모든 것을 태그하는 것입니다. 당신이 적극적으로 개발할 때 주변에 가지를 유지하십시오.

git branch -d branch_name 

삭제 된 지점은

git push origin --delete branch_name 

또는 이전 구문 "원점에 branch_name에 아무것도 넣지"로 읽고

git push origin :branch_name 

와 서버에서 삭제 .

즉, DAG (directed acyclic graph)가 가리킬 수있는 한 커밋이 기록에 남습니다.

Google "git-flow"이며 릴리스 관리, 분기 및 태그 지정에 대한 더 많은 통찰력을 제공 할 수 있습니다. 질문은 "github에"태그를 가지고 있기 때문에

25

, 나는이를 추가 할 것 : 특별히 Github에, 만약 당신이 풀 요청 지점과는 UI를 통해 또는 풀 요청의 분기를 병합하여 하나 (통합됩니다), 지점을 제거하더라도 사용자가 끌어 오기 요청 데이터 (설명 포함) 을 잃지는 않습니다.

결과 : 끌어 오기 요청을 워크 플로의 일부로 통합하면 (코드 검토와 잘 어울림) 병합이 완료되는 즉시 안전하게 지울 수 있습니다. 이것은 최근에 Github이 끌어 오기 요청을 병합 한 직후에 "지점 삭제"버튼을 팝업하는 (달콤한) 기능을 추가 한 것이 너무 흔한 일입니다.

그러나 각 그룹이 가장 적합한 워크 플로우를 채택해야한다는 점에 유의해야합니다. 또한 해당 분기를 삭제할 수도 있고 그렇지 않을 수도 있습니다. 예를 들어, 현재 작업 팀은 풀 요청이 병합 되 자마자 마스터 또는 배포 관련 (예 : 프로덕션, 스테이징 등)이 아닌 모든 지점을 정리하고 관련 커밋이 어떻게 형성되는지 계속 추적합니다 각 제품의 점진적인 개선.

물론 히스토리 관리 (끌어 오기 요청 또는 기타)는 버전의 적절한 태깅을 대체하지 않습니다 (사용자가 버전을 배포/패키지하는 동일한 도구/스크립트로 자동화하는 것이 바람직 함). 따라서 사용자를 언제든지 신속하게 전환 할 수 있습니다 주어진 순간에 일어난다. 태깅은 원래의 문제를 해결할 수있는 열쇠이기도합니다. "작업"브랜치에 병합 된 모든 브랜치를 삭제할 수 있고 삭제해야하며, 버전 태그, "프로덕션"등에 병합 된 모든 브랜치가 , 당신은 항상 미래 버전에 통합 될 때까지 살아있는 핫픽스를 갖게 될 것입니다.

+1

Github이 나에게 "지사 삭제"버튼을 보여준 이유를 설명해 주셔서 감사합니다. –

+0

우리는 sourcetree를 사용하고 있으며 로컬 핫픽스 지점과 원격 핫픽스 지점을 열어 둘 수있는 옵션을 제공합니다. ** 핫픽스 분기를 닫으면 삭제하는 것이므로 재사용 할 수 없다고 생각했습니다. ** 예 : 우리는 앞으로 5 일 동안 매일 핫 픽스를해야합니다. 그런 다음 닫습니다. 하지만 여섯째 날에 다른 핫픽스가 필요하다고 해봅시다. 새로운 핫픽스 분기를 만들지 않습니까? – Danger14

+0

사람들이 일반적으로하는 일입니다. 개별적으로 이름을 지정하는 것이 불가능한 경우 해당 날짜를 기준으로 이름을 지정하거나 관리하는 티켓 시스템 (있는 경우)에 대한 참조를 기준으로 지정할 수 있습니다. 물론 git 워크 플로는 "팀에서 가장 잘 작동하는 것"기반으로 적용되어야하기 때문에 다르게 작업하기로 결정하더라도 걱정하지 않아도됩니다. – chesterbr

6

분기 삭제의 단점은 GitHub의 해당 분기에 대한 하이퍼 링크가 손상된다는 점입니다.이 질문은 github 태그입니다. 해당 링크에 대해 404 Not Found 오류가 발생합니다. 그래서 GitHub에서 분기를 삭제 한 후 링크가 커밋 또는 태그를 가리 키도록 변경합니다.

전자 메일과 같이 일부 링크를 변경할 수 없기 때문에 GitHub 분기로의 하이퍼 링크를 완전히 피하고 첫날부터 커밋 또는 태그에 연결하지 않아야합니다.

분기가 병합 된 후에 삭제하는 것을 선호합니다. 이렇게하면 저장소에있는 많은 분기의 시각적 인 혼란을 방지 할 수 있습니다. 이 분기는 또한 저장소의 모든 포크로 전달됩니다.

먼저 로컬 브랜치를 삭제합니다. 이렇게하면 나중에 우연히 푸시되는 것을 방지 할 수 있습니다.

git branch -d branchName 

는 그럼 그럼 난 GitHub의에 지점을 삭제 원격 추적 브랜치

git branch -dr remoteName\branchName 

을 삭제합니다. 나는 웹 인터페이스를 사용한다.

git push remoteName :branchName 

분기가 병합되지 않아도 일반적으로 저는 후손에 대해 커밋을 유지하려고합니다. 그러나 나는 아직도 가지를 지우고 싶다. 커밋을 퍼뜨리고 가비지 컬렉터에 의해 커밋되지 않게하려면 삭제 된 브랜치와 동일한 커밋을 가리키는 주석 태그를 만듭니다.

git tag -a tagName commitOrBranchName 

는 그럼 난 태그가 당신은 그것의 역사를 잃지 않고 2011_Hotfix 분기를 삭제할 것 같다

git push remoteName tagName 
3

GitHub의에 밀어 넣습니다. 나는 먼저 삭제와 역사에 대해 토론 할 것이다.

일반적인 git 브랜치 삭제 방법은 이미 위에 설명 된대로 예상대로 작동합니다.git에는 "안녕 git, 로컬 및 원격 분기를 모두 삭제합니다."라는 의미의 한두 단어 명령이 없습니다. 그러나이 동작은 쉘 스크립트를 통해 모방 될 수 있습니다. 예를 들어 Zach Holman's shell script 'git-nuke'을 입력하십시오. 그것은 매우 간단합니다 : 당신의 $PATH 디렉토리 중 하나에있는 실행 파일 (예를 들어, git-nuke)에서

#!/bin/sh 
git branch -D $1 
git push origin :$1 

넣어이. 2011_Hotfix 지점에 없으면 git-nuke 2011_Hotfix을 실행하면 로컬 분기와 원격 분기를 모두 삭제합니다. 이것은 표준 git 명령보다 훨씬 더 빠르며 - 아마도 더 위험 할 수도 있지만 훨씬 더 빠릅니다.

기록 보존에 대한 우려는 좋습니다. 이 경우 걱정할 필요가 없습니다. 2011_Hotfixmaster에 병합하면 2011_Hotfix의 모든 커밋이 master의 커밋 기록에 추가됩니다. 즉, 간단한 병합에서 기록을 잃지는 않을 것입니다.

나는 질문에 대한 범위를 벗어날 수있는 단어를 한 개 더 추가했지만 그럼에도 불구하고 관련이 있습니다. 2011_Hotfix에 20 개의 작은 "작업 중"커밋이 있다고 상상해 봅시다. 그러나 2011_Hotfix에 대한 완전한 커밋 중 하나만 master의 기록에 추가하려고합니다. 20 개의 모든 커밋을 어떻게 하나의 커밋으로 결합합니까? 다행히도 gitgit-rebase을 사용하여 여러 커밋을 하나의 커밋으로 통합 할 수있게합니다. 나는 그것이 어떻게 작동하는지 여기에서 설명하지 않을 것이다; 그래도 관심이 있다면 the documentation for git-rebase이 우수합니다. git rebase은 기록을 다시 작성하므로 신중하게 사용해야하며 현명하게 사용해야합니다. 마지막으로, 2011_Hotfix 시나리오는 솔로 데브가 아닌 개발팀에 관한 것입니다. 프로젝트 팀원이 git rebase을 사용하는 경우 팀에 속한 일부 카우보이 개발자가 무의식적으로 프로젝트 git의 기록을 손상시키지 않기 위해 git rebase의 사용에 대한 명시적인 가이드 라인을 보유하는 것이 좋습니다.

0

github, BitBucket과 같은 모든 주요 웹 UI에서 분기를 삭제할 수 있습니다. 지점을 온라인에서 삭제 한 후

git remote prune origin 
관련 문제