My Ability)Git내의 평행우주 - rebase,merge

백준우·2021년 11월 30일
0

Ability

목록 보기
5/5
post-thumbnail

1. Git내의 평행우주 만들기

1.1 git branch 만들기

1.2 branch 사이 이동

2. Git의 rebase,merge

2.1 merge의 동작순서

2.2 rebase의 동작순서

2.3 merge와 rebase의 특징


1. Git내의 평행우주 만들기

Git을 안쓰는 개발자는 거의 없다고 봐도 무방하다. 회사에서조차 협업을 할때 유용하게 사용하고 있는게 Git이기 때문이다.
Git은 branch를 통해 공유된 코드를 가지고 자신이 테스트하고 직접 수정여도 원본에 전혀 영향을 주지 않을 수 있다.
즉 같은 코드를 사용하는 또다른 평행우주를 내 Local내에 만들 수 있다는 것이다.

1.1 git branch 만들기

Git에서 branch를 만드는 방법은 간단하다.
먼저 Git에 자신의 Repository를 생성한뒤 하나의 branch를 확인 할 수 있다.

$ git branch 


위와 같이 입력을 하면 terminal창에 자신이 사용중인 local내의 branch들을 확인 할 수 있다.

그럼 위와 같은 branch들을 왜 사용하는 것일까?
EX) 이번에 난 하나의 프로젝트를 협업으로 진행하게 되었다. 팀원은 총 3명이고 각각 2명의 FrontEnd,1명의 BackEnd로 작업을 시작하게 되었다. 팀원끼리 사용할 레파지토리에서 하여 코드를 받아와서 작업을 시작하려 했지만 원본을 훼손시킬 염려가 있다.
!!! 이때 사용할수 있는 기능이 branch이다.

brunch를 생성하는 방법은 아래와 같다.

$ git checkout -b '생성할 branch명'

위 와 같이 다른 하나의 brunch를 생성하여 커밋하게 되면 기존의 있던 파일은 건드리지않고 새로운 파일로처럼 수정이 가능하게 되는것이다.
파일을 생성, 수정하였으면

$ git add '추가,수정한 파일명' 
OR 
$ git add . //변경된 파일 전체를 추가

를 한뒤 commit을 해준다.

$ git commit -m 'commit시 메세지'

완료 하였으면 push를 자신이 사용하던 brunch명으로 하여 입력한다.

$ git push origin 'branch명'

그럼 정상적으로 생성한 brunch로 파일을 생성하고 push까지 완료 한것을 알 수 있다.

1.2 branch에서 branch로의 이동

branch를 생성한 뒤에도 생성한 branch끼리 이동할 수있다.

$ git checkout '이동할 branch이름'

위 명령어를 입력하면 branch끼리 자유롭게 이동하여 파일을 수정하고 commit 할 수 있게 된다.

위 와 같이 master branch에서는 brunchA.js를 찾을 수 없지만

brunchA로 brunch를 이동하면 brunchA.js를 찾을 수 있는 것을 확인 할 수 있다.

2. Git의 rebase,merge

merge와 rebase는 commit한 파일을 합치는 명령어이다.
각기 다른 brunch에서 파일을 수정하였고 최종적으로 다른 branch에서 작업한 결과를 사용해야하면 brunch들을 합쳐서 병합해야될때도 있을것이다.
이때 사용하는것이 merge와 rebase이다.
둘다 branch들을 합쳐준다는 공통점이 있지만 최종 결과물은 다르게 출력이 될것이다.

2.1 merge의 동작순서

branch에 대해 설명할때 썼던 방식을 예로들어 설명해 보겠다.

위 상황에서

$ git checkout main //brunch를 main으로 바꿔준다.
$ git merge pack //main을 기준으로 pack을 merge 해준다.

그럼 아래와 같은 결과를 받을 수 있다.

위 그림처럼 merge를 사용하면 각기 다른 brunch로 commit을 하다가 하나로 병합을 할 수있다.
이때 기준이될 bracnh로 이동을 한 뒤 병합할 branch를 붙여주면 된다.

$ git merge '병합할 branch'

TIP) merge의 2가지 동작방식
1. fast-foward : 빨리감기라는 뜻으로 예를 들어 A branch에서 급하게 다른 것을 만들어보려고 B branch를 생성하고 B branch는 여러번의 commit이 있었다.
이런 상황에서 A branch에서 B branch를 merge한다고 가정할 때, A branch에서 B branch를 분기해준 것외에 별 다른 commit이 없었으므로 A branch는 B branch만큼 그냥 "빨리감기"하면 되는 상황이다.
그래서 이런 상황일 때 별도의 commit log없이 B branch가 만든 최신의 commit log를 가리키게 만드는 것을 fast-foward라고 한다.
2. recursive strategy : 재귀적인 전략으로 예를 들어 A branch에서 B branch를 생성했다. 그 후 A branch도 commit이 여러번 있었고 B branch도 commit이 여러번 있었을 때 A branch에서 B branch를 merge한다.
이러면 fast-foward할 수 없고 git은 A branch와 B branch의 조상 commit을 찾아 내부적으로 3way merge라는 방법을 이용하여 merge를 해준다.

  • 3way merge란? base를 참고하여 다른 두개의 branch를 병합하는 것
    각각의 branch에서 서로다른 변경된부분을 반영하고 base를 참고하여 branch와 base 둘다 변경되지 않았다면 변경안하는 것으로 반영한다. 하지만, base와 branch모두 변경되어 서로다른 부분은 충돌이 발생하는 것
    (참고 동영상 - https://youtu.be/J0W-WA0aYJI)

2.2 rebase의 동작순서

rebase는 말 그대로 brunch의 base 부분을 다시 설정해준다는 뜻이다.
이때 base란 branch가 만들어져서 시작되는 지점으로 생각하면 되겠다.

위 상황에서

$ git checkout main //brunch를 main으로 바꿔준다.
$ git rebase pack //가장 최근 commit된 main을 기준으로 pack을 rebase 해준다.


그럼 위와 같이 먼저 작동이 될것이다. (우리 눈에 시각적으로 보이는것이 아닌 시스템 적으로 일어나는 것이다.)
1. pack의 commit된 내용들이 TEMP로 저장되고
2. main의 가장 최근에 commit된 곳에 pack이 checkout 된다.

그뒤 최종적으로 아래와 같은 결과가 출력된다.

위 그림과 같이 최종적으로 pack이라는 branch의 base가 바뀐것을 확인했다.

주의점

만약 두 개의 branch에서 동시에 같은 파일의 같은 곳을 수정하고, 그것을 병합 한다면 충돌(Conflict)이 발생한다.
그리고 충돌이 발생했을 때 해결하는 것을 Conflict resolve라고 한다.


1열: HEAD는 현재 이동되어 있는 brunch를 뜻함
2열: 이동되어있는 branch의 파일중 충돌이 일어나는 부분
3열: 병합할 branch의 파일중 충돌이 일어나는 부분
4열: 병합할 branch의 명

위 이미지와 같이 충돌이 일어날 경우 두개의 brunch중 한개의 branch로 코드를 통일하여 다시 변경된 파일을 git add 해주고 두가지 경우가 있다.

merge 경우
1. git add .
2. git commit -m'메세지'
3. git push origin '현재 branch명'
4. git merge '병합할 branch명'

rebase 경우
1. git rebase --comtinue(충돌이 없어질때까지 add와 --continue를 반복)
2. git commit --amend로 최상단 메세지 제외하고 다 삭제한뒤
3. git push origin 'branch명'을 해준다.

TIP) 아래 명령어를 통해 자신의 git log 현황을 그래프 형식으로 가시적으로 볼수 있다.

$ git log --decorate --all --oneline --graph


느낀점

  • 현업에서 자주 쓰이는 git을 좀더 깊이 파고들었보았고 사람들과 함께 협업할때 유용하게 쓰일것으로 보인다.
  • 아직까지 미숙하지만 조금더 노력해서 git을 파고들어 봐야겠다.
  • 초급자는 되도록 rebase를 쓰지말라는 이유가 commit 기록이 유지가 안된다고 알고있다. 따라서 아직까지 초보이므로 merge를 애용하도록 해야겠다.

참고

profile
이게 되네?

0개의 댓글

관련 채용 정보