본문 바로가기
자바 , 기타 공부/GIT

GIT REBASE / GIT을 이용한 흐름 파악

by 임지혁코딩 2024. 1. 21.

 

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