2016-08-18 1 views
8

커밋을 수정하지 않고 브랜치 중간에서 여러 커밋을 스쿼시하려고합니다.브랜치 중간에서 힘 스쿼시가 커밋됩니다.

는 내가 가진 : HB -- C -- D에 해당 어디

A -- B -- C -- D -- E -- F -- G 
|        | 
master      dev 
origin/master 

내가

A -- H -- E -- F -- G 
|     | 
master    dev 
origin/master 

에 그 스쿼시 싶습니다. 그리고 나는 커밋 메시지를 H으로 지정할 수 있기를 원한다. A은 푸시 된 마지막 커밋이므로 그 이후 커밋 된 모든 커밋은 서버를 엉망으로 만들지 않고 다시 작성할 수 있습니다. 아이디어는 내가 빨리 앞으로 보내기 전에 역사를 청소하는 것입니다 master.

어떻게하면됩니까?

추신 : 내 경우에는 실제로 중간에 스쿼시하기 위해 3 개 이상의 커밋이 있지만 3 개로 할 수 있다면 더 많이 할 수 있어야합니다.

PPS : 가능하면 E, FG (주로 커밋 날짜와 관련 있음)을 유지하는 솔루션을 선호합니다.

+0

[Git을 푸시하기 전에 여러 커밋 결합하기] 가능한 복제본 (http://stackoverflow.com/questions/6934752/combining-multiple-commits-before-pushing-in-git) –

답변

13

대화 형 rebase를 수행하고 스쿼시하려는 커밋을 손으로 선택할 수 있습니다. 이것은 dev 브랜치의 히스토리를 다시 작성하지만,이 커밋을 푸시하지 않았기 때문에 자신의 컴퓨터에서 일어날 수있는 일 이외에 이것으로부터 어떠한 부정적인 여파도 있어서는 안됩니다. 와

시작 다음

git checkout dev 
git rebase -i HEAD~6 

이 당신에게 7 커밋의 다음 목록을 보여주는 dev 지점의 HEAD에서 다시 6 단계를가는 창을 표시해야합니다

pick 07c5abd message for commit A 
pick dl398cn message for commit B 
pick 93nmcdu message for commit C 
pick lst28e4 message for commit D 
pick 398nmol message for commit E 
pick 9kml38d message for commit F 
pick 02jmdmp message for commit G 

위의 첫 번째 커밋 (A 위)은 이며 가장 오래된 숫자는이며 가장 최근의 커밋이 가장 최근의 것입니다. 기본적으로 각 커밋에 대한 옵션은 pick입니다. 이제 리베이스를 마친 경우, 각 커밋을 그대로 유지할 수 있습니다. 실제로는 아무 작업도 수행하지 않습니다. 하지만 당신은 어떤 중간 커밋 스쿼시, 편집 및 이에 대한 목록을 변경하려면 이후 :

pick 07c5abd message for commit A 
pick dl398cn new commit message for "H" goes here 
squash 93nmcdu message for commit C 
squash lst28e4 message for commit D 
pick 398nmol message for commit E 
pick 9kml38d message for commit F 
pick 02jmdmp message for commit G 

참고주의 깊게 위에서 무슨 일이 일어나고 있는지를. squash을 입력하면 Git에게 그 커밋을 위의 위의 커밋과 병합하도록 알려주는 커밋 인 커밋을 즉각적으로 으로 커밋합니다. 그래서이 C을 커밋 뒤쪽에 D을 커밋 스쿼시, 다음 하나의 커밋 B, CD 커밋 당신을 떠나, BC 스쿼시 말한다. 다른 커밋은 그대로 유지됩니다.

파일을 저장하고 (Windows의 경우 Git Bash에서는 : wq) 리베이스가 완료되었습니다. 예상대로 병합 충돌을 얻을 수는 있지만 병합 문제를 해결하는 데 특별한 것은 없으며 정기적 인 리베이스 또는 병합과 마찬가지로 계속 수행 할 수 있습니다.

당신이 REBASE 후 지점을 검사하는 경우, 당신은 E, FG 지금이 커밋이 실제로 새로운 커밋에 의해 대체되었습니다 때문이다 등 새로운 해시, 날짜를 가지고 커밋 알 수 있습니다. 그 이유는 기록을 다시 작성했기 때문에 일반적인 커밋은 더 이상 이전과 같을 수 없기 때문입니다.

+0

감사합니다. 나는 이것이 그렇게 쉬운 일일 것이라고 기대하지 않았다. 그러나 마지막 3 가지 커밋을 다시 작성하지 않고 동일한 작업을 수행 할 수있는 방법이 있습니까? 나는 자식이 3 개의 새로운 커밋을 만들었다는 것을 알았습니다 (커밋 날짜는 현재 날짜 임). – deadbeef

+1

@deadbeef 질문을 잠시 생각해 보면 대답이 '아니오'여야 만하는 이유를 알 수 있습니다. 'E','F','G'가 커밋되기 전에 무슨 일이 일어 났는지 다시 썼기 때문에이 세 커밋은 다시 작성되고 실제로는 새로운 커밋이됩니다. –

+0

나는 잠시 숙고하고 있었고 불가능하다는 것을 깨달았습니다. 예 :-). 그러나 나는'git rebase --committer-date-is-author-date'를 찾았는데 기본적으로 원하는 것을 수행합니다 (원래의 커밋 날짜를 유지합니다). – deadbeef