티스토리 뷰
오늘 바보처럼 로컬에서 작업하고 푸시까지 했는데 사실 잘못된 커밋이었다는 걸 깨달았다... 여러 번 이런 적이 있었고, 그때마다 어찌저찌 돌아가긴 했는데 이번엔 정말 내가 완벽하게 이해한 상태에서 되돌릴 수 있어서 뿌듯했다. 앞으로 같은 문제가 터지면 제대로 해결할 수 있을듯. 그래서 정리해둔다!
우선 정확한 상황을 말해보자면,
1. 원격 : 정상(0) + 잘못된 커밋 1개 올라가 있는 상태
2. 로컬 : 1의 상태(정상(0) + 잘못된 커밋 1개) + 잘못된 merge까지 있는 상태
이랬다. 그래서 로컬이 원격보다 2 커밋 앞에 있던 상태. 그리고 따로 브랜치가 분리된 상태는 아니었다. 단순히 강의들었던 내용 기록목적이라 그냥 main브랜치에서 작업하고 있었다.
그래서 되돌리기 위해 해야 할 일은
1. 로컬에서 (원격에) 잘못된 커밋이 올라가 있는 상태 바로 전의 커밋으로 되돌린다. (0으로 되돌림.)
2. 1을 실행하면 로컬은 원격보다 1커밋 뒤쳐지게 되고
3. 그대로는 푸시를 할 수 없기 때문에 옵션 -f로 강제로 푸시한다.
4. 3을 실행하면 원격은 내가 잘못된 커밋, 푸시를 하기 전 상태(0)으로 돌아가고
5. 원격도 0인 상태, 로컬도 0인 상태가 되므로 다시 처음부터 작업을 시작하면 된다.
이 상태를 되돌리고자 찾아보았는데, 명령어 reset과 revert가 있었다. reset은 이전 커밋으로 되돌리면서 그 커밋 기준 이후의 커밋들을 다 지운다. 반면 revert는 커밋했던 이력을 그대로 두고, 그 되돌릴 커밋의 코드만 되돌린다.
다섯번째 커밋 a5b5c5.. (잘못된 커밋)
네번째 커밋 a4b4c4.. (잘못된 커밋)
세번째 커밋 a3b3c3.. (여기로 돌아간다고 치자!)
두번째 커밋 a2b2c2..
첫번째 커밋 a1b1c1..
위와 같은 커밋이력이 있을 때, 네번째 커밋부터 잘못된 커밋이기 때문에 세번째 커밋으로 돌아가야 한다. 명령어에는 hard, soft, mixed(default) 옵션이 있는데 이를 살펴보자.
// git reset --hard a3b3c3.. 입력시
세번째 커밋 a3b3c3..
두번째 커밋 a2b2c2..
첫번째 커밋 a1b1c1..
// git reset --soft a3b3c3.. 입력시
// 커밋이력은 아래처럼 돌아가지만 commit된 파일들을 staging area로 돌려놓는다.(add까지 된 상태)
세번째 커밋 a3b3c3..
두번째 커밋 a2b2c2..
첫번째 커밋 a1b1c1..
// git reset --mixed a3b3c3.. 입력시
// 커밋내역은 아래처럼 돌아가지만 commit된 파일들을 add 전 상태로 돌려놓는다.
세번째 커밋 a3b3c3..
두번째 커밋 a2b2c2..
첫번째 커밋 a1b1c1..
나는 여기에서 git reset --hard를 사용해서 로컬을 잘못된 커밋을 하기 전 상태(정상상태)로 되돌렸고, 원격에 푸시하면서 -f 옵션을 붙였다. 위에서 말한대로 로컬과 원격 모두 내가 잘못된 커밋, 푸시를 하기 전 상태(0)으로 돌아갔고, 여기에서 다시 커밋작업을 했다.
나도 몇 번이나 되돌려야 할 상황이 있었고, 그때마다 찾아보고 하긴 했는데 그때는 이해가 안 가다가 오늘은 갑자기 이해가 쑥쑥 잘되서 문제를 잘 해결했다.
'공부흔적' 카테고리의 다른 글
DL(Dependency Lookup) (0) | 2021.04.10 |
---|---|
프레임워크와 라이브러리 (0) | 2021.04.08 |
[Spring] 리스트에서 항목 선택해서 그 해당 항목의 이미지들을 가져와 모달창으로 띄우기 (0) | 2021.03.19 |
pom.properties? MANIFEST.MF? (0) | 2021.03.16 |
400 Bad Request (0) | 2021.03.15 |