Git 기능 정리 branch 활용
in Github Blog on Blog
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}은 가장 최근.