Git 기능 정리 branch 활용


Git CLI 환경에서 사용되는 branch 관련 명령어들을 정리하려고 합니다.

1.브랜치를 사용하는 이유

● branch : 특정 기준에서 줄기를 나누어 작업할 수 있는 기능

a. 새로운 기능 추가 : 최신 커밋으로부터 생성해서 개발 -> 코드리뷰 -> 테스트 완료 후 이상 없을시 master 브랜치로 병합

b. 버그 수정 : 새로운 브랜치 생성(hotFix, bugFix 등 네이밍) -> 버그 수정 후 master 브랜치로 병합(병합 시, 버그 수정으로 인한 충돌 주의)

c. 병합과 리베이스 테스트 : 임시 브랜치 생성 후 해당 과정 테스트(잘못되더라도 해당 브랜치 삭제로 해결)

d. 이전 코드 개선 : 이전 코드 삭제 후, 신규 코드 작성. (이전 커밋에는 이전 코드가 작성되어있기 때문에 가능)

e. 특정 커밋으로 돌아가고 싶은 경우 : 보통 hard reset이나 revert를 사용(대신, 커밋이 없어지거나 사용이 까다로움)

브랜치를 새로 만들어서 작업하고, 리베이스나 병합으로 해결 가능


2.브랜치 생성 명령어

● git branch [-v] : 로컬 저장소의 브랜치 목록 보기 (-v 옵션 사용시, 마지막 커밋도 함께 표시)

(이름 왼쪽에 * 표시 있으면 HEAD 브랜치)

● git branch [-f] <브랜치이름> [커밋체크섬] : 새로운 브랜치 생성, 커밋체크섬 값 없으면 HEAD로부터 생성.

이미 있는 브랜치를 다른 커밋으로 옮기고 싶을때는 -f 옵션 줘야함.

ex1) git branch test feature1 : feature1 브랜치에서 test 브랜치 생성.

ex2) git branch test3 HEAD^ : 현재 head의 부모 커밋으로부터 test3 브랜치 생성

● git branch -r[v] : 원격 저장소에 있는 브랜치를 보고 싶을때 사용

(+ v옵션 : 최신 커밋 정보 및 커밋 요약)


● git checkout <브랜치이름> : 특정 브랜치로 체크아웃 때 사용. 이름 대신 커밋체크섬을 써도 되지만 브랜치 이름 강력 권장.

● git checkout -b <브랜치이름> <커밋체크섬> : 특정 커밋에서 브랜치 새로 생성 & 체크아웃 동시 수행

git checkout -b new-branch abcdef1 (새로운 브랜치 이름, 새 브랜치를 시작할 특정 커밋의 체크섬)


● git branch -d <브랜치이름> : 특정 브랜치 삭제 시 사용. HEAD 브랜치나 병합되지 않은 브랜치는 삭제 x

● git branch -D <브랜치이름> : 브랜치 강제 삭제.(위 명령어로 삭제 안되는 것도 가능. 주의 필요)

git branch -d feature-branch (feature-branch라는 이름의 브랜치 삭제)


● fetch : 원본 저장소에 있는 commit history 가져오기

git fetch [원격저장소별명] [브랜치이름] : 원격저장소의 브랜치와 commit들을 로컬 저장소와 동기화.

(옵션 생략시, 모든 원격 저장소에서 모든 브랜치 가져옴)

git fetch origin main : 특정 원격저장소의 특정 브랜치 가져오기

git fetch origin : 특정 원격 저장소의 모든 브랜치 가져오기

git fetch : 모든 remote tracking branch 업데이트

git fetch --all : 모든 원격 저장소의 모든 remote tracking branch 업데이트


● git merge <대상브랜치> : 현재 브런치와 대상 브런치 병합할 때 사용. (병합 전에 워킹 디렉토리를 stash로 정리하는 것 추천)

● tag : 특정 commit에 포스트잇 기능

git tag -a -m <간단한메시지> <태그이름> [브랜치 또는 체크섬] : -a로 주석 있는 태그 생성 (브랜치 이름 생략시 HEAD에 태그 생성)

--> git tag -a -m "Version 1.0" v1.0 : "Version 1.0"이라는 주석을 달아 v1.0이라는 이름의 태그를 생성

--> git tag -a -m "Release candidate" rc-v1.1 2f8ab7c : "Release candidate"라는 주석을 달아 rc-v1.1이라는 이름의 태그를 생성

git push <원격저장소 별명> <태그이름> : 원격 저장소에 태그를 업로드 함.

--> git push origin v1.0 :  v1.0 태그를 origin 원격 저장소에 업로드


3.git에서 자주 사용되는 명령어

● A. git rebase <대상브랜치> : 내 브랜치 커밋들을 대상 브랜치로 재배치.

병합간 충돌시 사용, 서로 다른 브랜치간 병합시, 같은 파일 수정 혹은 공통된 사항 수정이 있을 경우 사용.

(절대로 원격 저장소에 푸시한 브랜치는 rebase 하지 않아야 함, 로컬에서만 적용!)

장점 : 깔끔한 히스토리 정리로, 협업시 코드리뷰를 하기 더 편리함.

단점 : 이력을 조작하면서 히스토리를 바꾸는 것이기 때문에, rebase 이후 강제 push(혼자 쓰는 브랜치에서만 사용) 필요.


● + 충돌 해결하기 (merge conflict) :

<< HEAD 현재 바라보는 Branch, 

====기준으로  

>> 커밋 메세지를 가진 브랜치로 

병합됨을 의미함.

충돌 해결 관련 참고하기

pull request를 거치고 checkout까지 해서 최종적으로 master에까지 반영.


● B. reset : 옛날 commit으로 브랜치를 되돌리기

--mixed : (default) 변경은 하지만 기존 push는 stage에 남겨놓음.
--hard <이동할 커밋 체크섬> : 깔끔하게 전부 되돌린다.
--soft : 모든 local 변경 사항 유지

cf) HEAD~<숫자> : n번째 위쪽 조상 / HEAD^<숫자> : n번째 부모를 가리킴.

ex) git reset --hard HEAD~2 : HEAD를 2단계 이전으로 되돌리기.   

cf2) git reset [파일명] : 스테이지 영역에 있는 파일들 스테이지에서 내리기(언스테이징).

워킹트리의 내용 변경x. (옵션 생략 시, 스테이지 모든 변경사항 초기화)


● C. revert : 해당 커밋의 변경사항을 취소하는 commit을 만드는 기능

(이력 관리를 위해서, 변경 사항을 되돌리는 커밋 만들기)

ex) A---B---C---D   (현재 브랜치의 히스토리)

예시1 git revert C

A---B---C---D---E   (E는 revert된 커밋, C의 변경사항을 취소한 내용이 반영됨)

예시2 git revert B C

A---B---C---D---E---F   (E는 B를 revert한 커밋, F는 C를 revert한 커밋)


● D. AMEND : commit 했는데 추가로 commit 하고 싶은 경우 사용. (마지막 commit 수정)

(원격저장소까지 푸시 했더라도 가능)

ex) git add hello.py 

-> git commit

git add main.py 

-> git commit --amend --no-edit 

or git commit --amend -m '새로운 커밋 메시지'

(–no-edit : 커밋 메시지를 변경하지 않고 커밋 개정,

안 쓰면 커밋 메시지 수정 창 나옴, -m ‘수정할 커밋 메세지’ 도 가능)


● E. CHERRY PICK : 다른 브랜치의 커밋 하나만 선택해서 지금 브랜치에 적용하기

원하는 commit만 가지고 오고 싶을때 사용.

git cherry-pick <commit_hash_1> <commit_hash_2> ...

IF1) cherry-pick 하다가 conflict 발생 시,

방법1. 코드 수정 

-> git add <path> 명령어로 수정된 코드 올리기(commit 다시 할 필요는 x)

-> git cherry-pick --continue (다시 진행)

방법2. 중단 

git cherry-pick --abort (체리픽을 중단하고 이전 상태로 돌아감)

IF2) merge commit을 cherry-pick하고 싶은 경우 :

git cherry-pick -m 1 <merge_commit_hash>


● F. STASH : 임시 저장 기능. (한 번이라도 git에 올린 것만 가능, commit은 x)

git status를 통해 확인 되는 변경 사항들을 저장

ex) git status > git stash [save]

git stash list : 목록 확인 하기

git stash apply [--index]: 했던 작업 다시 가져오기 (index 옵션까지 넣어야지 복원이 가능)

git stash drop : stash 제거하기

git stash clear : 목록 전부 삭제

git stash pop : apply + drop 기능

git stash show -p : 저장된 변경사항 확인하기, -p 옵션은 변경 사항을 파일 단위로 보여주는 것.

ex2) git stash show stash@{2} : 스태시 스택에서 두번째로 최근에 만들어진 것 의미. {0}은 가장 최근.