2013-11-01 2 views
2

git 브랜치가 있다고 가정하고 공유하기 전에 최종 리뷰에서 맞춤법 오류와 같은 작은 오류가 발견됩니다. 내가 뭘하고 싶은지는 하나의 패치를 "픽스 업"으로 적용하는 것입니다. 그러나 실제로 많은 커밋에 영향을 주어 최종 기록에 오류의 흔적이 없습니다.Git rebase : 하나의 커밋으로 fixup 다중 커밋

즉, 하나의 커밋에서 줄 A를 변경 한 다음 다른 커밋에서 줄 B를 변경 한 다음 줄 A와 B 모두에 영향을주는 패치가있는 경우 커밋 변경 줄 A가있는 곳에서 rebase를 수행하고 싶습니다. 해당 패치의 A 부분에 의해 고쳐지고 커밋 변경 라인 B는 커밋이 어느 커밋인지 수동으로 파악하지 않고 B 파트를 가져옵니다. 이 작업을 수행하는 쉬운 방법이 있습니까?

collect all hunks from the fixup 
for commit in the history we are rebasing: 
    check out commit 
    for hunk in fixups: 
     try: 
      apply hunk to the working tree 
     except: 
      continue 
     remove hunk from fixups 
    commit the working tree. 
+1

Spit Erarrs가 도입 된 커밋을 찾기 위해'git blame' (또는'git annotate')을 사용하고, 각 수정을 개별적으로 커밋하고, 각 수정을 a로 축소하여'rebase -i'를 각 "나쁜"커밋에 대한 픽스 업. – torek

+0

질문에 제안 된 알고리즘이 좋은 생각이라고 생각합니다. 누군가 그것을 구현해야합니다! –

답변

0

여기에 부분적인 대답 :

나는 의사 코드 스크립트 같은 것을 할 것입니다 생각합니다. 보기 흉하지만 단순한 경우에 작동합니다.

나는 커밋을 가지고, ce580fe, 몇 군데에서 뭔가를 바꿉니다. 원래 이름이 파일에 나타나지 않도록하고 싶습니다. 이렇게 한 경우에는, 적어도 작동 각에서

이다
git rebase -i 0881a5a --exec "git diff ce580fe^ ce580fe | git apply --reject; git add -u; git commit --amend -C HEAD" 
git diff ce580fe | git apply; git add -u git commit --amend -C HEAD # Apply any changes that got missed. 

이 공정 리베이스, 그것 ce580fe 대한 DIFF 적용되고 DIFF의 일부가 거부 될 수있다. 모든 변경 사항을 알려진 파일에 추가하고 동일한 커밋 메시지로 커밋을 수정합니다. 마지막으로 ce580fe의 차이를 적용하여 트리를 ce580fe처럼 보이게 만듭니다.

git apply --reject가 생성하는 .rej 파일을 사용하면 아무 것도하지 않는 멍청이입니다. 실제 이름을 바꾸려면 git rebase -i --exec을 검색 및 바꾸기 행과 함께 사용하는 것이 좋습니다.

관련 문제