2019.09.16 git commit 되돌리기, cherry-pick, commit 제외하기

상황 :

- 잘못한 커밋 -> Master Branch Merging -> 커밋1 -> 커밋2 -> 현재
- 현 상태에서 커밋1은 제외하고 싶음

여러 뻘짓을 해봤지만 아래 방법이 가장 깔끔했다.

```
Master에서 Pull로 최신화를 한 뒤 새로운 Branch를 만든다.
새로운 Branch에서 잘못 된 커밋이 섞인 Branch의 Commit을 Cherry-pick한다.
```

What I did, What was wrong?

1) Rebase로는 안되는가?

사실 현재와 커밋2 사이에는 여러 커밋이 더 있었다.
먼저 git rebase -i HEAD~커밋2 전 커밋까지 rebase를 했다. 이 후에 커밋2가 rebase할 때 빠진거를 깨닫고 다시 rebase를 하려고 하니 현재 상태와 커밋2간에 conflict이 났다. 왜인지는 잘 모르겠다.

* 터미널에서 git rebase -i HEAD~(커밋갯수)를 하면 Interactive 모드가 실행된다.
메시지 창에서 커밋 내역을 조작할 수 있는데, 커밋 Hash 앞에 접두사에 pick을 붙이면 그 Commit은 히스토리에 남긴다는 뜻이고, 접두사에 squash를 붙이면 history에는 남기지 않겠다는 뜻이다. 하나의 pick 을 가진 채로 나머지 commit들은 모두 squash해버리면 pick으로 살린 커밋에 sqaush가 붙은 커밋들의 내역이 모두 들어간다.

* HEAD~2 는 현재 포함 2개의 커밋이라는 것.


2) Reset으로는 안되는가?

Reset으로 잘못한 커밋까지 되돌아가서 (git reset --mixed HEAD~5) 반영하고 싶은 Commit을 다시 올릴려고 했으나 Master를 Merging했던 브랜치도 reset이 되면서 merging 내역들도 unstage 되는 불상사가 일어났다. 더불어 터미널에서 git log를 해보니 얘는 master branch의 로그들을 출력하고.. 그래서 master에 이미 올라간 내역도 자칫 잘못 건드릴 가능성이 있기 때문에 별로라고 생각했다.


* Master 브랜치를 merging한 커밋이 중간에 존재하면 로그가 꼬일 수 있으니 유의하자


댓글

이 블로그의 인기 게시물

로컬 Tomcat 서버 실행속도 개선

2019.05.23 - SQLAlchemy 의 객체 상태 관리 (expire, refresh, flush, commit) 에 관한 이해

2020.02.17 Python의 multiprocessing 중 Pool.map(), chunksize에 관한 내용