2019.08.20 Git 튜토리얼 보며 따라하기 - Branch(2), Rebase
1. git remote
git remote show [Remote NAME] → 원격 저장소의 정보를 보여줌. 보통은 origin이 Remote Name에 들어갈테고 origin 저장소의 정보 (로컬/원격 브랜치 정보, 그 브랜치가 포인팅하고 있는 원격 브랜치)를 나타낸다.
clone을 하고나면 origin/master는 origin 저장소의 최신 커밋을 포인팅한다. 그리고 로컬의 master브랜치는 origin/master 를 가리키게 된다.
origin/master에서 파생 된 브랜치에서 작업을 했는데 이 때 누군가가 master 브랜치를 업데이트 했다고 하자. 그러면 내 로컬의 origin/master 커밋 포인터는 예전 커밋을 가리키게 되는데 이때 comes in to play 하는 것이 fetch 명령어다.
현재 내가 작업중인 브랜치에서 단순히
git remote add [REPONAME] 으로 원격 저장소를 등록할 수 있다고 하는데 이미 origin 이라는 원격 레포가 있는 상태에서 실행하니까 똑같은 레포지토리를 가리킨다.
2. Rebase
Rebase를 하든지, Merge를 하든지 최종 결과물은 같고 커밋 히스토리만 다르다는 것이 중요하다.
Rebase 의 경우는 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합치고 Merge 의 경우는 두 브랜치의 최종결과만을 가지고 합친다.
git remote show [Remote NAME] → 원격 저장소의 정보를 보여줌. 보통은 origin이 Remote Name에 들어갈테고 origin 저장소의 정보 (로컬/원격 브랜치 정보, 그 브랜치가 포인팅하고 있는 원격 브랜치)를 나타낸다.
clone을 하고나면 origin/master는 origin 저장소의 최신 커밋을 포인팅한다. 그리고 로컬의 master브랜치는 origin/master 를 가리키게 된다.
origin/master에서 파생 된 브랜치에서 작업을 했는데 이 때 누군가가 master 브랜치를 업데이트 했다고 하자. 그러면 내 로컬의 origin/master 커밋 포인터는 예전 커밋을 가리키게 되는데 이때 comes in to play 하는 것이 fetch 명령어다.
현재 내가 작업중인 브랜치에서 단순히
git fetch origin
을 하게 된다면 현재 로컬의 저장소가 갖고 있지 않은 새로운 정보가 있으면 모두 내려받고, 받은 데이터를 로컬 저장소에 업데이트하고 나서, origin/master 포인터의 위치를 최신 커밋으로 이동시킨다.git remote add [REPONAME] 으로 원격 저장소를 등록할 수 있다고 하는데 이미 origin 이라는 원격 레포가 있는 상태에서 실행하니까 똑같은 레포지토리를 가리킨다.
$ git remote add teamone <https://github.com/hyungjunk/Study.git>
$ git remote show
origin
teamone
$ git remote -v
origin <https://github.com/hyungjunk/Study.git> (fetch)
origin <https://github.com/hyungjunk/Study.git> (push)
teamone <https://github.com/hyungjunk/Study.git> (fetch)
teamone <https://github.com/hyungjunk/Study.git> (push)
$ git push teamone master
Everything up-to-date
2. Rebase
Rebase를 하든지, Merge를 하든지 최종 결과물은 같고 커밋 히스토리만 다르다는 것이 중요하다.
Rebase 의 경우는 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합치고 Merge 의 경우는 두 브랜치의 최종결과만을 가지고 합친다.
git rebase : <현재 브랜치에 다른 브랜치의 변경사항을 머징하되, 히스토리를 일자 선형으로 관리하는 것>
브랜치가 뻗어나온 조상으로부터 변경사항이 여러개 생겼는데 동시에 다른 브랜치에서도 변경사항이 생겼다면 merge 하거나 rebase 하는 옵션이 있다.
merge는 아주 명시적으로 다른 브랜치의 내용을 현재 브랜치에 가져왔다고 히스토리에 보여준다.
(현 브랜치의 커밋에 다른 브랜치의 화살표가 가리키는 것을 볼 수 있음)
반면 rebase는 다른 브랜치의 변경사항을 병합하지만, 브랜치 히스토리에 다른 브랜치의 개입을 볼 수 없다. 아니 개입은 있지만, 좀 더 정확히 말하자면 현 브랜치의 커밋을 다른 브랜치가 가리키는 것을 볼 수 없다. 왜냐하면 현 브랜치의 일자로 쭈욱 이쁘게 뻗어온 히스토리 안에 다른 브랜치의 커밋 내역도 포함되기 때문이다.
만약 A 브랜치 rebase onto B 브랜치를 한다면, A 브랜치에서 rebase를 할건데 (쉽게말해, 히스토리 예쁘게 만들건데) B 브랜치를 내 일자형 히스토리 안에 집어넣을것이다. 라고 선언하는 것이다.
물론 이 뒤에 다른 브랜치에서 머징은 필요하다.
A브랜치, B브랜치 모두 마스터 브랜치는 아닐 것이며 마스터에 병합하기 전에 아마 정리하는 용도로 사용할 것이다.
용례: 자식 브랜치에서 쭉 커밋을 해왔는데 그 동안에 master 브랜치도 많이 업데이트 되었다.
그럼 자식 브랜치에서 master branch를 onto대상으로 두고 리베이스를 하면, 마스터의 내용이 머징이되는 동시에 커밋 히스토리도 선형적으로 변한다. 컨플릭은 날 수 있으므로 체크해줘야 한다.
댓글
댓글 쓰기