[Git] Git으로 협업하기 - pull(merge) vs rebase
study/git
*브랜치 생성 및 전환
$ git init
: 현재 폴더(프로젝트)를 git 명령어를 사용할 수 있는 폴더로 변경한다.
$ git branch 브랜치명
: 브랜치(분기)를 생성한다.
$ git branch
: 현재 작업 중인 브랜치와 로컬 브랜치의 목록을 확인한다.
$ git switch 브랜치명
: 해당 브랜치로 이동한다.
$ git checkout -b 브랜치명
: 브랜치를 생성하고 해당 브랜치로 이동한다.
← git branch 브랜치명 + git switch 브랜치명
PLUS: git log 시, HEAD는 현재 작업 중인(위치한) 브랜치를 가르킨다.
*브랜치와 커밋의 관계
$git log --oneline
: 한 줄에 한 커밋씩 보여준다.
$git log --branches
: 각 브랜치의 최신 커밋을 보여준다.
→ $git log --oneline --branches
$git log --graph
: 특수 기호를 사용하여 시각적으로 브랜치와 커밋 내역을 보여준다
$git log 기준 브랜치명..비교 브랜치명
: 기준 브랜치에는 없고 비교 브랜치에만 있는 커밋을 보여준다.
*로컬과 원격 동기화
$git clone 원격url
: 원격 저장소에서 최초로 프로젝트를 복제한다.
: git remote add 원격url이 이미 수행되어 있다.
$git fetch
: 원격 저장소의 업데이트 내용을 가져온다.
: 그러나 소스코드를 가져와 병합(merge)하지 않는다.
: 이후 git merge or git rebase를 통해 병합하는 과정이 필요하다.
$git merge 대상 브랜치명
: 현재 위치한 브랜치에 대상 브랜치를 병합한다.
//예시
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
$git pull
: 원격 저장소의 업데이트 내용을 가져온다.
: 원격 저장소의 소스코드를 가져와 현재 브랜치에 병합한다.
← git fetch + git merge
$git pull origin 브랜치명
: 원격 저장소의 특정 브랜치의 소스코드를 현재 브랜치에 병합한다.
$git rebase
: 기본적으로 git pull과 같은 기능을 수행한다
: 그러나 git pull(git merge)과 달리, 공통 조상(B)로부터 나뉜 분기를 유지하지 않고, 현재 작업 중인 브랜치를 대상 브랜치의 말단에 그대로 병합한다.
PLUS: fast forward merge
: 중간에 같은 부분을 수정한 다른 커밋이 없을 때, 현재 작업 중인 브랜치의 커밋이 기준 브랜치와 합쳐저, 다음 commit과 합쳐진다.
PLUS: 3ways merge
: 두 브랜치의 커밋 영역이 겹치지만, 그 내용이 다를 때 (history를 공유하지 않을 때) 수행한다.
: 두 브랜치의 공통조상과 각각의 두 브랜치가 모두 관여한다.
결론
CASE 1: git pull
1) git checkout -b test / git branch test → git switch test
2) git pull
3) git log --oneline --branches HEAD가 현재 브랜치를 가지고 있는가?
4) git add .
5) git commit -m ""
6) git push origin 현재 브랜치 (원격 저장소에 test를 반영한다)
7) PR 작성
CASE 2: git rebase
1) git checkout -b test / git branch test → git switch test
2) git rebase
3) git log --oneline --branches
4) git add .
5) git commit -m ""
6) git push origin test (원격 저장소에 test를 반영한다)
7) PR 작성