git rebase, commit에 대한 스트래스는 이제 그만

뚜시뚜시·2020년 3월 31일
4
post-custom-banner

2020-03-31 git rebase, commit에 대한 스트래스는 이제 그만


git rebase는 commit을 합치거나 삭제하는 등 내 입맛대로 commit들을 제어하는 것이다.


1. Rebase란?

브랜치 병합 전략

두개의 브랜치가 존재할 때, 병합시 사용할 수 있는 방법은 두 가지이다.

  1. Merge
  2. Rebase


Merge vs Rebase

merge를 사용할 지, Rebase를 사용할지는 프로젝트의 히스토리는 어떤 관점으로 보느냐에 따라 다르다.

Merge의 히스토리

작업한 내용의 사실을 기록한 것

Merge로 브랜치를 병합하게 되면 커밋 내역에 Merge commit이 추가로 남는다. 따라서 Merge를 사용하면 브랜치가 생기고 병합되는 모든 작업 내용을 그대로 기록하게 된다.

Rebase의 히스토리

내가 보여주고 싶은 것만 기록한 것

하지만 Rebase의 경우에는 브랜치를 병합할 때 이런 Merge commit을 남기지 않고, 내 입맛대로 commit을 만질 수 있기 때문에 남들에게 보여주고 싶은 모습만 보여 줄 수 있다.


[ 참고 ]

🎢 Git Rebase 활용하기


2. rebase 사용법

$ git rebase -i [수정을 시작할 커밋의 이전 커밋] : 수정할 커밋들의 리스트가 출력 된다.

# 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 message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.




  • Pick

pick은 커밋을 사용하겠다는 의미. 이를 이용해서 커밋의 순서를 바꿀 수도 있고, 커밋의 해쉬값을 이용해 특정 커밋을 가져올 수 도 있다.

[ 커밋 순서 변경 전 ]

pick 6c50541 Create dog.txt
pick 46bd883 Create lion.txt
pick 123f82d Create cat.txt

이 커밋들의 순서를 바꿀 수 있는 pick 커멘드!

[ 커밋 순서 변경 후 ]

pick 6c50541 Create dog.txt
**pick 584ed9b Create cat.txt
pick eea10a8 Create lion.txt**

실제 커밋 히스토리를 살펴보면, 커밋들의 순서만 단순히 바뀌었지만, 해쉬값들은 변경된 것을 볼 수 있다.

또한 commit의 해쉬값을 기억해놓았다가 pick으로 살릴 수 있다.

앞서 생성 했던 커밋의 해쉬값이 기억이 나지 않을땐 $ git reflog 명령어를 사용.

  • reword
    reword는 커밋 메세지를 변경하는 명령어이다.

커밋 메세지를 변경할 커밋 앞에 reword 명령어를 쓴 후 저장하면, 해당 커밋의 메시지를 다시 작성하는 에디터 창이 열린다. -i 가 "대화형" 옵션이다.

$ git commit --amend : 단순히 이전 커밋메시지만 변경 할 때 사용.

  • edit
    커밋 메시지 뿐만 아니라 커밋의 작업 내용도 변경 할 수 있는 명령어이다.

저장 후 종료하면, 변경할 커밋으로 checkout이 된다. 그 상태에서 변경할 작업을 수행하면 됌.

$ git add lion.txt
$ git add tiger.txt
$ git commit --amend

변경 사항들은 아래처럼 커밋에 반영하면 된다.

$ git rebase --continue

커밋이 성공적으로 수행되었다면, continue 명령어를 실행하자.

  • Squash
    squash은 해당 커밋을 이전 커밋과 합치는 명령어이다.

이상태로 저장 후 종료하면, 커밋 메세지를 수정할 수 있는 에디터 창이 뜬다. 그 후, 하나로 합쳐진다.

  • fixup
    fixup은 squash와 똑같이 이전 커밋과 합치는 명령어 이지만, 커밋 메세지는 합치지 않는다. 결과적으로 이전 커밋 메세지만 남는다.
  • exec
    각각의 커밋이 적용된 후 실행할 shell 명령어를 지정할 수있다.

각각의 커밋이 실행된다는 것을 확인하기 위해 중간중간에 메시지를 넣는 행위.

  • drop
    커밋 히스토리에서 커밋을 삭제하는 명령어.

사실 그냥 커밋 한 줄을 통째로 지워도 동일한 결과를 얻을 수 있다



주의사항

git rebase 는 이전의 커밋 히스토리를 변경하는 것이기 때문에 정말 조심해야한다. 그리고 만약 이미 github 원격저장소에 push한 상태라면 commit을 변경하더라도 저장이 안된다. 이때 써야 하는 명령어는 $ git push --force , $ git push -f 이다. 이 명령어를 쓴다면 이전의 커밋 히스토리를 강제로 덮어쓴다.

이런 상황에 만약 다른 개발자들과 공요하고 있던 커밋 히스토리의 불일치가 발생한다면 git이 꼬였다라는 상황이 발생할 수도 있기 때문에 rebase를 사용할땐 신중해야한다.

( git rebase를 사용 한다면 다른 협업자에게 동의를 구한 후 정리하고 다같이 맞춰서 해야할 듯 )




[ 참고 ]

git rebase -i 사용하기

  • < rebase -i 편집을 vscode로 변경하는 법 >

[ 참고 ]

How to use Visual Studio Code as Default Editor for Git




profile
ddusi ddusi
post-custom-banner

0개의 댓글