티스토리 뷰

git

git pull --rebase 를 쓰자

주먹불끈 2019. 1. 15. 17:15

개요

 

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
«   2024/04   »
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
글 보관함