□ 브랜치 이해하고 활용하기

 

기본적으로는 하나의 브랜치 즉 마스터 브랜치만 사용해도 버전관리 시스템이 제공하는 모든 이점을 얻을 수 있다.

Git을 사용하면 이력을 추적하고 다른 개발자와 협업할 수 있다. 또한, 갑자기 중요한 파일이 지워지는 상황도 대처 할 수 있다.

 

하지만 이정도로 Git을 사용한다면 마치 경주용 자동차를 타고 출퇴근을 하는것과 같다.

 

이 번에 다룰 내용은 아래와

  • 새로운 브랜치 생성하기
  • 브랜치 간의 변경 사항 합치기
  • 충돌 다루기
  • 브랜치 삭제하기
  • 브랜치명 변경하기
  • 릴리스 브랜치 다루기

 

>git branch -m master mymaster

 

-m의 매개변수는 이동을 의미한다. 결국 master라는 메인 브랜치를 mymaster로 변경 하겠다는 의미를 가진다.

 

Git에서의 브랜치는 큰 비용을 지불하지 않아도 되는 가벼운 구조를 가진다.

즉, 다른 버전 관리에서는 모든 파일을 새로운 디렉터리로 복사하지만, GIt에서는 해당 브랜치가 만들어진 시점부터 적용된 Commit만을 추적하기위해 파일을 생성 한다.

 

 

브랜치를 생성 하는 시점

  • 실험적인 변경 사항 추가시
  • 새로운 기능을 추가하고 싶을때
  • 버그를 수정하고 싶을때

이렇게 브랜치를 생성하고 언제든지 Merge할 수 있기 때문에 추후에 복잡해질 여지는 없다. 또한 변경이력 또한 쉽게 통합 되어진다. 따라서 주저하지말고 필요하다고 생각되면 브랜치를 생성해야 한다.

 

 

□ 브랜치 생성

 

> git branch new

> git branch

* master

  new

 

*는 현재 작업 트리 디렉터리를 나타내는 것이다.

즉 checkout을 하게 되면 현재 작업 트리로 설정 하는 것이 된다.

 

 

브랜치 생성과 동시에 Checkout 하는 방법

> git checkout -b alternate master // 3번째 파라매터인 master는 복사해야할 브랜치 명이다. 즉 이렇게 직접적으로 설정할 경우, 지정한 브랜치로부터 새로운 브랜치를 생성하게 된다.

 

 

□ 브랜치 간의 변경 사항 합치기

 

합치기는 다음 3가지로 구분된다.

  • Straight Merge: 하나의 브랜치와 다른 브랜치의 변경 이력 전체를 합치는 방법이다.
  • Squashed Commit: 한 브랜치의 이력을 압축하여 다른 브랜치의 최신 커밋 하나로 만드는 방법이다.
  • Cherry-picking: 다른 브랜치에서 하나의 커밋을 가져와서 현재 브랜치에 적용하는 방법이다.

Straight Merge : 바로 합치기

git add about.html // 새로운 파일 생성

about.html에 내용 입력 // 새로운 파일에 내용 입력

git commit -m "add the skeleton of an about page"  // commit하기 log를 입력해서

git checkout master // merge하기전에 합병이 되어질 브랜치로 이동

git merge alternate // master와 alternate를 merge한다.

 

 

Squashed Commit : 커밋합치기

Git이 브랜치 하나의 모든 이력을 압축하여 다른 브랜치에 하나의 커밋으로 만들기에 커밋 합치기라고 한다. 커밋 합치기를 할 때는 유의해야 한다.

 

커밋 합치기는 이것저것 실험해 봐야 하는 새로운 기능을 만들거나 버그를 수정할 때 유용하다. 실험한 내용은 추적하지 않아도 되므로 커밋할 필요가 없다. 즉 마지막 결과만 필요할 뿐이다.

 

git checkout -b contact master // master 브랜치에서 contact 브랜치를 생성하고 체크아웃 한다.

contract.html 생성

git add contract.html // 파일 추가 (스테이징)

git commit -m "add contract file with email" // commit한다.

contract.html에 새로운 내용 추가

git commit -m "add secondary email" -a // 모든 변경사항을 commit한다. (-a 매개변수의 의미)

 

//이제 Squashed Commit을 해서 2개의 변경이력을 하나의 이력으로 통합해서 master 브랜치에 merge를 해보자.

git checkout master

git merge --squash contact // --squash 매개변수를 지정한다. 지정한 브랜치의 모든 커밋을 하나의 커밋으로 밀어 넣는다.

 

여기서 중요한점은 그냥 merge는 스테이징 되지않고 바로 적용되었지만 --squash 매개변수를 사용해서 커밋 합치기를 할경우 스테이징 단계를 거친다. 따라서 그것을 확인해보면

 

git status // Chages to be committed 라는 메시지를 볼 수 있다.

 

git commit -m "add contract page" -m "has primary and secondary email" // 이렇게하면 하나의 변경이력으로 통합되는것을 알 수 있다.

git log -2 // 변경 이력이 통합 되었음을 알 수 있다.

 

Cherry-picking: 선택하여 합치기

 

전체를 합치는게 아니라, 부분적으로 합칠 필요성이 있을 수 있다. 아직은 해당 브랜치가 완성이 안되었기 때문에 부분적으로 합치고 싶은 경우이다. 이때 사용하는 기능이다.

 

git checkout contact // 브랜치 변경

git commit -m "add link to twitter" -a // 모든 변경 사항을 commit 한다.

 

git checkout master // master로 이동

git cherry-pick 321d76f // 321d76f가 commit하려는 선택적인 이력인 것이다.

 

 

□ 충돌 다루기

충돌이란 서로 다른 2개의 branch를 통합하려고 할 때 같은 파일에 동일한 위치에대해서 다른

변경이 있을 경우이다.

 

□ 충돌을 실습하기 위해서는 예제 만들기

충돌을 어떻게 다루는지 확인해보자. 먼저 예제를 위해 about이라는 새로운 브랜치를 생성한다.

> git checkout -b about master

자신이 좋아하는 프로그래밍 언어 리스트를 기입한 about.hml을 생성한다.

> git add about.html

> git commit -m "a list of my favorite programming languages"

git branch about2 about // about을 가지고 about2를 생성한다.

브랜치 전환하기 전에 about.html 파일에 다른 언어를 추가하고 변경 사항을 커밋한다.

> git commit -a // 새로운 언어 리스트를 추가하고 commit한다.

> git checkout about2 // about2 brach로 이동을 한다.

이제 about2에서는 about.html의 마지막 리스트에 아까 입력했던 값이 없다.

여기에 새로운 값을 입력하자.

>git commit -a // commit 한다.

>git checkout about // about branch로 이동 한다.

>git merge about2 // about2와 합병 한다.

이제 당연히 충돌이 발생하게 된다. 충돌이 발생 했을 경우 소스코드를 보면

========= // 다른 브랜치와 충돌이 발생하는 코드

<<<<<< // 이러한 기호 뒤에 나오는 코드는 현재 브랜치의 코드이고,

>>>>>> // 이러한 기호 앞에 나오는 코드는 다른 브랜치의 코드라는 점이다.

그다음에 나오는 기호는

파일 명 앞에 합치려고 하는 브랜치명이 표시된다는 것이다.

<<<<<< HEAD:about.html

>>>>> about2:about.html

□ 브랜치 삭제하기

>>git branch -d about2로 삭제 한다.

제한사항: 브랜치 삭제 명령은 삭제하려는 브랜치가 성공적으로 현재 브랜치에 합쳐졌을 때만 동작한다.

합쳐지지 않았을때는 아래와 같은 에러가 생긴다.

error: The branch 'about' is not fully merged.
If you are sure you want to delete it, run 'git branch -D about'.

이를 해결하기 위해서는 -D (대문자를 사용 한다.)

□ 브랜치명 변경하기

git branch -m contact contacts

m명령어를 사용해서 변경을 한다.

제한사항: 하지만 이 명령어는 존재하는 브랜치를 덮어쓰지 못하므로 새로운 브랜치명은 반드시 고유해야 한다.

-M을 쓰면 덮어씌워 진다.

 

 

 

 

 

 

 

+ Recent posts