[Git] - Rebase

김찬영·2021년 1월 3일
1

Git

목록 보기
1/1
post-thumbnail

rebase란

단어 그대로 기준을 설정한다는 뜻이다. 쪼꼼 바꿔말하면.. 우리가 Git에 commit한 history를 바꿔버릴 수 있다.

실습 👍

rebase를 사용하기전에는 해당 브랜치에서 작업을 하고 push를 하기전 local master에서 remote master를 pull 작업하여 업데이트 시켜주고, 다시 해당 브랜치로 이동 후, push해주었다.

위의 사진은 부끄럽지만 아무것도 모르는 시절.. 생각없이 push가 저장하는 기능밖에 없는 줄알았던 그 시절이다.. 확실히 위의사진과 같이 git flow가 많이질수록 관리하기가 어려워진다.

위의 사진은 현재 rebase 작업 이후 push된 commit이다. 확실한 차이를 볼수있다. 자세한건 더 알아보자.

시간여행을 해볼 준비가 되셨나요!?🚀

본격적으로 rebase를 하기전에 제일 먼저 해야할 일이있다. 그것은 바로 "백업"!! 혹시라도 잘못된 경우가 생길 수 있으니

cp -rpv backup-original backup-clone

왼쪽이 원본의 현재 폴더명, 오른쪽이 클론할 폴더명을 적어주면 폴더가 복사된다! 이때 경로를 조심해야한다! 내 폴더가 속하기 바로 전단계의 경로에서 실행해야한다. 안그러면 내폴더안에 클론폴더가 또생기게 된다 클론 이후 cd를 이용해 다시 원본폴더로 이동!

이제 본격적으로 시간여행을 떠나보자.

1. 해당 브랜치에서 작업이후, add & commit

2. 로컬 마스터를 업데이트 , pull

3. 해당 브랜치에서 rebase

git rebase -i master 해당브랜치이름

git reflog

위의 사진은 시간여행을 탐험한 내역이다. 처음이라 서툴렀는지 squash작업시 잘못 저장되어 수정하는 과정에서 오류가났다. 그랬더니 내 브랜치에 작성했던 코드들이 다날라버렸다. 순간적으로 당황했지만 침착하게 마법의 주문을 적었다.

git reflog

git reflog는 지금까지 작성했던 커밋들의 내역이 적혀있고 주소도 적혀있다. 즉 그 시점으로 이동할 수있다!

git reset --hard 커밋주소

이동하기전에 중요한 일이있다. reflog에서보면 내가 돌아가고싶은 시점인 af4c9b5 주소이후에 내가 잘못 커밋된 내역들이 있다. 즉, 최신상태는 453fc3d이다. 내가 다시 과거로 돌아가는 거뿐이지 과거가 현재가 될수가없다. 그작업을 만들어주는 작업을 해야한다.

git reset --hard 돌아가고싶은 주소 이다.

이렇게하면 돌아가고싶은 주소가 현재가되어 이 주소를 기점으로 앞에있는 주소들은 다 삭제된다. 엄청난 일이다.. 이 이후에는 다시 단계별로 차근차근 단계별로 작성해보자. 잘못해도 살아날 방법은 많구나 깨달았다.

squash 작업


--squash 작업--

pick b91e257 first commit
pick 0118d46 second commit =>  s 0118d46 second commit
pick 1f199b7 third commit =>   s 1f199b7 third commit

# Rebase db078da..1f199b7 onto db078da (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log messag

명령어를 치면 최근 커밋한 목록이 나온다. 예를들어 최근커밋이 3개라고 하면 3개의 각각 pick이 되어있다. 거기서 제일 첫번째 커밋 pick 기준으로 나머지 커밋들을 squash를 사용해야하므로 S를 작성한다. 참고로 Git Squash는 여러번 커밋한 이력을 하나의 커밋 이력으로 만드는데 사용한다.즉, squash를 선택하는 commit들을 합쳐서 하나의 커밋으로 만드는 작업이다.

통합된 최종커밋본의 커밋 메시지 작성하기

--- 통합된 최종커밋본의 커밋 메시지 작성하기 ---

# This is a combination of 3 commits.
# This is the 1st commit message:

first commit

# This is the commit message #2:       =>  Fix Squash Task

second commit

# This is the commit message #3:

third commit

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Mon Apr 20 14:42:26 2020 +0900
#
# interactive rebase in progress; onto db078da
# Last commands done (3 commands done):
#    squash 0118d46 second commit

내가 원하는 commit를 작성한다. first , second, third를지우고 fix로 고쳤다. 이건 원하는대로 작성하면된다.

git push origin 브랜치이름 -f

-f를 붙여야 강제성을 띄어 push가된다.

profile
Front-end Developer

1개의 댓글

comment-user-thumbnail
2021년 1월 3일

잘 보고 갑니다

답글 달기