현재 사용 중인 저장소에는 main
브랜치와 back
브랜치가 있습니다.
back
→main
병합- 부모 커밋부터 n번째에 있는 커밋 메세지 변경을 위해
main
에서git rebase HEAD~n
- 명령어 옵션의 의미를 착각해 부모 커밋부터 n번째 커밋까지 모두 재할당
main
에 있는 커밋들의 해시 값이 모두 변경돼back
의 커밋과 달라짐- 닫힌 이슈들에 동일한 내용의 커밋이 새로운 해시 값으로 다시 push
git rebase HEAD~n
의 의미를 "부모 기준으로 n번째까지의 모든 커밋"이 아닌, "부모 기준으로 n번째 커밋"으로 잘못 이해하고 약 20개의 이전 커밋들이 다시 푸시가 되는 사태가 발생했습니다... 😭😭😭
코드 상의 문제는 없었으나... 과거의 커밋이 현재에 다시 push가 되면서
잔디 2배 이벤트 + 브랜치의 변경 내역이 꼬였다는 것이 매우 마음에 걸렸습니다.
한마디로 말하자면, 원격에서 rebase 사용하면 안 된다는 것과 rebase는 커밋을 수정하는 목적이 아니라는 것을 몰라서 생긴 일입니다 ^^!
🚩
git rebase
에 대한 설명과 실행 과정은
[Git] Commit 메세지를 수정하는 2가지 방법 (로컬과 리모트)에서 확인할 수 있습니다.
목표
1. 중복 커밋 제거
2.back
브랜치의 커밋을main
브랜치로 다시 병합
1) 로컬에서 back 브랜치의 내용을 backup-back 브랜치로 백업
git checkout -b <백업 할 브랜치>-<새 브랜치 이름>
2) 원격 저장소에 backup-back 브랜치 push (선택)
git reset --hard <hash>
: 과거 커밋에 대한 변경 사항을 모두 제거하고 HEAD 포인터를 이전 상태로 이동
git log --oneline
으로 한 줄 씩 출력할 수 있습니다. 커밋 75개? 🤦♀️ 이게 뭐람 🤷♀️
git push --force
back
의 커밋을 main
으로 다시 병합git cherry-pick <start-commit-hash>^..<end-commit-hash>
와우 ^^..
1. 원격 저장소의 커밋 내역 복구 성공
2. Issue의 커밋 히스토리 제거 실패
새 해시 값으로 중복 푸시되었던 커밋은 제거되지 못했습니다.
Issue에는 커밋을 추가하는 것만 가능하다고 합니다.
참고 자료: 인프런 Q&A-이슈 번호를 잘못 명시한 커밋을 삭제하는 방법
3. 커밋 활동 기록 (잔디) 제거 실패
reset
, rebase
로 제거된 커밋은 Dangling Commit이 되었고, 원격 저장소에는 약 30일간 보존 후 GC에 의해 삭제된다고 합니다.
그때 잔디도 함께 제거된다고 하니 기다려봐야 알 것 같습니다.
실수했던 날 잘못 푸시한 커밋 개수만 약 40개... GC... 빨리 일해...
git reset --hard
와 git cherry-pick
을 이용해 중복된 커밋을 제거하는 데 성공했습니다!
Git에서 어떤 이슈가 생기면 일단 등골이 서늘해지고.. 그 이슈를 해결하면서도 긴장되고.. 무섭고.. 저만 그런 거 아니겠죠 🙄
하지만 여러 번의 삽질을 거쳐 Git이 익숙해지니 이보다 편할 수가 없는 것 같습니다.
이렇게 하나 더 배웠다는 것에 감사함과 혼자 쓰는 저장소라서 정말정말정말 다행이라 생각합니다.. 끝!