git rebase로 conflict했을 때의 대응을 간단하게 확인
개요
아래와 같이, 어느 지점에서 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
이외의 커밋이 붙어 있는 것을 알 수 있습니다.
Reference
이 문제에 관하여(git rebase로 conflict했을 때의 대응을 간단하게 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nannany_hey/items/ef77da2be1836ef9b5df텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)