2014-02-19 4 views
3

에 나무를 합병리베이스는 내가 (여러 병합은 있지만 더 복잡한) 다음과 같은 역사에 가까운 무언가가 망할 놈의

모든 브랜치 커밋을 프라임 브랜치와 동일한 커밋으로 리베이스하여 병합을 보존하고 싶습니다 (아마도 리다이렉션 된 트리에 해당 커밋이있는 위치의 해시를 수동으로 지정하여). K′H′J′을 병합해야한다고 어떻게 알립니까? 또는 이러한 병합 커밋을 수동으로 다시 만들어야합니까?

내가 git rebase -p --onto B′ B L을 쓰면 제대로 적용되지 않습니다. 나는 D′B′MH을 리베이스하고 K′ (등 다른 지점에가/표시하지 병합합니다)에 L을 리베이스 한 후, K 자신을 병합 다시 있지만, 작품의 공정한 조금 될 수 있습니다.

나는 severalotherquestions을 보았지만 그 중 어느 것도 병합을 특징으로하지는 않았다.

+0

개인 정보 저장소가 비공개입니까, 아니면 GitHub에서 공개적으로 액세스 할 수 있습니까? 공개 된 경우 사람들은 직접 살펴볼 수 있습니다. –

+0

개인 레포 인 경우'git filter-branch --parent-filter ... --all' 명령으로이 작업을 수행 할 수 있어야합니다. 부모 필터의 스크립트는'B'를 식별하고 새로운 부모는 'A'대신 'A'가되어야합니다.다시 쓰는 부분의 태그를 보존하려면'--tag-name-filter cat'을 추가하는 것이 좋습니다. 공개 레포 인 경우 이는 권장 할만한 사항이 아닙니다. 당신도'--commit-filter'를 사용할 수있는 것처럼 보입니다 만, 좀 더 일반적입니다 ... – twalberg

답변

3

공개 리포지토리가 아니거나 다른 리포지토리 사용자가 중요한 다시 쓰기를 수행한다고 가정하면이 작업을 수행하는 가장 효율적인 방법은 git filter-branch입니다. 가능한 필터 중 하나는 --parent-filter이며 특정 커밋의 상위를 변경하거나 트리의 일부를 접목 또는 리베이스하는 것과 비슷하지만 --all 옵션도 전달할 수 있으므로 여러 분기에서 효과를 얻을 수 있습니다. 하나의 호출. 이는 --commit-filter; 그러나 이것은 부모뿐 아니라 개인 커밋의 다른 측면을 변경하기위한보다 일반적인 해결책입니다. 다시 트리를 쓰는 부분의 태그를 이동하려면 --tag-name-filter cat을 사용하는 것이 좋습니다. <somescript>이 중 하나를 적절하게 인용

git filter-branch --parent-filter <somescript> --tag-name-filter cat -- --all 

가/정보가 제공되는 기능과 정확하게 방법 (세부 사항을 커밋 B에 대한 A'A을 대체 할 bash 코드를 탈출 :

그래서 마지막 명령은 같을 것 스크립트와 스크립트의 결과는 git help filter-branch에서 찾을 수 있습니다), 또는 동일한 결과를 얻는 실제 쉘 스크립트의 이름.

나중에 수행 할 정리가 있습니다. filter-branch은 원래 분기를 그대로 두지 만 새로운 이름 (refs/original/...)을 사용하므로 올바르게 표시되지 않으면 복구 할 수 있습니다. filter-branch가 원하는 것을 수행하고 저장소 공간을 복구하기 위해 저장소를 다시 포장했기 때문에 죽은 가지를 제거하는 방법에 대한 많은 정보가 있으므로 여기에 복제하지 않을 것입니다.

+0

'--all' 플래그 앞에 이중 대시가 필요합니다. 그 플래그는 서브 명령에 보내집니다 :'git filter- branch -f --parent-filter '테스트 $ GIT_COMMIT = HASH_OF_B && echo "-p HASH_OF_A_PRIME"|| cat '--allall하지만 그렇지 않으면 효과가있었습니다. 고맙습니다. –

+0

아, 네, 그 부분을 잊어 버렸습니다 - 후손을 위해 그것을 편집했습니다 .... – twalberg

1

대화 형 리베이스를 사용해 보셨습니까? 기본적으로 git rebase -i A을 실행하면 git가 A 뒤에 나열된 커밋과 함께 텍스트 편집기를 시작합니다. 그런 다음 커밋을 이동하고 커밋을 서로 공유하여 마음의 콘텐츠를 볼 수 있습니다.