2013-06-27 2 views
3

을 커밋 개정 :오래된 내가 가지고있는 다음과 같이 역사 커밋

* 8cd26ba 2013-06-26 | history server-side (HEAD, noXHR) 
* bffd858 2013-06-25 | popups and modals 
* d95c5f4 2013-06-21 | Map update for new interaction 
... 

을 그리고 나는 이미 최선을 다하고했습니다 때 '8cd26ba'나는 모달 메커니즘에서 버그를 발견하여 수정하려는. 나는 'bffd858'을 고치려고 노력했다. (수정본과 관련되어 있으므로) described here. 자식은 내가 '편집'과 '선택'교체 한

pick 6fa566b history server-side 
# Rebase bffd858..6fa566b onto bffd858 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 
  • 나 (나노)에 표시

    $ git rebase -i bffd858 
    
  • 를 입력

    1. : 나는 다음과 같은 단계를했던 것

    2. git said said :

      Stopped at 8cd26ba... history server-side 
      You can amend the commit now, with 
      
          git commit --amend 
      
      Once you are satisfied with your changes, run 
      
          git rebase --continue 
      
    3. 내 버그 수정 프로그램을 적용했고

      $ git commit -a --amend 
      
    4. git rebase --continue 
      
    5. 입력 입력 그리고 나는 '8cd26ba'내 버그 수정 (마지막 을 발견했습니다 커밋)!

    내가 잘못 했습니까?

  • +0

    감사합니다. Sylvain Defresne, 조언을 구하십시오! 정말 혼란 스러웠던 점은 원래 Q & A에서 '~ 1'부분을 놓친 것입니다. 악마는 세부 사항에있다! –

    답변

    5

    리베이스를 할 때 가장 먼저 수정하려는 커밋의 부모 ID를 알려주고 싶습니다. 귀하의 경우 부모가 d95c5f4 (bffd858^ 또는 bffd858~1) 인 bffd858을 수정하고 싶습니다. ^을 특수 문자로 해석하는 셸에서 작동하므로 마지막 구문을 선호합니다.

    $ git rebase --interactive bffd858~1 
    

    을하고 읽을 수 있도록 파일을 변경 :

    님 대신 했어야 다음

    pick bffd858 popups and modals 
    fixup 6fa566b history server-side 
    # Rebase bffd858..6fa566b onto bffd858 
    # 
    # Commands: 
    # p, pick = use commit 
    # r, reword = use commit, but edit the commit message 
    # e, edit = use commit, but stop for amending 
    # s, squash = use commit, but meld into previous commit 
    # f, fixup = like "squash", but discard this commit's log message 
    # x, exec = run command (the rest of the line) using shell 
    # 
    # If you remove a line here THAT COMMIT WILL BE LOST. 
    # However, if you remove everything, the rebase will be aborted. 
    # 
    

    및 저장하고 파일을 마감했다. 보통

    버그 수정 프로그램을 적용하고 역사하는 것입니다 해결하는 가장 쉬운 방법 : 당신의 수정을 커밋 할 때

    1. 사용 git commit --fixup=bffd858, 리베이스하는
    2. 사용 git rebase --interactive --autosquash bffd858~1,
    3. 파일을 저장 한을 열어보고 rebase가 완료 될 때까지 기다리십시오.

    원본 커밋에 수정 패치가 적용됩니다.

    당신의 경우에는 수정 한 커밋으로 리베이스를 수행했을뿐입니다.rebase 부분은 수정 사항을 제출 한 후 (예 : 아무 것도하지 않았다) 그 시점까지 기록을 되 감았습니다.

    +0

    OP의 질문에 명확하게 답변하므로 마지막 단락을 맨 위로 옮깁니다. 좋은 충고! – jszakmeister

    +0

    좋습니다. 완료되었습니다. –

    +0

    만약'n'> 1이라면'^[n]'과 ' ~ [n]'구문이 같지 않음에 유의하십시오 – kostix

    1

    나는 이렇게 할 것입니다 :

    "수정 커밋"을 작성하십시오.

    다음 중 하나를 그대로 두십시오. 때로는 충분합니다. 그것이 모두 출판되면, 그것은 정말로 당신이 가진 유일한 좋은 선택입니다.

    또는. git rebase -i <commit to fix>^ - 수정하려는 것보다 일찍 처리하십시오. 그런 다음 파일을 편집하십시오. "수정 커밋"을 수정하여 수정하려는 대상 바로 다음에 이동하십시오. 그런 다음 "pick"을 "squash"로 대체하여 커밋에 수정 사항을 적용하고 커밋 메시지 또는 "fixup"을 수정하여 수정 사항을 그대로 적용하고 메시지를 그대로 두십시오.

    0

    당신이 물어 본 것과 정확히 같습니다. 이전에 의도했던 'thext'에서 'history server-side'커밋을 편집했습니다!

    이전 커밋에서 리베이스를 시작하고 실제로 의도 한 것을 편집하면 프로세스 자체가 작동했을 것입니다.

    그러나 더 편리한 방법은 'Fixup!'으로 커밋하는 것입니다. ', 결국 아래에서 대화 형 rebase를 시작합니다. 자동 스쿼시가 기본값이되면 자동으로 수행 목록을 수정하여 픽스 업을 적절한 위치로 옮기고 픽스 업을 표시합니다. (스쿼시와 유사!). 확실히 할일을 수동으로 편집 할 수 있습니다.

    그런 다음 실행하십시오. 이 방법은 무언가가 의도 한대로되지 않으면 재현하기가 더 쉽고, 편집 작업은 손실되기 쉽습니다.

    0

    @aragaer가 대답했지만 평신도를 명확히하고 싶었습니다.

    아무도 직장에서 나에게 말했고이 문제를 논의한 워크 플로 기본 사항을 찾을 수 없었기 때문에 다음과 같이 너무 오래 어리 석었다. 이전에 커밋을 HEAD로 옮기고, 커밋 수정을 수행하고, 커밋 수정을 수행 한 다음, 커밋을 다시 역사의 원래 위치로 다시 이동시키고, 다시 충돌을 수정하기 위해 다시 리베이스하는 git rebase -i HEAD~#을 사용했습니다. 작동하지만 오답. 이 얼마나 악몽인가. 나는 http://git-scm.com이 이것을 논의하지 않는다는 것에 놀랐다. 그것은 매우 기본적인 것이다. 만약 그렇다면, 나는 그것을 놓쳤다.

    대답은 간단하다 :

    1. 는 확인 새 당신이 이전 커밋에 적용 할 변경을 커밋합니다.
    2. git rebase -i HEAD~10 또는 지금까지 가야 할 때까지 괜찮습니다. 커밋 SHA를 알게되면 위의 @ aragaer의 대답을 사용하십시오.
    3. 커밋을 이전 커밋 바로 아래로 스쿼시하고 싶습니다.
    4. 그런 다음 새 커밋 squash 또는 fix을 적용하십시오.

    완료.

    관련 문제