MERGE를 먼저 생각해보자 .
간단하게 생각하면, 1 ,2 COMMIT 이후 FEATURE BRANCH를 파서
3 ,4 COMMIT을 진행하고 2COMMIT에서 다시 MASTER BRANCH의 5 ,6 COMMIT을 진행한 상태이다.
* MASTER의 내용을 FEATURE로 가져오려면?
GIT CHECKOUT FEATURE, GIT MERGE MASTER 을 진행하면
기타 사항으로 ,아마도 5 6 3 4 가 거의다 반영된 형태가 등장할 것이다.
이제, REBASE를 고려하자 .
BASE는 MASTER가 된다 ( FEATURE 입장에서 , 내 근간은 MASTER에 있기 때문에 )
이 BASE를 변경하겠다는 것이, REBASE라고 볼 수 있다.
내 시작점을. 현재의 master로 바꾸겠다!
git checkout feature, git rebase master를 진행했다고 생각하자 .
1. 임시 저장소에 , 3 4 가 들어간다.
2. 그 이후 3, 4는 사라진다.
3. 그 이후 master branch앞으로 간다.
그 결과 자체는, merge와 비슷하다 ( 3+4+5+6)
하지만, merge는 병렬로 history가 진행되고, rebase는 일렬로 변화가 진행한다. (history가 보기 쉽다)
그렇지만 rebase는 위 험 하다 .
rebase는 사실 이렇게 merge할때 주로 사용하지 않고,
pull 타이밍을 놓쳐 masterbranch의 commit을 적용한 이후 내 적용 사항을 가지고 올때 사용한다.
(pull로 가져오면 순서가 안맞고, 병합 커밋이 발생되기 때문에 )
*잠깐 정리하자면 ,
내 local branch는 4 5 , master는 2 3 일때.
rebase를 하면 local은 1 23 45 .
pull을 하면 1 45 23 이 된다.
맞춰줘야 push 가 가능하다.
rebase를 사용하여 동기화 ( 123시작)을 맞춰두고, push를 진행해도 된다.
-origin/master가 12345가 될 것이다.
push는 합병은 아니다.
헷갈리지 말자. push는, branch간의 합병과 같은 내용이 아니고
내 로컬 저장소의 내용을 원격에 올릴 뿐이다.
하지만, 그 과정에서 pull은 merge 형태로 받아오고, rebase를 사용하면 rebase형태로
받아올 수 있는 것이다.
(이떄는 git fetch origin (로컬에 받아와서 ) -> git rebase origin/master branch를 받아올 수 있다. )
즉 :
원격저장소에서 로컬 저장소로 받아올때는 pull, fetch rebase등을 활용한다.
그 이후 원격 저장소로 보낼때는 push 를 활용해서 보낸다 .
그다음에 원격 저장소 끼리 merge 한다. (프로젝트 가장 마지막 쯤)
# rebase 사용시 주의사항!
동일한 파일 동일한 위치일 경우에 충돌이 날 수 있다.
*이를 병합하면, master에서 다시 병합을 위한 commit이 발생할 수 도있다.
또한, 남과 공유하지 않은 commit에만 사용한다.
#작업시에는 원격에 master,sub가 있다면.
나는 hellomaster,hellosub (혹은 origin/sub, origin/master등을 fetch를 통해 가져온다.)의 경로로 있다.
와 같이 원격 저장소와 유사하게 맞추어 둔다.
그 후 작업하고, 내가 속한 팀이 sub라면 sub branch에 push하여준다.
실제 업무에서는, 명확하게 팀 별로 역할을 분담하여
rebase보다는 merge를 주로 사용한다고 한다.
rebase시는 history를 파악하기 어렵기 때문 !
++ 원격 저장소 활용
원격 저장소에 A->B,C가 있으면 . 나는 A->B,C를 모두 받아와야한다고 생각했으나, 그럴 필요가 없다.
나는 한 BRANCH에서만 작업을하고, 해당 내용을 PUSH. PULL
그리고 MERGE하는 행위(목표 달성 후 ) 를 주로 활용한다.
git checkout -b WeatherOpenApi
git add . git commit -m "Create WeatherOpenApi branch"
git push origin WeatherOpenApi
로 간단하게 내 BRANCH를 원격 BRANCH에 추가,
git push origin 내 HEAD:원격BRANCH 로 BRANCH 생성 X
둘 다 가능하다.
같은 느낌으로,
원격에 master -> a ,b 가 있고 a에서 뻗어가는 원격 branch를 생성하고 싶다면
git push origin a-small:a
를 진행하면 된다.
이미 BRANCH가 있다면 자동으로 그 BRANCH에 PUSH될것이고,
ORIGIN이라는 명령어는 ORIGIN이라는 BRANCH가 아니라 원격 저장소에 PUSH한다는 의미를 지닐 뿐이다.
이미 내 작업은 3, 나와 같은 브랜치를 공유하는 남의 작업이 2에서 시작된 a라면?
1. git fetch를 사용, 새로운 브랜치를 생성한다.
2. 변경사항을 보고, 현재 내 브랜치에 가져올지를 결정한다.
3. 이후 rebase 등을 고려한다.
'자바 , 기타 공부 > GIT' 카테고리의 다른 글
깃 활용 2 , GITHUB (0) | 2024.01.20 |
---|---|
GIT BRANCH (0) | 2024.01.16 |
깃 개념 (0) | 2024.01.16 |
깃 활용 -1 기초 (0) | 2023.12.25 |