#1 rebase
base commits이란 무엇일까?
아래 그림처럼 바로 push나 PR을 했던 commit들이 차곡차곡 쌓인 상태를 말한다.
commit을 새로 할때마다 기본 commit이 차곡차곡 쌓인 상태에서 새로운 commit을 또 쌓게 될 수 밖에 없다.
즉, 다른 오픈소스 개발자에 의해 프로젝트가 계속 변경되면 commit이 계속 추가될 수도 있다는 것이다.
위에 기술한 사유 때문에 사용자가 갖고 있던 base commits을 새롭게 갱신해줄 필요가 있다
이것이 바로 rebase이다 base만 교체해서 충돌을 방지하는 것이다.
이 과정을 GIF로 담아 보았다.
(1) $ git fetch upstream master (최신 가져오기)
ㄴ 추가된 최신 commit들을 로컬로 가져온다 (fetch만 하는것이 나음 .git 히스토리 폴더에만 저장)
ㄴ pull을 해서 가져오지 않는 이유는 명령어를 두번 쓴거와 같기 때문이다 (pull = fetch + merge)
fetch = 원격 저장소(repository)에서 커밋, 파일 등을 가져와서 볼 수 있음
원격저장소에 있는 변경사항들을 로컬저장소에 가져오기 전에 변경내용을 확인하고 싶은 경우 사용
pull = 원격저장소(repository)에 있는 변경사항들을 로컬저장소로 가져와 합칠때 사용
fetch랑 다르게 로컬디렉로리에 변경내용을 병합
merge = 다른 branch에서 작업을 다 끝낸 파일을 원래 master 브랜치에 합치는 것
(2) $ git rebase upstream/master ("upstream/master" 브랜치명이 자동 생성)
ㄴ 현재 Base를 최신으로 갱신한다
GitHub 내에서도 이 과정을 수행할 수 있는데, 우측 상단의 Fetch upstream을 눌러보면 확인 가능하다
(1) Fetch가 필요없는 상황
(2) Fetch가 필요한 상황
만약 내가 작업하던 소스코드가 다른사람에 의해 변경되고 commit 될 때가 있을 수도 있다.
이러한 경우에는 다음과 같은 절차로 진행하면 된다.
rewind (수정된 내꺼빼기) > rebase (베이스 수정/내용 패치) > (내가 만들었던 내용 넣기)
(1) $ git rebase -i --root
ㄴ -i 는 rebase를 할 때, interactive 기능을 사용하기 위해 사용하는 옵션 (이전의 커밋조작을 위함)
ㄴ --root 는 최초 커밋부터 리베이스하기 위해 붙이는 옵션
(2) $ git log --oneline
ㄴ --oneline은 log를 한줄로 보여줌
(3) $ git status
ㄴ rewind 상태 확인하기
이 과정을 마치고 아까 기술했던 rebase 과정을 시행하면 된다.
알아두면 좋을 명령어
1) rebase 취소 = $ git rebase --abort
2) 히스토리 전체 원상 복구 하는 방법 = $ git reset --hard origin/master
이상으로 git 사용기본법을 마치도록 하겠습니다
모르는게 있으면 댓글 달아주세요!