[작업을 여기저기로 옮기기]
작업을 여기저로 옮기는 개념은 '이 일은 여기에 저 일은 저기에 두는 등 정확하고 유연하게 브랜치 설정을 하는 것'.
git cherry-pick
git cherry-pick <...>
현재 위치(HEAD) 아래에 있는 일련의 커밋들에 대한 복사본을 만들겠다는 것을 의미한다. rebase를 통해 브랜치를 복사할 수 있지만 cherry-pick 명령어를 통해 일련의 커밋들에 대한 일괄적인 복사본을 생성할 수 있다.
git cherry-pick C2 C4
# C2와 C4를 커밋하면서 사본을 만들겠다는 명령어
git Interactive Rebase
Git cherry-pick은 원하는 커밋이 무엇인지 알 때(커밋 해시값) 아주 유용하다.
> cherry-pick은 간단함은 큰 장점. 원하는 커밋을 모르는 상황에는 git은 인터렉티브 리베이스를 사용하면 된다.
> rebase는 일련의 커밋들을 검토할 수 있는 가장 좋은 방법.
인터렉티브 리베이스는 rebase 명령어를 사용할 때 -i 옵션을 같이 사용한다.
이 옵션을 추가하면, git은 리베이스의 목적지가 되는 곳 아래에 복사될 커밋들을 보여주는 UI를 띄운다.
각 커밋을 구분할 수 있는 각 각의 해시들과 메시지도 보여준다.
git 에서는 UI창을 띄우는것 대신에 vim과 같은 텍스트 편집기에서 파일을 열어준다.
인터렉티브 리베이스 대화창이 열리면, 3가지를 할 수 있다
1. 적용할 커밋들의 순서를 UI를 통해 변경(여기서는 마우스 드래그앤 드롭으로 가능)
2. 원하지 않는 커밋들을 제외. 이것은 pick을 이용해 지정할 수 있습니다(여기서는 pick토글 버튼을 끄는것)
3. 마지막으로, 커밋을 스쿼시(squash)할 수 있다. =커밋을 합칠 수 있다
git rebase -i HEAD~4
사용 예시 : 로컬에 쌓인 커밋
개발중에 종종 디버그용으로 로그를 작성하거나 프린트하는 코드를 작성하는 상황이 생긴다.
눈에 띄지 않는 버그를 찾아서 해결하려고, 디버그용 코드와 화면에 정보를 프린트하는 코드를 추가하는 경우가 있다. 과정중에 커밋을 하게되면 디버깅용 코드나 프린트 명령은 그 브랜치에 들어있다. 이후, 버그를 찾아서 고쳤고, 원래 작업하는 브랜치에 합치려 할 때 문제가 발생한다. bugFix브랜치의 내용을 master에 합쳐 넣을 수 없다. 그냥 간단히 master브랜치를 최신 커밋으로 이동시킨다면(fast-forward) 그 불필요한 디버그용 코드들도 함께 들어가기 때문이다.
이 문제를 해결하는 여러가지 방법 중 가장 간단한 두 가지 방법
git rebase -i
git cherry-pick
대화형 (-i 옵션) 리베이스(rebase)로는 어떤 커밋을 취하거나 버릴지를 선택할 수 있다. 또 커밋의 순서를 바꿀 수도 있다. 이 커맨드로 어떤 작업의 일부만 골라내기에 유용하다. 체리픽(cherry-pick)은 개별 커밋을 골라서 HEAD위에 떨어뜨릴 수 있다.
'Dev > Git' 카테고리의 다른 글
[Git] push error - unpack failed: index-pack abnormal exit (0) | 2019.12.31 |
---|---|
[Git] fetch 후 에러(Failed to lock refs/heads/master) (0) | 2019.06.10 |
[Git] command line 버전관리 (0) | 2019.02.16 |
[Git] Head, Relative Ref, reset, revert (0) | 2019.02.12 |
[Git] 기본 명령어 (commit, branch, checkout, merge, rebase) (0) | 2019.02.11 |