[iOS 사전캠프] Git: 과거 커밋 수정하기

DoyleHWorks·2024년 10월 17일
0

학습 사이트에서 다음 레벨에 해당하는 내용이다.

  • A Mixed Bag (1~3) level mixed<num>
    • Grabbing Just 1 Commit
    • Juggling Commits #1
    • Juggling Commits #2

수정하고 싶은 부분이 커밋 히스토리 뒷편에 있을 때

수정 시나리오: 인터랙티브 리베이스 활용

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 stash로 임시 저장
git reset --hard <수정할 커밋의 이전 커밋 해시>
// 수정하고자 하는 커밋으로 되돌아가기
git commit --amend
// 파일 수정 및 커밋
git stash pop
// 저장해둔 커밋들 복원

git rebase branch1 branch2

위 명령어는 곧 아래처럼 처리된다.

git ceheckout branch1
git rebase branch2

rebase vs merge

Featuregit rebase branch2git merge branch2
커밋 히스토리직선형 (선형화됨)비선형 (병합 커밋 생성)
커밋 수커밋 수가 줄어들 수 있음추가적인 병합 커밋으로 커밋 수가 증가
결과 커밋branch2 위에 branch1 커밋 적용branch1과 branch2의 병합 커밋 생성
충돌 해결 방식재배치 도중 발생할 수 있음병합 도중 발생할 수 있음

git commit --amend

  • 직전 커밋을 수정할 수 있는 명령어
  • 마지막으로 커밋한 내용을 덮어쓰거나 커밋 메시지를 변경할 수 있다.

사용 시나리오

  1. 커밋 메시지를 수정하고 싶을 때
  2. 파일을 추가로 포함시키고 싶을 때: 파일을 빠뜨렸거나 추가적인 수정 사항이 있을 때

주의 사항

  • 이미 공유된 커밋에 대해서는 사용하지 않는 것이 좋음 (커밋 히스토리를 덮어쓰기 때문)
  • 로컬 커밋을 수정할 때 주로 사용

local vs remote에 적합한 명령어?

local에 적합한 명령어

  • git rebase -i + git commit --amend: 히스토리를 자유롭게 수정할 수 있는 로컬 작업에 적합.
  • git reset --soft/hard: 이전 커밋으로 되돌려 히스토리를 변경하는 데 유용.

remote에 적합한 명령어

  • git cherry-pick: 특정 커밋을 안전하게 가져와 복사할 때 적합. 히스토리 변경 없이 커밋을 복사하는 방식으로 협업 중에 유용.
  • git revert: 실수로 잘못된 커밋을 푸시했을 때, 커밋을 되돌리되 히스토리는 그대로 유지하는 방식.

remote 상황에서는 히스토리를 유지하는 방식이 중요하고, 로컬에서는 히스토리 수정이 가능하다는 점이 주요 차이이다.
실제로 협업 과정이 돌아가는지는 모르겠지만, 로컬이 아닌 환경에서는 이래저래 조심하자..

profile
Reciprocity lies in knowing enough

0개의 댓글