브랜치, 스태시, 병합

Seung jun Cha·2023년 9월 27일
0
  • 로컬과 오리진 연결
git remote add origin url주소
  • 등록된 원격 저장소 보기
git remote show origin
  • 로컬 저장소의 브랜치를 원격저장소에 동기화
git push 원격저장소별칭 브랜치이름
git push -u origin master
  • 원격 저장소의 브랜치 목록 확인
git branch -r
git branch -a : 모든 브랜치 확인
  • 원격 저장소의 브랜치 정보 가져오기
git fetch
  • 원격 브랜치를 자신의 로컬로 복사, 브랜치 생성과 체크아웃
git check -b 새로운 브랜치이름 origin/브랜치이름
git checkout -b 브랜치이름 : 브랜치를 생성하면서 해당 브랜치로 체크아웃
  • 업스트림 설정 : 원격저장소의 어느 브랜치에 푸쉬해야할 지 모르기때문에 설정해야함
git push --set-upstream origin 브랜치
  • 브랜치 삭제 : 자신이 있는 브랜치는 삭제불가, 스테이지 상태가 깨끗할 때만 삭제가능 (-D는 커밋 등이 있어도 강제로 삭제)
git branch -d(-D) 브랜치이름
  • 스태시 : 코드 수정 중 깃 작업이 필요할 때 사용한다. 작업 브랜치를 변경하려면 워킹 디렉토리에 커밋되지 않은 내용이 있어서는 안된다. 다른 브랜치로 이동해야하는 경우 스태시 기능을 사용할 수 있다. 현재 작업 중인 내용은 임시 저장되고, 수정 전 마지막 커밋 상태로 돌아간다.
  1. 스태시 실행, 스태시 목록확인
  2. 작업할 브랜치 이동
  3. 작업 후 병합
  4. 스태시에 저장된 이전 작업들을 불러와서 작업한다.
git stash (save) "메시지";
  • 스태시 확인하기
git stash list
  • 저장한 스태시 불러오기 : 내용을 가져올 때 현재 브랜치의 워킹 디렉토리와 자동으로 병합한다. 따라서 적절한 브랜치에서 스태시를 불러와야한다.
git stash pop   - 꺼내온 후 스택에서 삭제
git stash apply stash@{}- 스택에서 삭제하지 않기 때문에 계속 사용할 수 있고 
중간 부분을 꺼내올 수 있다. 따로 스태시를 선택하지 않으면 최신 스태스를 복원한다.
  • 스태시 복원으로 충돌 : 스태시를 불러올 때, 워킹 디렉토리는 깨끗한 상태여야한다. 그렇지 않다면 충돌이 발생할 가능성이 크다. 스태시 충돌이 예상된다면 스태시용 브랜치를 하나 생성해서 작업하는 것을 추천한다.
    다음은 스태시에 저장된 내용으로 새로운 브랜치를 생성하는 명령어다.
git stash branch 브랜치이름  
  • 스태시 삭제
git stash drop
  • 워킹 디렉토리 청소
git clean
  • 병합
    • Fast-Forward
    • 3 way merge
git merge 브랜치이름
현재 체크아웃 된 브랜치에 다른 브랜치의 모든 커밋을 병합한다.
  • 3 way merge : 브랜치별로 각각 커밋한 상황

    공통 조상 커밋을 가진 브랜치와 새로운 두 브랜치 이렇게 3개 있어서 3way라고 한다.
    공통 조상 커밋을 기준으로 다른 브랜치들을 병합하고, 병합이 완료되면 새로운 커밋은 병합 커밋을 생성한다. 여기서는 브랜치가 2개이므로 병합커밋은 부모커밋을 2개 가지고 있다. 깃은 병합을 할 때 공통조상커밋을 자동으로 찾아준다.

  • 브랜치 삭제 : 일반적으로는 병합된 브랜치는 삭제한다.

git branch -d 브랜치이름
git branch -D 브랜치이름 : 병합되지 않은 브랜치를 삭제할 때
  • 충돌 : 같은 위치의 코드를 동시에 수정했을 때 발생한다. 충돌을 해결한 후에는 병합 커밋을 직접 만들어야한다. 충돌을 해결하는 파일은 modified 상태가 된다 이를 다시 스테이지 영역에 등록하고 커밋한다.
git status 명령어로 상태확인
git merge --abort : 방금 실행한 병합을 취소할 때 사용
충돌이 발생한 (master|MERGING) -> (master) 로 merge과정이 취소됨

<<<<<<<<<<< HEAD
merge의 기준이 되는 브랜치의 내용
============
기준 브랜치에 병합하고자 하는 브랜치의 내용
>>>>>>>>>>> 병합 브랜치 이름
  • 병합한 브랜치와 병합하지 않은 브랜치를 구분하는 옵션
git branch --merged
  • 리베이스 : 커밋의 트리구조를 재배열하는 병합방법이다. 공통조상커밋을 변경하는 것이다.
    브랜치가 많아지면 단계별로 커밋을 따라가며 코드를 확인해야하기 때문에 커밋을 관리하고 파악하기 어렵다. 리베이스는 베이스 분기점을 변경하여 하나의 기찻길을 반드는 방법이다

  • 리베이스 vs 병합

  • 병합 : 공통조상커밋에서 파생된 두 브랜치를 하나로 합치고 병합 커밋을 생성

  • 리베이스 : 두 브랜치를 비교하지 않고 순차적으로 병합하는 것



    베이스 커밋을 커밋6으로 변경하고 다른 브랜치의 커밋은 커밋3과 커밋4를 이어 붙인다. 리베이스를 하면 병합 커밋은 따로 발생하지 않는다.

    • 리베이스 명령어

      git rebase 커밋의 기준브랜치
      
      ex)
    1. git checkout description
    2. git rebase main
      **현재 브랜치의 커밋들을 지정한 브랜치 위로 옮기는 작업을 수행한다.**
      이 과정에서 커밋의 해시 값이 변경된다.
      리베이스는 커밋 위치를 재조정할 뿐 브랜치의 HEAD포인터까지 옮겨 주지는 않는다. 리베이스 한 후에는 병합 브랜치의 HEAD를 맞추어야 한다.
    3. git checkout main
    4. git merge description -- HEAD 포인터 조정(병합)하고 커밋 히스토리를 정리
    • 리베이스 충돌이 일어난 코드를 수정한 후 진행
      git rebase --continue
      git add 파일이름(그리고 수정한 파일을 스테이지 상태로 변경)
    • 리베이스 취소
      git rebase --abort

3. 코드 되돌리기

  • reset : 지정된 커밋 코드로 돌아간다. 해당 시점으로 모든 코드를 복구한다.
    • --soft : 스테이지 영역을 포함한 상태로 복원
    • --mixed : 기본값
    • --hard : 실제 파일이 삭제된 이전 상태로 복원

-출처
이호진 저 Git 교과서

0개의 댓글