2011-12-29 5 views
2

나는 여기에 몇 사람과 작업하는 자식 저장소가있다. branch.master.rebase = truebranch.master.mergeoptions = --no-ff을 설정했지만 문제가 생겼습니다.힘내 : 깨끗한 내역 트리를 유지하는 데 문제가있다.

누군가가 지형지 물을 master로 병합하려고했습니다. 합병은 성공적이었고, git은 지점이 origin/master보다 30 커밋이라고 말했다. 그가 변경 사항을 밀어 넣으려고 할 때, git은 원격 위치가 변경되어서 git을해야하기 때문에 밀어 넣기를 거부했습니다. 그가 당김을했을 때, 자식은 마스터로 합병 된 커밋에 대한 rebase를 만들었고, 이제는 마스터보다 29 커밋 만 남았습니다.

내가 병합 때문에 REBASE 후, 잃어버린 커밋 생각, 기능 지점에서 온 새로운 커밋으로 다시 적용 커밋, 그리고 커밋. 내가 '무엇을,

* c4 (head, master, feature_branch, origin/master) 
| \ 
| * c3 (origin/feature_branch) 
| * c2 
| * c1 
|/
* 

병합은 빨리 감기 병합처럼 보였다 :

* c3'(head, master, origin/master) 
* c2' 
* c1' 
| * c3 (feature_branch, origin/feature_branch) 
| * c2 
| * c1 
|/
* 

내가 달성하기 위해 노력했다 즉 :

는 푸시 후, 나무는 그렇게했다 나는 분열의 역사를 지키려고 노력하고 있습니다.

내가 이것을 피할 수있는 방법에 대한 유용한 정보가 있습니까?

감사합니다,

편집 :이 문서는 내 문제 descibes : http://notes.envato.com/developers/rebasing-merge-commits-in-git/

지금 내가 알고 있어요 git rebase에 대한 옵션을 --preserve을-병합하지만,이 옵션을 만들 수있는 방법이 태만?

그렇지 않으면 개발자는 git pull 대신 git fetchgit rebase origin/master이되어야합니다. 모든 분기 기록을 저장하려면

+1

다음 링크를 사용해보십시오. http://www.randyfay.com/node/89 가장 도움이되었습니다. –

+0

는 Luckly 여기 devs 명령 .. 자식 푸시 --force''에 대해 알고하지 않습니다하지만 난 당신이 더 설명해 주시겠습니까 수,이 문서가 도움이 될 방법을 모르겠어요? 우리는 모든 작업이 마스터로 병합되기 전에 검토되기 때문에 feature_branches를 원격으로 푸시합니다. 따라서 병합하기 직전에 브랜치를 리베이스 할 수 없습니다. 처음으로 브랜치를 푸시하기 전에 마스터에서 리베이스해야합니다. –

+0

개인적으로 "병합 워크 플로의 대안"에서 언급 한 끌어 오기 요청 전략이 마음에 듭니다. 이 검토 과정에 http://code.google.com/p/gerrit/을 사용할 수 있습니다. 마스터 브랜치와의 병합을 담당하는 한 사람은 제한적이어야하며 병합 할 수없는 경우 풀 요청을 거부해야합니다. –

답변

3

왜 당신은 진정한 = branch.master.rebase를 사용합니까?

+0

나는'--rebase' 명령으로 병합 커밋을 잃을 것이라는 사실을 몰랐습니다. –

+0

"업스트림 브랜치에 이미 변경 사항이 포함되어있는 경우 (예 : 업스트림에 적용된 패치를 메일로 보냈기 때문에) 해당 커밋은 건너 뜁니다." 병합 커밋은 이전 커밋에 이미 포함 된 변경 사항을 나타냅니다. 그래서 그것은 건너 뛸 것입니다. –

+0

또한 분기 병합을 피하기 위해이 옵션을 설정했습니다. 기능 내역 만 유지하고 싶었습니다. –

3

기록을 깨끗하게 유지하는 것은 많은 시간을 지나치게 강조합니다. DAG (directed acyclic graph)의 특성은 특정 커밋 (sha1s, 태그, 브랜치, 트리 쉐어 등)에 대한 참조 집합을 쉽게 설정하여 커밋이 이미 병합되었는지 또는 어떤 커밋이 여전히 필요가 있는지 확인할 수 있습니다. 재배치하지 않으면 병력이보다 정확하게 보존되어 병행 된 병력과 병합 된 병력을 보여줍니다.

당신이 당신의 기능을 작게 할 수 있다면 당신은 매우 지점 당 기능을 사용하여 어쨌든 구성 할 수 있습니다, 추가합니다.

https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR

가 처음에 내 역사는 친절하고 깔끔한 및 선형 유지 좋아 : 이것은 우리가 사용하는 워크 플로우이다. Git을 점점 더 많이 사용함에 따라 SVN과 같은 비 -DVCS 도구를 사용하는 것이 이월되었다는 것이 분명해졌습니다.

+0

지점 용 지점을 만듭니다. 역사를 깨끗하게 유지함으로써 분기를 병합하는 것을 의미하므로 커밋 트리를 이해하기 쉽습니다. –

+0

기능 내에서 병합에 대해 이야기하거나 기능을 통합하기 위해 병합하는 경우에 따라 다릅니다. –

관련 문제