2009-09-25 3 views
5

git merge 및 rebase 문서를 파헤쳐 왔으며 무언가가 침몰하지 않았습니다. Git 프로젝트에서 적극적으로 작업 중이며 특정 이정표를 다른 사람과 공유해야합니다. 개발자. 각 이정표/릴리스와 정확히 똑같은 코드를 공유하고 싶지만 각 릴리스에 이르는 모든 작은 커밋이 아닙니다.공개 릴리스에 대한 Git rebase/merge

개발 분기를 반영하는 릴리스 분기를 만들려면 어떻게합니까? 배포 분기의 커밋마다 개발 분기의 커밋이 여러 개 포함되어 있습니까? 즉, 릴리스 분기에는 압축 된 내역이 있어야하지만 그렇지 않으면 개발 분기와 일치해야합니다.

원래 별개의 브랜치를 사용하고 git merge --squash를 사용하면 각 릴리스 간의 변경 사항 전체를 반영하는 일련의 커밋으로 새로운 브랜치를 만드는 것이 효과적 일 것이라고 생각했습니다. 이제 git merge --squash가 반복적으로 사용되지 않는다는 것을 이해합니다.

Git rebase는 여러 커밋을 하나의 큰 커밋으로 축소하려고하지만 커밋 기록을 변경하기 때문에 공개 기록뿐만 아니라 내 개인 기록도 변경하지 않겠습니까?

작은 변경 내역을 잃고 싶지는 않지만 결합 된 커밋을 공유 서버로 푸시하고자합니다.

답변

7

분명히 커밋이 공개적으로 공개 할 가치가있는 저작물을 구성하는 경우 공개 된 기록의 일부를 구성해야합니다. 전체 저장소 기록을 게시하지 않으려면 git archive을 사용하여 릴리스 타볼을 만드는 것이 더 나을 수 있습니다.

그렇다면 실제로 별도의 기록이있는 릴리스 분기를 만들려면 가능합니다. 하지만 사설 히스토리와 공용 릴리스 브랜치를 병합 할 수는 없기 때문에 유지 관리 오버 헤드를 추가로 확보해야합니다. 모든 개인 기록을 릴리스 지점으로 가져올 수 있습니다. 이것은 자식이하는 일입니다. 변경 사항의 출처를 추적합니다.

릴리스 브랜치에서 사설 브랜치로 병합 할 수 있지만 작업이 사설 브랜치에서 나오는 것처럼 (아마도) 많은 이득을 얻지는 못합니다. 가장 쉬운 방법은 릴리스 지점에서 사설 분기 상태의 스냅 샷 커밋 만 포함하는 별도의 릴리스 분기를 만드는 것입니다.

사기 지점 (private)의 현재 커밋을 기반으로 릴리스 분기 (release)에 커밋을 만들고 사용자가 트리를 체크 아웃 할 것으로 가정했을 때 색인을 변경하지 않고 여기에서 할 수있는 일이 있습니다.

# Low-level plumbing command to switch branches without checking anything out 
# (Note: it doesn't matter if this branch hasn't yet been created.) 
git symbolic-ref HEAD refs/heads/release 

# Create a new commit based on the current index in the release branch 
git commit -m "Public release commit" 

# Switch back to the private branch 
git checkout private 

은 각 릴리스 (또는 하위 버전) 및 개인 역사의 어떤을 통합하지 않고 이전 릴리스의 바로 위에 건설 될 예정 커밋 새로운이 작업을 수행 할 수 있습니다.

+0

확실히 그 일을합니다. 나를 위해 일했다 :) –

+0

고마워, Charles. 그게 내가 원하는거야. – Neil

2

새 분기를 만들고 모든 분기를 수행하십시오. 그런 다음 게시하십시오. 더 작은 커밋은 다른 지사에 계속 남아 있습니다. 이것에 대한

내 워크 플로우는 다음과 같이 보일 것입니다 :

git co -b release_branch_squash release_branch_with_all_commits 

git rebase last_release_tag 

지금은 발생할 수있는 모든 충돌을 처리하는 시간이다. 나는 실제로 이것을 피하기 위해 을 모른다. 보통 문제는별로 없습니다. 내 자식 저장소 이미 어쨌든 대부분의 충돌 해결을 기록했다.

git rebase --interactive last_release_tag 

이렇게하면 vim이 나타납니다. 내가 스쿼시하고 싶은 모든 릴리스에 대해 을 squash으로 바꿉니다. 그런 다음 저장하고 종료하십시오. 끝난.

+0

자세히 설명해 주시겠습니까? http://stackoverflow.com/questions/1464642/git-merge-squash-repeatedly/1465119#1465119와 같은 코멘트에서 반복되는 병합처럼 보입니다 - 스쿼시가 작동하지 않습니다. 이 파일을 보았을 때 파일에 공통된 기록이 있어도 충돌 목록이 매우 길어졌습니다. 내가 올바르게 이해한다면, git merge --squash는 이전 커밋의 이력을 공유하지 않는 새로운 커밋을 생성하므로, 미래의 병합에는 공통 조상이 없다. 당신이 원하는 행동을 묘사했지만 힘내라. – Neil

+0

제안 된 워크 플로우로 답변을 업데이트했습니다. Charles Bayleys 솔루션이 사용자의 요구에 더 적합 할 수 있음을 인정해야합니다. – davrieb

관련 문제