10일차 - 깃 & 깃헙 (branch, merge, Conflict, diff, stash)

Yohan·2024년 3월 4일
0

코딩기록

목록 보기
11/156
post-custom-banner

(3-1) Branch Basic

브랜치(Branch)란?

Git에서 브랜치(branch)는 코드의 특정 버전을 가리키는 포인터

  • 가장 일반적으로 사용되는 브랜치는 mainmaster

브랜치가 필요한 이유?

  1. 병렬 개발
    각 브랜치는 독립적인 작업 공간이므로, 여러 사람이 동시에 다른 작업을 진행할 수 있는 장점이 있다.
  2. 버전 관리
    각 브랜치는 특정 버전의 코드를 가리킨다. 이를 통해 과거의 어떤 시점으로도 쉽게 돌아갈 수 있다.
  3. 안정성
    'main' 브랜치는 항상 안정적인 버전의 코드를 유지하면서, 다른 브랜치에서는 새로운 기능이나 실험적인 변경을 시도할 수 있다.
  4. 병합(merge)과 충돌(conflict) 관리
    브랜치 간의 변경 사항을 병합하는 과정에서 발생할 수 있는 충돌을 더 쉽게 관리할 수 있다.

git branch

  • 나의 모든 브랜치 목록 보기
    • git branch
  • 브랜치 생성하기
    • git branch <branch-name>
    • ex : git branch apple
  • 브랜치 이동하기
    • git switch <branch-name>
  • 새로운 브랜치를 생성하면서 즉시 이동하기
    • git branch <branch-name>git switch <branch-name> 을 한 번에 처리
    • git switch -c <branch-name>
    • git switch -c emptylist master 라는 코드의 해석
      -> master 브랜치에서 뻗어나와서 emptylist branch 생성하면서 이동
  • 브랜치 삭제
    • git branch -d branch_name
  • 브랜치 강제 삭제
    • git branch -D branch_name
  • 브랜치 이름변경
    • git branch -m new_branch_name
  • 다른 브랜치에 있을 때 특정 브랜치의 이름변경
    • git branch -m old_branch_name new_branch_name
      -> 다른 브랜치의 현재 이름 : old_branch_name
      다른 브랜치의 바꿀 이름 : new_branch_name
      -> 예를 들어, 현재 나는 master 브랜치에 있고 내가 bye 브랜치를 byebye 브랜치로 바꾸고 싶다면 git branch -m bye byebye !
  • add와 commit을 한꺼번에 가능
    • git commit -am "내용"
      -> 단, 신규파일은 X 기존파일만 O
  • 삭제된 브랜치를 복구
    • git switch -c branch_name 02c5bab(해시)
      -> branch가 삭제된 02c5bab번에 다시 branch_name라는 branch를 달아줄 수 있다.

Git에서 브랜치를 다룰 때 조심해야할 사항 !!!

  1. 브랜치 전환 시 변경 사항 커밋 또는 스태시 꼭 하기 !
  • 작업 중인 브랜치에서 변경 사항을 커밋하거나 stash하지 않고 다른 브랜치로 전환하는 것은 흔한 실수다.
    이 경우, 작업 중인 브랜치의 변경 사항이 다른 브랜치로 가져와지게 되어 예기치 않은 문제를 일으킬 수 있으니 꼭 커밋이나 스태시를 하자!
  1. 긴 생명주기의 브랜치를 사용하지않기
  • 작업이 완료된 브랜치는 적절히 병합하고 삭제하자!
  1. master 또는 main 브랜치에서 직접 작업하지 않기
  • 최종만 master 또는 main 브랜치에 올리자!
  1. 너무 많은 변경을 하나의 커밋에 포함하지않기
  • 나중에 문제가 발생했을 때 원인을 찾기 어렵다. 또한, 다른 사람들이 변경 사항을 이해하거나 리뷰하는데 어려움을 겪을 수 있다.
    따라서, 가능한 작은 단위로 커밋을 나누는 것이 좋음!

(3-2) Branch Merge

Git Merge ?

여러 브랜치에 분산된 코드 변경 사항을 한 브랜치로 합치는 과정

Fast-Forward Merge

  • 복잡한 병합 작업 없이 브랜치를 간결하게 병합할 수 있음
  • 하나의 브랜치에 새로운 커밋이 생기지 않은 상태일 때 가능
  • Git은 단순히 브랜치 포인터를 앞으로 이동
    -> main은 새로운 커밋이 생기지 않았고 oldsong은 새로운 커밋이 생긴 상태이다. 여기서 mainoldsong을 합치고싶으면 main으로 위치한 상태에서 oldsong을 merge - main과 oldsong이 병합되어 같은 위치에 있게됨

3-Way Merge

두 브랜치를 병합하는 방법 중 하나로, 이 브랜치들이 공통 조상을 기반으로 작업한 경우 사용

  1. new-song 브랜치에 new/pop과 new/hiphop 브랜치를 생성

  2. new-song 브랜치에 new/pop을 Fast-Forward Merge
    (new-song 브랜치에는 새로운 커밋이 없었고 new/pop은 내용을 입력하여 새로운 커밋이 있었기 때문에 Fast-Forward Merge)

  3. new-song 브랜치에 new/hiphop 브랜치를 병합하기 위해 3-Way Merge를 통해 병합
    (new/pop과 병합되는 과정으로 변경이 있었고 new/hiphop도 내용변경이 있었기 때문에 3-Way Merge로 병합)
    -> 과정 속에서 new-song 브랜치와 new/hiphop 브랜치가 만나게되는 부분이 있기 때문에 새로운 커밋이 생김 (새로운 커밋에 설명을 달아주면 좋다!!)

Git Conflict란?

Git 충돌(conflict)은 두 개 이상의 변경 사항이 Git의 병합 과정에서 서로 충돌할 때 발생하는 문제를 의미

  • 주로 여러 사람이 동시에 같은 파일의 같은 부분을 변경했을 때 (같은 라인 코드) 이 문제가 발생

Git Conflict 해결법

  • 사용자가 직접 해결

(4-1) Git diff

코드 변경사항을 비교하고 시각적으로 표시해주는 강력한 도구


(4-2) Git Stash로 변경사항 임시 보관하기

stash란?

  • Git에서 제공하는 일시적인 작업 저장소

Commit하지 않고 브랜치를 이동했을 때 발생하는 2가지 시나리오

  1. 특정 브랜치에서 변경사항이 생긴 후 커밋하지 않고 다른 브랜치로 이동시 발생하는 첫번째 시나리오는 변경사항이 이동한 브랜치에 따라옴

  2. 두번째 시나리오는 잠재적 Conflict를 예상하여 switching을 거부
    -> 변경사항을 커밋하거나 스태싱하여 해결 !

git stash 관련 명령어

  • git stash save
    • 변경사항을 새로운 stash로 저장하고, 워킹 디렉토리를 이전 커밋 상태로 되돌립니다. 이 명령어는 선택적으로 메시지를 포함할 수 있어, 나중에 stash를 확인할 때 도움이 됨
  • git stash pop
    • 가장 최근의 stash를 적용하고 해당 stash를 스택에서 제거합니다. 즉, 이 명령은 가장 최근에 저장한 변경사항을 다시 로드하고 그 stash를 삭제

회고

  • Fast-Forward Merge와 3-Way Merge의 차이점을 이해는 하였지만 이후 실습을 통해 더 확실히 접해볼 필요성이 있다.
  • Conflict에 대해 확실히 이해하였고 실습을 통해서 왜 발생하는지 알게되었다.
  • stash의 이론은 알겠지만 어떻게 쓰이는지에 대해 실습을 통해 더 알아봐야겠다.
profile
백엔드 개발자
post-custom-banner

0개의 댓글