내 로컬저장소를 원격저장소를 반영하여 최신 베이스만들기
내 로컬저장소를 원격저장소를 반영하여 최신 베이스만들기
세가지 방법이 있다.
명령어 | 결과 | 특징 |
---|---|---|
Git pull | 내 로컬머신이 remote저장소베이스 그대로 갱신(브랜치까지 싹 다) | 로컬과 remote변경사항 확인불가 |
Git merge after git fetch | fetch후 충돌/차이점 확인 후 내 로컬머신에 갱신, 머지커밋생성됨 | 로컬과 remote변경사항 확인가능 |
Git rebase after git fetch | 내 커밋아래에 remote의 커밋이 쌓이고 그 위에 내 커밋이 얹음 | master브랜치에 사용하지말것 |
공통 설정 두가지
git remote -v
- origin 저장소만 있다면 최신레포를 가져올 upstream저장소를 연결해줘야한다.
- origin과 upstream 두개가 있어야하며
- origin: 내 아이디가 있는 내fork한 레포주소.
- upstream: 최신레포를 가져 올 공식레포주소.
- origin 저장소 주소 변경하고싶다면?
1 | gir remote -v |
git remote add 최신반영하고싶은_저장소이름 최신반영하고싶은_레포주소
1 | git remote add upstream 공식레포주소 |
최신베이스만들기 첫번째 방법 : pull
- fetch + merge = pull
1 | git pull upstream master |
최신베이스만들기 두번째 방법 : fetch + rebase
git fetch 최신반영하고싶은_저장소이름 가져올브랜치명
- fetch는 임시 저장해놓은 것이라서 fetch했다고 내 로컬의 브랜치에 반영되지 않는다 -> fetch분과 내 로컬 브랜치를 merge해줘야한다.
- 보통 upstream을 많이 사용함. upstream말고 다른 저장소명써도 상관없음.
- fetch를 쓰는 이유 : 내 로컬저장소와 원격저장소르 비교하여 차이점을 볼 수 있기때문
git rebase upstream/master
: 임시저장분(fetch)을 내 로컬머신의 커밋 아래로 저장해야한다.git log
: 머지커밋이 생성안됨. 신규 커밋 없음을 확인할 수 있다.git push origin 브랜치명
: 최신베이스가 반영된 내 로컬의 데이터를 깃헙 내fork한레포에 반영하고싶다면 git push하면된다
1 | //상황 |
최신베이스만들기 세번째 방법 : fetch + merge
git fetch 최신반영하고싶은_저장소이름 가져올브랜치명
- fetch는 임시 저장해놓은 것이라서 fetch했다고 내 로컬의 master브랜치에 반영되지 않는다 -> fetch분과 내 로컬 master브랜치를 merge해줘야한다.
- 보통 upstream을 많이 사용함. upstream말고 다른 저장소명써도 상관없음.
git merge upstream master
- 임시저장분(fetch)을 내 로컬머신으로 저장하기위해서는 master브랜치로 가야한다
- 임시저장분(fetch)이 내 로컬머신의 브랜치로 저장된다.
git log
: 머지커밋이 생성된걸 확인 할 수 있음git push origin 브랜치명
: 최신베이스가 반영된 내 로컬의 데이터를 깃헙 내fork한레포에 반영하고싶다면 git push하면된다
1 | //1. upstream의 master브랜치에 있는 최신 변경분을 가져오다는 의미 |
최신베이스 유지를 위해 pull
이 아닌 fetch > rebase
를 해야하는 이유
- 깃헙저장소 master를 로컬 master로 pull받아온다.
- 로컬에서 작업 하는 동안 깃헙 저장소에 새로운 커밋이 추가되었다.
- 여기서 내 로컬과 원격 저장소의 싱크를 맞추고싶다면 즉, 원격의 새로운 커밋을 내 로컬에 반영시키고싶다면 무조건 리베이스해야한다
- git pull하면 나중에 커밋한 내용을 합칠 수 없다.
- git fetch upstream master -> git rebase upstream/master 하면 싱크를 맞출 수 있다.
- 리베이스는 혼자만 하는 브랜치에서만 작업하는 것이 좋다.
- 커밋을 하나로 합칠때 interactive rebase 사용해야한다.