2014-12-24 6 views
9

가 여기에 시나리오 : 내가 자식에 지점을 리베이스하고git rebase - 계속 하시겠습니까? 그러나 충돌 해결 중 변경 사항을 문서화하기 위해 커밋 메시지를 수정 하시겠습니까?

  • , 나는 충돌을했고, 단지 그들을 해결 (git add 모든 것을했다).
  • 일반적으로, 난 그냥
  • 내가 충돌

을 해석 할 때 내가 만든 변경 사항을 설명하기 위해, 커밋이의 커밋 메시지를 편집 할 REBASE를 진행 git rebase --continue를 실행하는 것입니다 내가 돈 ' 일반적으로이 작업을 수행하지만,이 특정 충돌에는 문서화가 필요하다고 느끼는 심각한 레코딩이 필요했습니다.

어떻게해야합니까? 나는 일종의 git rebase --continue --let-me-edit-the-message-first 명령어가 바라고 있어요,하지만 난 the documentation

에서 찾을 수 없었던 나는 알고 수동으로 복사, 내가 커밋 자식을 실행할 수

  • 메시지를 커밋 기존의 그런 다음 수정하십시오. 나는 이것을하고 싶지 않다. git rebase은 커밋 메시지가 어딘가에 저장되어 있어야합니다. 왜냐하면 커밋시 원래 메시지를 넣을 것이기 때문입니다. 그 사이에 편집 내용을 삽입하려고하기 때문에.
  • 그냥 git rebase --continue을 실행 한 다음 git rebase -i을 사용하여 나중에 돌아가서 해당 커밋 메시지를 편집 할 수 있습니다. 이를 위해서는 전체 (잠재적으로 긴) rebase 프로세스를 통해 커밋이 변경된 것을 기억해야합니다. 왝.

나는 이미 이것에 대한 답을 찾지 못해서 놀랍다. 나는 이것을 할 방법이있다. 이것에 대한 대답이 있다면 그것을 찾는 것이 어려웠습니다. 나는 특별한 경우 (같은이 this)에 대한 매우 구체적인 보이는 변화를 해결 한 후 git add 또는 git rm의 필요성 금액 혼란 같은 것들 (같은 this), 일반 git rebase 지혜 (같은 thisthis), 질문을 많이 발견했다.

나는 놀랍기 때문에이 대답을 찾을 수 없었습니다. 저는 2 차 질문이 있습니다. 리베이스하는 동안 변경된 사항을 문서화하는 근본적인 방법이 있습니까?

+1

당신이 물어보기 전까지 힘내라. 그냥 (rebase, conflict, add, continue -> editor'). 리베이스 할 때 커밋 메시지 편집기를 본 적이 있습니까? 어느 자식 버전에 대해 이야기하고 있습니까? –

+0

''git rebase --continue''를 실행 한 후에 커밋 메시지 편집기를 본 적이 없다고 생각합니다. 나는 git version 1.9.1로 작업하고있다. 그러나 최근 버전에서 큰 차이가 있었다면 너무 놀라지 않을 것이다. – stochastic

+0

지금까지 Git 1.9.x를 사용해 보지 못했지만 추측 할 수 있습니다. 아마도'GIT_EDITOR' 환경이나'core.editor' 설정이 엉망이 될 수도 있습니다. 'git rebase --continue'를 실행 한 후에 오류가 발생 했습니까? 그냥 안전한쪽으로 가야합니다 : 어느 rebase 모드를하고 있습니까? 브랜치, 스왑/삭제/리비전/커밋 편집을위한 대화 형 리베이스로 또는 그 반대로 리베이스? 편집하여 버전과 함께 게시물의 시나리오를 완성하십시오 (완성 된 경우 내 게시물을 너무 많이 올려 놓을 것입니다). –

답변

3

나는 이것이 결코 문제가되지 않는다. (직장에 힘내 배쉬는 그래서 어쩌면이 다르게 작동 다른 버전입니다.)

어느 쪽이든, 당신은 다음 당신이 할 수있는 문제에 대한 해결책 찾을 때까지 :

git reset --hard HEAD 
git cherry-pick $(head -1 .git/rebase-apply/patch) 

해결을

을 충돌을
git commit 
git rebase --skip 

당신은뿐만 아니라 별칭을 만들 수 있습니다

git config alias.rebase2cherry "! git reset --hard HEAD; git cherry-pick $(head -1 .git/rebase-apply/patch)" 
git config alias.commitskip "! git commit; git rebase --skip" 

대화 REBASE 가져다 않습니다 해당 커밋에 대해 pick을 선택한 경우에도 충돌이있을 때 편집 메시지 화면을 표시하십시오. 그러나 기본적으로 포함 된 충돌하는 파일이있는 체리 선택과 동일한 형식을 사용하지 않습니다.상호 작용하는 다른 명령에 대한

은 벚꽃이

git cp $(cat .git/rebase-merge/stopped-sha) 

을 선택 에뮬레이트 할 필요가 (그것도. 주석 처리 된 섹션에 포함되지 않음)하고 --merge 옵션을 사용하는 경우는

를 입력해야

자식 체리 픽 $ (고양이 $ DIR/리베이스 병합/전류) 따라서

, 그것은이 별명 사용하는 것이 가장 좋은 것입니다 것들을 단순화 :

+1

소스 코드를 살펴 봤습니다. 저는 rebase가 이전 버전에서도 편집기를 호출하지 않는다고 생각합니다. –

+0

이것이 나를 위해 원하는 효과가 있음을 확인할 수 있습니다. 비 대화식 경우의'git reset -hard'는 불행한 일입니다. 사실 저는이 사실을 알고 나서해야 할 필요가 있음을 깨달았 기 때문에 버려지는 것들은 제가 가치있는 편집이 될 것입니다. 'git diff --cached> changes.patch'를 사용하면 체리 선택 후 재 도입을 위해 변경 사항을 유지할 수 있습니다. – stochastic

+0

cherry-pick이 충돌을 해결하도록 요청할 때 git read-tree -u --reset ORIG_HEAD' 명령을 사용할 수 있습니다. –

4

정확하게 똑같은 문제로이 질문에 올랐고 대답에 실망한 끝에 나는이 문제에 대해 합리적으로 우아한 해결책을 생각해 냈지만 결국에는 내 메모를 보았습니다.

git commit -t .git/rebase-apply/msg-clean 
git rebase --skip 

msg-clean에는 원래의 커밋 메시지가 포함되어 있으므로 커밋을 템플릿으로 사용하면 편집기에서 원본 메시지를 볼 수 있습니다. 커밋 한 후 건너 뛰면 방금 만든 커밋을 다시 적용하지 않고 rebase가 이동합니다.

참고 : 저는 전문가가 아니므로 누군가이를 확인하십시오. 함께 테스트 한 레포로 작동하는 것 같았지만 많은 시간의 충돌 해결 작업으로 실제 작업 레포에서 시도 할 정도로 용감하지 않았습니다. 이것이 뭔가를 날려 버리면 책임을지지 말아주세요.

+1

매력처럼 작동합니다. 고마워, 정말 도움이되었다. –

+0

Git 2.9.3에서는 rebase 중에'.git/rebase-apply/msg-clean'이 존재하지 않으며 다른 곳에서는'msg-clean' 파일이 존재하지 않습니다. –