티스토리 뷰
개요
github 등에서 협업을 하다보면 아래와 같은 상황을 만나곤 한다.
1) branch 를 따서 작업을 완료하여 remote에 pull request 를 하고픈데
2) 이미 branch 를 딴 master 에 추가적인 merge 가 이루어졌다.
3) 어떻게 해야할까?
원문 참고링크: https://teamairship.com/update-outdated-branch-without-creating-merge-commit/
충돌은 없는 상황 - no conflict
상황
|
master 와 feature branch 가 있다. 모두 remote repo 와 최신으로 맞춰져 있는 상태
readme.txt 파일에는 "master edit" 이 들어있다. |
|
내가 아닌 다른 누군가가 master에 추가 commit 을 한 상황을 만들어보자.
1) master branch 에서 readme.txt 에 "foo commit1" 이라고 추가하고 2) commit 하고 push 한 다음에 3) master branch 를 reset 해주었다. (git reset --hard HEAD~1)
|
|
local 의 feature branch 에서 새로운 commit 을 한다.
1) origin master 와의 conflict 가 없도록 readme2.txt를 만든다. - git pull --rebase 시에 conflict 가 나지 않게된다. 2) feature commit1 이라는 문구를 추가해주었다. |
해법
origin master 에 merge 된 'foo commit' 위에 나의 수정사항을 반영한 다음 pull request 를 날리고 싶다.
|
git pull --rebase origin master 를 먹였더니 이렇게 되었다.
- rebase 를 하고픈 <remote repo> <branch> 명을 origin master 라고 준 것. - 나의 수정사항인 readme2.txt 도 있고, - origin master 의 readme.txt 에 commit 된 내용인 foo commit1 도 들어있다.
|
|
이제 local 의 feature branch 를 remote 로 올려보자 git push 만 먹이면 된다.
- 만약 remote (= origin/feature) 역시 외부에서 commit 이 이루어진 상황이라면 - git push --force-with-lease origin feature 를 먹여주면 된다. → --force 시 충돌이 나는 경우에 push 하지 않는 옵션이다.
|
충돌 발생 - conflict!
상황
|
master 와 feature branch 가 있다. 모두 remote repo 와 최신으로 맞춰져 있는 상태
readme.txt 파일의 상황을 보자 |
|
내가 아닌 다른 누군가가 master에 추가 commit 을 한 상황을 만들어보자.
1) master branch 에서 readme.txt 에 "foo commit2" 이라고 추가하고 2) commit 하고 push 한 다음에 3) master branch 를 reset 해주었다. (git reset --hard HEAD~1)
|
|
local 의 feature branch 에서 새로운 commit 을 한다. - 여기서 차이가 발생한다.
1) origin master 와의 conflict 가 생기도록 readme.txt 를 변경해준다 2) me commit2 이라는 문구를 추가해주었다. |
충돌시의 해법
origin master 에 merge 된 'foo commit2' 위에 나의 수정사항을 반영한 다음 pull request 를 날리고 싶다.
|
git pull --rebase origin master 를 먹였더니 충돌이 발생했다.
에러 메시지에 해법이 다 들어있다. 충돌이 난 파일인 readme.txt 파일을
1) 수정을 한다음 git add 를 해주거나 2) git rm 으로 삭제를 해버린 다음 → git rebase --continue 를 해주면 된다.
아예 이 상황을 되돌리고 싶다면 → git rebase --abort
|
|
충돌난 부분을 수정해보자
readme.txt 를 열먼 왼쪽과 같다 ========= 를 기점으로 위쪽에는 <<<<<<< HEAD 까지 remote 측의 수정사항이 보이고 아래쪽엔 >>>>>>> me commit2 까지 나의 수정사항이 보인다.
이를 아래와 같이 두 수정사항을 합치는 방향으로 충돌을 해결하고 저장하였다. |
|
1) git add readme.txt 로 충돌을 official 하게 해결하고
2) git rebase --continue 를 해준 상태 |
|
이제 local 의 feature branch 를 remote 로 올려보자 git push 만 먹이면 된다.
- 만약 remote (= origin/feature) 역시 외부에서 commit 이 이루어진 상황이라면 - git push --force-with-lease origin feature 를 먹여주면 된다. → --force 시 충돌이 나는 경우에 push 하지 않는 옵션이다. |
덧붙이는 말
Git 은 다양한 GUI애플리케이션이 있다.
개인적으로는 Sourcetree 를 쓰다가 몇 달 전부터 Git Extensions 를 쓰고 있다.
GUI애플리케이션이 가 편리하긴 하지만 실제로 어떤 세부적인 동작이 이루어 지는지 알기 어려운 단점이 있다.
- GUI 를 쓸때에도 실제로 안내되는 명령어들을 챙겨보면 얻는게 많다.
- CLI 를 쓰게되면 위 본문에 언급한데로 다양한 상황에서 추전 명령어들이 뜨고, 이를 따라하기만 해도 많이 늘게 된다.
'git' 카테고리의 다른 글
Git in the office (0) | 2020.04.28 |
---|---|
.git - 쩜깃의 이해 (0) | 2019.01.24 |
git commit 을 gpg 로 암호화하기 (0) | 2019.01.04 |
엉뚱한 branch에서 작업하고 commit 해버렸다면 (0) | 2018.07.04 |
github 에 pull request 하기 (0) | 2018.07.04 |
- Total
- Today
- Yesterday
- strange
- bun
- intellij
- go
- 2023
- 독서후기
- OpenAI
- 독서
- Gin
- 제이펍
- websocket
- github
- notion
- Bug
- 체호프
- ChatGPT
- postgres
- folklore
- Shortcut
- JIRA
- 영화
- solid
- pool
- API
- 노션
- golang
- 클린 애자일
- 잡학툰
- agile
- 인텔리제이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |