2017-12-28 71 views
0

커밋에 두 일찍 커밋 가입 :는 어떻게이 같은 저장소에

BB2 갈등을 가지고 merge commit에 해결되었다
init---A---A2---...---[D---B---merge]---...---master 
         \ /
         C---B2 

.

이제 커밋에 AA2을 추가하고 싶습니다. A. 그리고

git rebase -i <commit id of init> 

하고

pick xxxxxxx A 
squash xxxxxxx A2 
... 

pick xxxxxxx A 
pick xxxxxxx A2 
... 

을 변경하려고했지만 B2를 적용 할 때 충돌 등장, 그리고 수동으로 그냥에서 한 일처럼 갈등을 처리해야 merge.

실제로 전체 커밋 트리에서 대괄호보다 훨씬 많은 복잡한 구조가 있습니다. 따라서 모든 충돌을 수동으로 처리하는 것은 현실적이지 않습니다.

rebase을 사용할 때 전체 커밋 트리가 한 줄로 병합되고 커밋을 적용하여 충돌을 자동으로 처리하지 않습니다. merge.

그렇다면 커밋 A와 A2에만 참여할 수 있지만 여전히 A2 이후의 모든 커밋 구조가 그대로 유지되어 작업 후 저장소가 '동일하게 보이도록'할 수 있습니까?

추가 설명을 위해, 커밋 A에는 테스트 파일에 몇 가지 중요한 정보가 추가되어 커밋 A2에서 제거되었습니다. 이 정보를 영구적으로 삭제할 수 없으면이 프로젝트를 게시 할 수 없습니다. 이 상황에 대한 대체 솔루션이 있습니까?

+1

[Git 저장소의 처음 두 커밋 결합?] (https://stackoverflow.com/questions/435646/combine-the-first-two-commits-of-a-git-repository) – yarwest

+1

있음 짧아, 할 수 없어. 일단 커밋을 만졌을 때, 모든 아이들은 더 이상 동일하지 않게됩니다. 당신이 할 수있는 최선의 방법은 아이들의 변화를 다시 적용하여 똑같이 "외모를 갖춰"보는 것입니다. 이미 수백 개의 커밋과 브랜치를 가지고 있다면 원하는 리베이스 작업을 쉽게 수행 할 수있는 방법이 없습니다. 다시 말해서 저장소 복제본의 모든 복제본을 다시 가질 필요는 없습니다. 현실적이지 않습니다. –

+0

문제는 첫 번째 커밋에 참여하는 것이 아니라 수백 개의 커밋을 처리하는 것입니다.이 커밋에는 이미 많은 병합과 커밋 트리가 있습니다. 그래서 어쩌면 @ 애드리안 Shum 맞아요, 나는 그것을 할 수 없어 내가 더 포기할 것입니다 – Dizzam

답변

1

대화식으로 리베이스해야합니다 (또는 '스쿼시'라고도 함). 변경하려는 커밋이 처음 두 개라면 repo의 루트에서 리베이스 할 수 있습니다.

git rebase -i --root 
pick hash X 
squash hash Y 
pick hash Z 

-i 당신이 대화를하고있을 것입니다 의미

이 같은 작은 선물을 보일 것이다. --root은 repo의 루트에서 시작하는 것을 의미합니다.

첫 번째 명령 다음에 첫 번째 커밋이 맨 위인 커밋 목록이 표시됩니다. 처음 두 커밋을 병합하려면 먼저 pick 키워드로 첫 번째 커밋을 유지하고 이전의 커밋을 squash 키워드를 사용하여 병합하면됩니다. pickreword으로 바꾸면 첫 번째 커밋 메시지를 편집 할 수도 있습니다.

이 작업을 완료 한 후에는 다른 모든 커밋을 그대로두고 확인해야합니다.

자세한 내용은 here

0

또한 두 일찍 함께 커밋에 가입하도록 사용 단계를 사용할 수 있습니다 찾을 수 있습니다.

master 지점에 참가할를 저지하고, 같은 역사를 커밋 가정

A---B---C---D---…---X master 

B를 저지 가입 후 C 커밋 커밋 히스토리를 유지하면서 함께 C를 저지하기 위해 (에 D에서 커밋 X), 당신은 명령 아래에 사용할 수 있습니다

git checkout -b temp <commit id for A> 
git merge <commit id for C> --squash 
git commit -m 'join B and C together' 

을 지금 M이 t입니다 역사는 수 (커밋합니다 커밋 그는 스쿼시, 커밋 합병) B 커밋과 함께 C을 커밋 가입 : 커밋 (

git rebase --onto temp <commit id for C> master 
git push -f origin master 
git branch -D temp 

이제 될 것입니다 master 분기에 역사를 커밋 :

A---B---C---D---…---X master 
\ 
    M temp 

이 그런 후 C 커밋 커밋 다음을 리베이스 수 M은 커밋 참여 커밋 B이고 커밋 C 함께) :

A---M---D'---…---X' master 
+0

답장을 보내 주셔서 감사 드리며 귀하의 지시를 따르려고했습니다. 그러나 리베이스 프로세스 중에 충돌이 발생했습니다. 그리고 나는이 문제를 해결 한 후에 더 많은 갈등이 나타나기 때문에 그 과정을 계속할 수 없었다. 왜 이런 일이 발생하는지 모르겠지만 다른 커밋 트리에서 같은 파일 작업과 관련이 있다고 생각합니다. 또한 모든 충돌을 수동으로 처리하는 것도 현실적이지 않습니다. – Dizzam

+0

rebase 중에 충돌이 없어야합니까? 'git merge --squash 명령 중에 충돌을 병합 했습니까, 아니면 병합 후에 변경 했습니까? –

+0

또한 'git rebase --onto temp C master' 명령 (commit ** C ** **)과 같이 올바른 시작 커밋으로 리베이스해야합니다. –