학습 사이트에서 다음 레벨에 해당하는 내용이다.
level mixed<num>
git rebase -i
// 수정하고 싶은 커밋을 제일 뒤로 가져옴
git commit --amend
// 해당 커밋을 수정
git rebase -i
// 원래 순서대로 돌림
git checkout -b temp-branch
// 수정할 커밋과 그 이후의 커밋을 복사해둘 새로운 브랜치 생성
git cherry-pick <수정할 커밋의 바로 앞 커밋까지>
// 이유: 커밋 순서를 보장함으로써 문맥을 보존하고 충돌을 방지함
git cherry-pick <수정할 커밋 해시>
git commit --amend
// 수정하고 싶은 커밋을 복사한 후 수정
git cherry-pick <다음 커밋 해시>..
// 나머지 커밋들을 복사
git checkout <원래 브랜치>
git reset --hard <수정된 커밋 바로 앞 커밋>
// temp-branch의 수정된 커밋들을 가져올 수 있도록 커밋을 제거
git cherry-pick <temp-branch>
git stash
: 수정 중인 파일의 상태를 임시로 저장해둘 수 있는 기능git stash
// 수정할 커밋 이전까지의 커밋을 git stash로 임시 저장
git reset --hard <수정할 커밋의 이전 커밋 해시>
// 수정하고자 하는 커밋으로 되돌아가기
git commit --amend
// 파일 수정 및 커밋
git stash pop
// 저장해둔 커밋들 복원
git rebase branch1 branch2
위 명령어는 곧 아래처럼 처리된다.
git ceheckout branch1
git rebase branch2
Feature | git rebase branch2 | git merge branch2 |
---|---|---|
커밋 히스토리 | 직선형 (선형화됨) | 비선형 (병합 커밋 생성) |
커밋 수 | 커밋 수가 줄어들 수 있음 | 추가적인 병합 커밋으로 커밋 수가 증가 |
결과 커밋 | branch2 위에 branch1 커밋 적용 | branch1과 branch2의 병합 커밋 생성 |
충돌 해결 방식 | 재배치 도중 발생할 수 있음 | 병합 도중 발생할 수 있음 |
git commit --amend
git rebase -i
+ git commit --amend
: 히스토리를 자유롭게 수정할 수 있는 로컬 작업에 적합.git reset --soft/hard
: 이전 커밋으로 되돌려 히스토리를 변경하는 데 유용.git cherry-pick
: 특정 커밋을 안전하게 가져와 복사할 때 적합. 히스토리 변경 없이 커밋을 복사하는 방식으로 협업 중에 유용.git revert
: 실수로 잘못된 커밋을 푸시했을 때, 커밋을 되돌리되 히스토리는 그대로 유지하는 방식.remote 상황에서는 히스토리를 유지하는 방식이 중요하고, 로컬에서는 히스토리 수정이 가능하다는 점이 주요 차이이다.
실제로 협업 과정이 돌아가는지는 모르겠지만, 로컬이 아닌 환경에서는 이래저래 조심하자..