Git - 브랜치에 대해서 (2편)

Lina Hongbi Ko·2022년 12월 25일
0

Git

목록 보기
2/4
post-thumbnail

Git의 브랜치란?

브랜치(Branch)는 현재 프로젝트의 복사본.
예를 들어, 지금 작업하고 있는 소스코드들에서 어떤 기능을 추가한다고 했을때, 원래 있던 소스코드들을 master/main에서 수정하는 것이 아니라 프로젝트 사본을 만들어서 개발하고 싶을때 branch를 만든다.
그렇다면 위험부담이 적겠지?!

master(main)브랜치가 주 브랜치고 나머지들은 복사본.
뻗어 나오는 가지처럼 보여서 branch라고 한다.

브랜치 관련 명령어

  • 브랜치 보기

    git branch (로컬에서의 브랜치들 보기)
    git branch -all (서버에 있는 브랜치들까지 다 보기)
    git branch -v (브랜치랑 최신 커밋 같이 볼 수 있음)
    git branch --merged
    (현재 merge된 브랜치를 보거나 master에서 branch를 생성만 하고 더이상의 파생된 다른 커밋이 없는 브랜치들 보기)
    git branch --no-merged
    (master 브랜치에 merge되지 않거나 master branch에서 파생된 커밋이 있는 경우를 보여줌)
    git log 브랜치1 ... 브랜치2 (브랜치1과 브랜치2 사이의 커밋들 확인)
    git diff 브랜치1 ... 브랜치2 (브랜치1과 브랜치2 사이의 코드 비교)

브랜치는 기본적으로 브랜치에 담긴 커밋 중에서 가장 최근의 커밋을 가리킨다.

  • 브랜치 생성, 삭제, 수정

    git branch 브랜치명 (브랜치 만들기)
    git branch -d 브랜치명 (브랜치 삭제)
    git push origin --delete 브랜치명 (서버에 있는 브랜치 삭제)
    git branch --move 브랜치명 바꿀 브랜치명 (브랜치 이름 바꾸기)
    git push --set-upstream origin 바꿀 브랜치명 (서버에 있는 브랜치 이름 바꾸기)

✏️ 브랜치를 merge해도 브랜치가 자동으로 삭제 되진 않는다. 둘 중 하나 사용하면 이제 필요없는 브랜치를 삭제할 수 있다.

  • git branch -d 브랜치명 : 병합완료된 브랜치 삭제
  • git branch -D 브랜치명 : 병합하지 않은 브랜치 삭제
    (삭제한 브랜치는 같은 이름으로 다시 브랜치를 만들면 이전에 작업했던 내용이 그대로 나타난다. 깃의 흐름속에 감추는 것.)
  • 브랜치 이동

    git switch 브랜치명 (브랜치 이동)
    git switch -C 브랜치명 (브랜치를 만들고 동시에 이동)
    git checkout 브랜치명 (브랜치 이동)
    git checkout -b 브랜치명 (브랜치를 만들고 동시에 이동)

git switch나 checkout 편한걸로 골라 쓰면 됨! checkout은 원하는 커밋(버전)과 브랜치로 이동가능(switch는 해시코드를 이용해서 버전으로 돌아가지 않음)

  • 브랜치 합치기
    주로 master(main)브랜치에서 주요 기능들을 개발하고, 다른 여러가지 브랜치를 만들어서 필요한 서브기능을 추가하거나 주요 기능으로 완전히 받아들여지기 전 단계들을 위해 브랜치를 만든다. 이렇게 브랜치, 즉 복사본을 만들어서 개발하다가 master(main)과 합쳐야 하는데 이것을 merge라고 한다.

    git merge 브랜치명
    (master(main)브랜치에서 merge할 브랜치명 적기)

✏️ 합칠때 주의사항: master(main)브랜치와 내가 만든 브랜치에서 같은 파일, 같은 줄을 수정했을 경우 merge conflict가 발생!
(깃에서는 줄단위로 변경여부를 확인하므로, 같은 줄을 수정했을시 브랜치가 충돌한다.)
그럼 이럴때는 어떻게 하나요????

  • 수동으로 해결 : conflict난 파일로 돌아가서 코드 수정 후 git add . -> git merge --continue 처리
  • tool 이용 (vscode): vscode를 쓰기 위해서는 설정이 필요.
    git diff tool을 쓴 것 처럼,
    git config --global -e에 들어가서 [merge] tool = vscode, [mergetool "vscode"] cmd = code --wait $MERGED 지정 -> 터미널에서 git mergetool 입력 -> vscode가 실행되면 현재브랜치와 merge하고싶은 브랜치의 내용이 비교되어있다. 옵션을 선택해서 넣고 싶은 코드 선택도 가능! -> 코드 수정 후 -> git merge --continue
🔅 옵션 선택 tip
- Accept Current Change : 현재의 브랜치 내용을 받아들임
- Accept Incoming Change: merge하고자 하는 브랜치의 변경사항 받아들임
- Accept Both Change: 둘 다 씀
- Compare Changes: 두개의 창에서 비교

merge할 코드 선택을 완료 했다면 저장하고 닫으면 OK.
❗️**BUT**
git status를 확인했을때 수정한 파일이 수정완료 되었다고 나오지만
수정파일.orig파일이 생성된다. 이 파일은 conflict가 발생했을 때 생성되는 파일이므로
이게 생기는게 번거롭다면 옵션을 끌 수 있다. 
git config --global mergetool.keepBackup false 입력

합치기 취소

git merge --abort

브랜치를 합치는 다양한 방법

  • fast-forword merges

    예를 들어, master(main)브랜치에서 practice라는 브랜치를 만들어서 commit을 여러번 하고, master(main)브랜치에서는 commit이 한번도 없을때, practice브랜치를 master(main)브랜치의 포인터가 가르키게 된다. 즉, 새로운 브랜치에만 commit이 있고 기존 기준 브랜치에는 신규 commit이 없을때, 신규 브랜치 보고 main브랜치라고 하는 것.

fast-forword merge를 하게 되면 merge commit 기록은 남지 않는다. 이게 싫으면 아래의 명령어를 사용해 merge commit을 남길 수 있다.

git merge --no-ff 브랜치명

❗️ git merge(옵션x) 만 했을 경우, fast-forward가 가능한 경우라면 merge commit을 만들지 않고 fast-forward가 자동으로 진행 된다.

  • three-way merge

    master(main)브랜치에 신규 커밋이 있고, 다른 브랜치와 합칠때.(merge의 기본 동작방식) / merge commit 기록이 남는다.

  • rebase and merge

    브랜치의 시작점을 다른 commit으로 옮겨주는 행위.
    rebase를 이용해서 신규 브랜치의 시작점을 master(main)브랜치의 최근 commit으로 옮긴 다음 fast-forward 하는 것.
    merge commit 기록 남지 않는다.(fast-forward하잖아유)

git switch 새로운 브랜치 // rebase할 브랜치로 먼저 이동해야함
git rebase master(main)
git switch master(main)
git merge 새로운 브랜치

✏️ rebase 할 때 주의할 점 : 신규 브랜치를 나 말고 다른 개발자와 함께 작업하거나 이미 history가 서버에 업로드 되어 있는 경우라면 rebase 하지 말 것!! >> 원래 생성된 신규브랜치의 커밋들과 rebase된 신규 브랜치의 커밋들은 전혀 다르기 때문!!!
그러므로, 서버에 업로드 되지 않고 로컬에서 나 혼자 작업할 때는 자유롭게 써도 상관없다.

  • rebase-onto

    branch chaining 할때 주로 씀.
    master브랜치에서 a 브랜치를 생성해서 개발하다가 a브랜치에서 b브랜치를 생성 했는데 b브랜치와 master브랜치를 merge해야 할 때 주로 쓴다.
    이것도 마찬가지로 rebase이므로 rebase한 브랜치들은 기존의 브랜치들과 완전히 다른 브랜치이므로 다른 개발자와 일하거나 이미 history에 올려져 있는 브랜치라면 rebase를 쓸 때 조심해야 한다.

// 위의 예를 이용해서 코드를 작성한다면,
git switch b
git rebase --onto master a b // master브랜치의 a브랜치의 b브랜치를 rebase한다.
git switch master
git merge b
  • cherry pick

    내가 원하는 커밋만 가져오기
    예를 들어, master브랜치에서 a브랜치를 만들어 신규 커밋을 1, 2, 3번 만들었는데 2번만 master브랜치에 merge하고 싶을때 쓴다.

위의 예를 이용해서 코드를 작성한다면,
git cherry-pick 2번커밋의 해시코드
  • squash and merge

    새 브랜치에 있던 커밋들을 합쳐서 master(main) 브랜치로 한번에 묶어서 merge시킴.
    merge commit 기록 보이지 않음.

git switch master(main)
git merge --squash 브랜치명
git commit -m "메시지"

✏️ 예를 들어, 브랜치 100개를 만들 었을때 일반 merge를 사용한다면 git log는 매우 복잡하겠지만 rebase나 squash를 쓴다면 덜 복잡하겠지?!

브랜치 병합시 편집기창

git merge 브랜치명 --no-edit (편집기창 안열리게 하기)
git merge 브랜치명 --eidt (편집기창 열리게 하기)


from. 드림코딩아카데미 git마스터과정,
from. Doit! 지옥에서 온 문서 관리자 깃&깃허브 입문
from. 애플코딩 매우쉽게 알려주는 git & github

profile
프론트엔드개발자가 되고 싶어서 열심히 땅굴 파는 자

0개의 댓글