일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 11659
- OOP
- 프로그래머스
- 재귀함수
- 성능테스트툴
- 스택
- 클라우드에서 도커 실행하기
- 싱글톤패턴
- java
- 알고리즘
- 재귀와반복문
- 백준 11659
- 버블정렬
- 코드스테이츠 백엔드
- 구간합구하기
- List.of
- GCP
- 코딩테스트
- 인텔리제이
- 투포인터알고리즘
- 백준
- Spring Web MVC
- vm인스턴스생성
- Array.asList
- MySQL
- Spring MVC 구성요소
- String.valueOf()
- 코드스테이츠
- Spring MVC 동작원리
- 자바
- Today
- Total
순간을 기록으로
[Problem] 원격저장소에 올라간 커밋을 되돌리고 싶을 때 본문
상황
이미 원격저장소로 올라간 1개의 Commit을 되돌리고 싶었다. 왜냐면 오리지널 원격저장소에 PR을 한 커밋만 보내고 싶은데 한 커밋만 선택할 수 없었다. 그래서 이미 올라간 2개 커밋 중 한 커밋을 로컬로 되돌리고 싶었다.
사실 1장 commit하고 PR을 날렸고, 그 이후에 2장을 커밋했다. 그리고 2장 PR을 날리려고 해보니 안되었다. 그래서 확인해보니깐 첫 PR에 두 개의 커밋이 모두 포함되어있었다. 일단 1장씩 PR을 날리기로 약속했어서 잘못된 PR을 Closed했다.
해결
방법1 - git reset: 로컬에서 커밋을 되돌린 후 강제 푸시하기(비추천)
Local에서 `git reset` 명령어를 사용하면 된다.
$git reset --hard HEAD~3
위 명령어를 사용하고 git push -f origin main을 하면 로컬 최신 커밋 3개를 되돌린 후 올린다.
로컬 저장소 커밋 히스토리가 원격 저장소 커밋 히스토리보다 뒤처져 있기 때문에 -f (force) 옵션을 입력해주지 않으면 에러가 발생한다.
하지만 위 방법은 협업할 때 비추천한다. 만약 내가 올리고 나서 다른 팀원분이 pull을 했다면 잘못된 나의 커밋이 팀원분의 local 커밋 히스토리에 남게 된다. 그리고 팀원분이 다시 올릴 때 올리고 싶지 않았던 커밋이 다시 올라가게 된다.
따라서 이 방법은 다른 팀원이 내가 지우고 싶은 커밋들을 pull로 당기지 않았을 때 사용해야 한다.
방법 2- git revert: 되돌리는 작업도 커밋으로 만들기
git revert는 되돌리고 싶은 커밋을 지우는 것이 아니다. 되돌리고 싶은 커밋 위에다가 되돌리는 작업도 커밋으로 올린다. 따라서 방법 1에서 발생한 문제도 해결할 수 있다.
$git revert [되돌리고 싶은 커밋의 hash] --no-edit
결과
3개의 커밋에 한 PR에 있지만 두 번째 커밋을 세 번째 커밋이 되돌려주니 첫 커밋의 내용만 반영할 수 있었다!
참고
https://www.lainyzine.com/ko/article/git-revert-reverting-commit-in-git-repository/