git rebase로 conflict했을 때의 대응을 간단하게 확인

4727 단어 rebaseGitconflict

개요



아래와 같이, 어느 지점에서 feature 브랜치를 잘라 개발을 진행하고 있는 동안, master 브랜치에도 commit이 행해지는 상황은 자주 있다고 생각합니다.


이 상황에서, feature 브랜치로부터 PR을 낼 때에는, feature측에서 master의 선두로부터 변경 커밋을 생기게 하는 것이 많다고 생각합니다(fast-forward?).


이 때 master의 커밋과 feature의 커밋이 충돌한 경우의 git rebase --continue , git rebase --skip의 거동을 확인해 갑니다.

상황



아래와 같은 git log의 상황에서 feature 브랜치 측에서 git rebase master 를 해 나갑니다.


  • target1 in feature , target2 in feature 커밋은 master 커밋과 충돌합니다.
  • target3 in feature 의 커밋은 충돌하지 않습니다.

  • rebase 시도



    git rebase master 할



    feature 브랜치에서 git rebase master 를 하면 다음과 같이 됩니다.
    [nannany@minamiyoshihikonoMacBook-Pro practice-git (feature)]$ git rebase master    
    First, rewinding head to replay your work on top of it...
    Applying: target1 in feature
    Using index info to reconstruct a base tree...
    M       target1.md
    Falling back to patching base and 3-way merge...
    Auto-merging target1.md
    CONFLICT (content): Merge conflict in target1.md
    error: Failed to merge in the changes.
    Patch failed at 0001 target1 in feature
    hint: Use 'git am --show-current-patch' to see the failed patch
    Resolve all conflicts manually, mark them as resolved with
    "git add/rm <conflicted_files>", then run "git rebase --continue".
    You can instead skip this commit: run "git rebase --skip".
    To abort and get back to the state before "git rebase", run "git rebase --abort".
    

    위의 상황은 master 브랜치의 끝에 target1 in feature 의 커밋을 붙이려고 하는 컨플릭트하고 있는 상황입니다.



    충돌을 해소하면 git add . 합니다.
    [nannany@minamiyoshihikonoMacBook-Pro practice-git (feature *+|REBASE 1/3)]$ git add .   
    

    git rebase --continue



    첫 번째 커밋의 충돌을 해소하고 git add . 그러면 rebase를 계속하기 위해 git rebase --continue 합니다.
    [nannany@minamiyoshihikonoMacBook-Pro practice-git (feature +|REBASE 1/3)]$ git rebase --continue 
    Applying: target1 in feature
    Applying: target2 in feature
    Using index info to reconstruct a base tree...
    M       target2.md
    Falling back to patching base and 3-way merge...
    Auto-merging target2.md
    CONFLICT (content): Merge conflict in target2.md
    error: Failed to merge in the changes.
    Patch failed at 0002 target2 in feature
    hint: Use 'git am --show-current-patch' to see the failed patch
    Resolve all conflicts manually, mark them as resolved with
    "git add/rm <conflicted_files>", then run "git rebase --continue".
    You can instead skip this commit: run "git rebase --skip".
    To abort and get back to the state before "git rebase", run "git rebase --abort".
    

    위는 두 번째 커밋을 앞서 붙인 커밋의 한층 더 첨단에 붙이려고 하는 컨플릭트하고 있는 상황입니다.



    여기에서도 충돌하기 때문에 해소합니다. 다만, 이번은 master측의 변경을 받아들인다고 합니다. 충돌이 해결되면 git add . 합니다.

    git rebase --skip



    방금 전, target2 in feature 커밋은 결국 반영하지 않으므로 커밋 이력에는 남기지 않게 하고 싶습니다. 그런 때는 git rebase --skip 를 합니다.
    [nannany@minamiyoshihikonoMacBook-Pro practice-git (feature *+|REBASE 2/3)]$ git rebase --skip       
    Applying: target3 in feature
    

    이제 target2 in feature는 커밋 내역에 남아 있지 않습니다.

    target3 in feature 의 커밋은?


    target3 in feature 의 커밋은 충돌하지 않으므로 아무것도 하지 않고 그대로 커밋 이력에 남아 있습니다.

    최종 커밋 이력은?



    커밋 이력은 결국 다음과 같습니다.



    master 브랜치 앞에 skip한 target2 in feature 이외의 커밋이 붙어 있는 것을 알 수 있습니다.

    좋은 웹페이지 즐겨찾기