일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 22년도
- 회고
- 테이크스트라
- requested
- baeldung
- 백준
- rotuter
- Paths.get()
- Til
- 재즈밋
- 오류
- MAX
- BOJ
- 채팅목록조회
- 3주차 회고
- 코드스쿼드max
- 2023
- MapSqlParameterSource
- JazzMeet
- new File().toPath()
- NamedParameterJdbcTemplate
- 자유 프로젝트
- Spring
- 실패했지만성공했다
- Map.of()
- 231103
- Python
- 코드스쿼드
- 누구나 자료구조와 알고리즘
- 파이썬
- Today
- Total
어제보다 한걸음 더
지우고 싶은 특정 커밋을 rebase로 해결하는 방법(with 남의 최신 커밋이 있을 때) 본문
git 상태: 지우고 싶은 커밋(commit A) + 남의 커밋(commit B)
- 동일한 브랜치(main)에 푸시되어있는 상태.
1. git rebase로 해결
1-1. git rebase 진행
- 명령어: git rebase -i HEAD~2
- ⚠️⚠️해당 브랜치를 건드는 동안에 push 된 커밋은 다 날아가니 주의 필요⚠️⚠️
1-2. 삭제를 원하는 커밋을 pick -> drop으로 변경한다.
- 코드 에디터가 띄워 짐.
pick {커밋해시B} 남의 커밋(commit B)
pick {커밋해시A} 지우고 싶은 커밋(commit A)
⬇️
pick {커밋해시B} 남의 커밋(commit B)
drop {커밋해시A} 지우고 싶은 커밋(commit A)
1-3. 변경사항 저장 후 창닫기(window+x) 한다.
1-4. 만약 conflict 나면 하단의 <0. conflict 났을 시> 항목을 참고한다.
1-5. git status 로 현재 상태를 체크한다.
- rebase를 계속하고 싶으면: git rebase --continue
- rebase를 멈추고 싶으면: git rebase --abort
- rebase 폴더를 삭제하고 싶으면(git 오류 시): rm -rf .git/rebase-merge
1-6. git에 push
- 명령어: git push --force-with-lease origin main
- 리모트(main)가 중간에 더 변경되지 않은 경우에만 안전하게 강제 push를 허용.
- 내가 리베이스한 로컬 상태를 깔끔하게 리모트에 반영 가능.
- 다른사람이 리모트에 뭘 올렸다면 실패 함.
----
2. git checkout + git cherry-pick 명령어 조합
2-1. 브랜치를 새로 딴다
- 명령어: git checkout -b temp
- 남의 커밋 보존 용
2-2. 메인 브랜치로 돌아온다.
- 명령어: git checkout main
2-3. cherry-pick으로 원하는 커밋을 현재 커밋에 붙인다.
- 명령어: git cherry-pick {커밋해시}
2-4. git push 하고 종료한다.
------
0. conflict 났을 시
0-1. conflict를 해결한다
- code editor에서 해결.
0-2. 스테이지에 올린다.
git add .
0-3. 커밋
git commit -m "긴급 저장: 리베이스 중 사라진 커밋 복구"
0-4. 푸시
git push