2020-03-31 git rebase, commit에 대한 스트래스는 이제 그만
git rebase는 commit을 합치거나 삭제하는 등 내 입맛대로 commit들을 제어하는 것이다.
두개의 브랜치가 존재할 때, 병합시 사용할 수 있는 방법은 두 가지이다.
merge를 사용할 지, Rebase를 사용할지는 프로젝트의 히스토리는 어떤 관점으로 보느냐에 따라 다르다.
작업한 내용의 사실을 기록한 것
Merge로 브랜치를 병합하게 되면 커밋 내역에 Merge commit이 추가로 남는다. 따라서 Merge를 사용하면 브랜치가 생기고 병합되는 모든 작업 내용을 그대로 기록하게 된다.
내가 보여주고 싶은 것만 기록한 것
하지만 Rebase의 경우에는 브랜치를 병합할 때 이런 Merge commit을 남기지 않고, 내 입맛대로 commit을 만질 수 있기 때문에 남들에게 보여주고 싶은 모습만 보여 줄 수 있다.
[ 참고 ]
$ 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 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 명령어를 쓴 후 저장하면, 해당 커밋의 메시지를 다시 작성하는 에디터 창이 열린다. -i
가 "대화형" 옵션이다.
$ git commit --amend
: 단순히 이전 커밋메시지만 변경 할 때 사용.
저장 후 종료하면, 변경할 커밋으로 checkout이 된다. 그 상태에서 변경할 작업을 수행하면 됌.
$ git add lion.txt
$ git add tiger.txt
$ git commit --amend
변경 사항들은 아래처럼 커밋에 반영하면 된다.
$ git rebase --continue
커밋이 성공적으로 수행되었다면, continue 명령어를 실행하자.
이상태로 저장 후 종료하면, 커밋 메세지를 수정할 수 있는 에디터 창이 뜬다. 그 후, 하나로 합쳐진다.
각각의 커밋이 실행된다는 것을 확인하기 위해 중간중간에 메시지를 넣는 행위.
사실 그냥 커밋 한 줄을 통째로 지워도 동일한 결과를 얻을 수 있다
git rebase
는 이전의 커밋 히스토리를 변경하는 것이기 때문에 정말 조심해야한다. 그리고 만약 이미 github 원격저장소에 push한 상태라면 commit을 변경하더라도 저장이 안된다. 이때 써야 하는 명령어는 $ git push --force
, $ git push -f
이다. 이 명령어를 쓴다면 이전의 커밋 히스토리를 강제로 덮어쓴다.
이런 상황에 만약 다른 개발자들과 공요하고 있던 커밋 히스토리의 불일치가 발생한다면 git이 꼬였다라는 상황이 발생할 수도 있기 때문에 rebase를 사용할땐 신중해야한다.
( git rebase를 사용 한다면 다른 협업자에게 동의를 구한 후 정리하고 다같이 맞춰서 해야할 듯 )
[ 참고 ]
[ 참고 ]
How to use Visual Studio Code as Default Editor for Git