Git merge와 rebase

Seongho·2022년 12월 29일
0

목록 보기
8/12
post-custom-banner

활용

git branch --all : 원격 저장소와 연결된 모든 브랜치를 보여준다.
git branch -d 브랜치명 : 해당 브랜치 삭제
git branch --move 이전이름 나중이름 : 브랜치명 변경

Merge

fast-forward merge

이전 커밋과의 충돌 없이 그냥 merge될 수 있는 merge로, 커밋을 남기지 않는다.
merge 했다는 커밋을 남기고 싶다면 git merge --no-ff "merge할 브랜치"를 사용한다.

three-way merge


master 브랜치가 d에 있을 때, f와 그냥 merge 해버리면 fast-forward merge가 되지만, g를 잃어버리게 된다. 따라서 g와 f를 merge해야 하는데, 이때, three-way merge라 하고 커밋을 남겨야 한다.

충돌 해결(수동)

  1. git merge merge할 브랜치
  2. 1에서 충돌 나면 일단 git status 해서 상태 확인.
  3. 2에서 확인해서 충돌난 파일을 열어서 수정.
  4. merge 취소할거면 git merge --abort
  5. merge 할거면 git add 수정한 파일
  6. git merge --continue 하고 커밋 메세지 작성.

충돌 해결(VSC 사용)

git config --global -e를 통해 config를 edit옵션으로 열어서

[merge]
	tool = vscode
[mergetool "vscode"]
	cmd = code --wait $MERGED

를 입력하여 merge를 할 때, vsc를 사용할 수 있도록 세팅한다.
1. git merge merge할 브랜치
2. 1에서 충돌 나면 일단 git status 해서 상태 확인.
3. git mergetool 하면 vsc로 이동
4. 다 수정하고 나면 .orig란 파일이 생기는데, 이거는 merge를 완벽히 수행하기 전의 파일인데, 이거 없애고 싶으면 git config --global mergetool.keepBackup false를 해주면 된다.
5. git add 수정한 파일
6. git merge --continue 하고 커밋 메세지 작성.

rebase


위와 같은 상황에서 g와 f를 merge하려면 충돌이 나는데, 이를 피하기 위해서 e의 부모를 g로 바꿔준다면(rebase) 충돌이 나지 않고 fast-forward merge가 가능하다.

로컬 환경에서 작업하거나, 브랜치에서 나 혼자만 작업한다면 매우 유용하게 사용할 수 있다. 한 브랜치에서 동시에 같이 작업한다면 사용하지 않는게 좋다.

rebase example


이 상태에서 feature-b와 master를 fast-forward merge 하기 위해서는 feature-b를 master로 rebase 해준 후 master에서 feature-b를 merge하면 된다.
1. head를 feature-b로 이동시킨다.
2. git rebase master
3. rebase 한 후 상태

4. head를 master로 이동시킨다.
5. merge한다.

rebase --onto


이 상황에서 UI를 d로 rebase하고 싶다면?

rebase --onto example


이 상태에서 profile-ui 브랜치는 profile 브랜치에서 파생된 브랜치이다. 그런데, 이제 profile-ui 브랜치를 master과 충돌 없이 merge하고 싶다면, profile-ui를 master에서 파생된 것으로 rebase해주면 된다. 이 때,
git rebase --onto master profile profile-ui (master에 profile에 파생된 profile-ui를 rebase하라) 를 하면

이렇게 된다.

profile
Record What I Learned
post-custom-banner

0개의 댓글