2 분 소요

Git

브랜치

독립적으로 어떤 작업을 진행하기 위한 개념. 브랜치를 통해 코드를 통째로 복사한 후 원래 코드가 변형될 우려 없이 독립적으로 개발할 수 있다. 따라서 여러 작업을 동시에 진행할 수 있다.

장점
  • 한 소스코드에서 동시에 다양한 작업을 할 수 있게 해준다.
  • 소스코드의 한 시점과 동일한 상태를 만들고, 브랜치를 넘나들며 작업을 수행할 수 있다.
  • 각각의 브랜치에서 생긴 변화가 다른 브랜치에 영향을 주지 않고 독립적으로 코딩을 진행할 수 있다.
종류
  • 통합 브랜치: 배포될 소스가 기록되는 브랜치
  • 피처 브랜치: 기능 추가, 버그 수정과 같이 단위 작업을 위한 브랜치
깃 명령어
  • 새로운 브랜치 생성: git branch 새로운 브랜치 이름
  • 새로운 브랜치 생성 후 해당 브랜치로 전환: git switch -c 브랜치 이름 or git checkout -b 브랜치 이름
  • 브랜치 목록 확인: git branch
  • 브랜치 목록과 각 브랜치의 최근 커밋 확인: git branch -v
  • 브랜치 삭제: git brahcn -d 브랜치 이름
  • 병합하지 않은 브랜치 강제 삭제: gir branch -D
  • 브랜치 전환: git switch 브랜치 이름 or git checkout 브랜치 이름
  • 브랜치 병합(main 브랜치로 dev 브랜치 병합): git checkout master -> git merge dev
  • 로그에 보든 브랜치를 그래프로 표현: git log --branches --graph --decorate
  • 아직 커밋하지 않은 작업 스택에 임시 저장: git stash
  • 병합을 취소하고 이전 커밋으로 되돌리기: git reset --hard 커밋 넘버
  • 특정 시점으로 돌아가기:
    git reflog
    # git의 기록을 확인 > 각각 HEAD@{index} 형태로 index 갖고 있다.
    git reset HEAD@{index}
    # 해당 index로 돌아간다
    
  • 커밋에 파일 추가(push 하기 전에만 하기)
    # 바뀐 파일 추가
    git add . 
    # 마지막 커밋에 바뀐 파일 추가됨
    git commit --amend --no-edit
    

    공개 브랜치에 push된 커밋은 절대 수정하면 안됨!!

  • 커밋 메세지 수정: git commit --amend
  • 다른 브랜치에 커밋해야 하는데 실수로 main에 커밋한 경우(push 하기 전에만 하기)
    # 현재 main의 상태로 새로운 브랜치 생성
    git branch 브랜치 이름
    # main 브랜치의 마지막 커밋 제거
    git reset HEAD~ --hard
    git checkout 브랜치 이름
    # 새로운 브랜치에는 커밋이 남아있다.
    
  • 실수로 다른 브랜치에 커밋한 경우
    # 마지막 커밋 취소하고 변경사항 남기기
    git reset HEAD~ --soft
    git stash
    # 올바른 브랜치로 이동
    git checkout 브랜치 이름
    git stash pop
    git add .
    git commit -m "커밋 메세지"
    

    또는

    git checouht 브랜치 이름
    # main의 마지막 커밋 선택
    git cherry-pick main
    # main에서 해당 커밋 제거
    git checkout main
    git reset HEAD~ --hard
    
  • diff 실행시 아무것도 안보이는 경우: git diff --staged
  • 커밋 되돌리기
    # 되돌려야할 커밋의 hash 찾기
    git log
    # 에디터 창에서 새로 커밋 메세지 입력하거나 그냥 저장하고 종료해도 됨
    git revert [hash]
    
  • 수정한 파일 되돌리기
    # 수정되기 전 커밋 hash 찾기
    git log
    git checkout [hash] -- 파일 경로
    
  • 원격 레포지토리 버전으로 초기화
    # origin에서 최신 상태 받아오기
    git fetch origin
    git checkout main
    git reset --hadr origin/main
    # 추적되고 있지 않은 파일/폴더 모두 삭제
    git clean -d --force
    # 초기화하고 싶은 각 branch에 대해서 ckecout/reset/clean 반복
    

    되돌릴 수 없는 명령!!

  • 커밋 메세지를 합쳐서 머지하는 방법
    • 커밋 히스토리를 깔끔하게 정리하는데 사용
    • 여러 커밋 메세지를 하나로 합쳐서 머지
      git checkout main
      # merge 하는 동시에 squash 사용해서 커밋 합치기
      git merge --squash 브랜치 이름
      git commit -m "커밋 메세지"
      

참조 : Dangit, git

merge & rebase
  • merge: 변경 내용의 이력이 모두 남아 이력이 복잡해진다.
  • rebase: fast-forward 방식. branch base를 이동시킨다. merge처럼 브랜치 통합을 목적으로 하지만 특정 시점으로 브랜치가 가리키는 곳을 변경하는 기능
Git을 활용하는 프로젝트 전체 workflow
사진