※ 우아한 테크코스 프리코스 1주차 공통 피드백에 있는 추가 학습 자료 중 Git에 관한 내용들을 학습하며 정리해보았습니다
[10분 테코톡] 오리&코린의 Merge, Rebase, Cherry pick
Merge
* fast-forward-merge
[ 상황: (main 브랜치에서 branch A 분기, branch A 커밋, main 브랜치에 checkout된 상태) git merge <branch A> ]
- main이 참조하는 commit이 base commit에서 branch A가 참조하는 commit으로 이동
* 3-way-merge
[ 상황: (main 브랜치에서 branch A 분기, branch A와 main 커밋, main 브랜치에 checkout된 상태) git merge <branch A> ]
- 3 way: base commit (main 브랜치) / main 브랜치의 최신 commit / A 브랜치의 최신 commit
- main 브랜치에서 commit한 최신 내용과 A 브랜치에서 commit한 최신 내용을 합쳐, 새로운 commit 생성
- main 브랜치 입장(HEAD)에서 A 브랜치와 충돌하는 부분은 수동으로 조정
* merge 방식
1. Create merge commit(default): (main) git merge --no-ff feature
- feature 브랜치의 모든 commit 내용이 main 브랜치 commit 기록에 살아있음
2. Squash and merge: (main) git merge --squash feature
- feature 브랜치의 모든 commit 내용이 main 브랜치 commit 기록에 하나의 commit으로 합쳐져 있음
3. Rebase and merge: (feature) git reabse main, (main) git merge feature
- feature 브랜치의 base commit을 최신 main 브랜치 commit으로 재설정 후 fast-forward merge
Rebase
* Merge와의 공통점/차이점
- 공통점: 브랜치를 합친다
- 차이점: Merge보다 깨끗한 commit history를 만든다 (commit history가 선형적으로 그려짐)
* Rebase 진행방식
- (현재 브랜치) git branch <대상브랜치>: 대상브랜치로 현재 브랜치의 base를 변경
- 기존에 생성된 commit들은 새롭게 복사되어 base가 변경됨
- git rebase --continue: (add 후) 충돌 해결
Cherry-pick
* Cherry-pick 진행방식
- 다른 브랜치에 있는 commit을 선택적으로 내 브랜치에 적용시키는 것 (commit 복사)
- cherry 브랜치에 commit 내역을 가져온 후 origin/cherry로 push한 뒤, origin/main 브랜치에 PR을 보냄
- Cherry-pick 진행 시 충돌이 발생할 수 있으며, git add/continue 명령어로 해결한다
# cherry-pick 기본 순서
git checkout main
git checkout -b cherry
git cherry-pick <커밋ID(1)>...<커밋ID(2)> # (1)초과 (2)이하
git push origin cherry
# cherry-pick 충돌 발생 시
# 1. 충돌 코드 해결 후
git add .
git cherry-pick --continue
[10분 테코톡] 🎲 와일더의 Git Commands
브랜치 이동 명령어
# 아래 명령어들은 똑같은 기능을 수행
git switch <브랜치이름>
git checkout <브랜치이름>
상대참조
- git switch HEAD^: 바로 직전 commit으로 HEAD 이동 (^: 이동 횟수)
- git switch HEAD~<n>: HEAD 기준 n회 이전 commit으로 이동
- git branch -f <대상브랜치> <커밋ID>: 대상브랜치를 특정 커밋ID로 이동
작업 되돌리기
- git reset HEAD~1: HEAD의 commit 내용을 지우고 바로 직전 commit으로 작업 되돌리기
- git revert HEAD: HEAD 직전 commit으로 돌아가되, 돌아가는 내용을 새로운 commit으로 남김
복구: 삭제된 커밋, 브랜치
1. git reflog: 모든 log 확인
2. git reset --hard <커밋ID>: 삭제된 커밋 복구
3. git switch -c <브랜치이름> <커밋ID>: 삭제된 브랜치를 특정 commit 시점으로 복구
원격 저장소 다루기
- git remote add upstream <origin의 상위 repo 주소>: upstream 원격 저장소 추가
- upstream의 특정 브랜치 내용을 로컬로 가져오고, origin/<브랜치이름>에 해당 내용을 업로드
git fetch upstream <브랜치이름>
git pull upstream <브랜치이름>
git push origin <브랜치이름>
git - 간편 안내서
* git commit까지 해야 HEAD에 반영됨
* git fetch: 원격 저장소에서 가져온 내용을 확인만 할 뿐, 로컬에 영향을 미치지 않음
* git pull: 원격 저장소에서 가져온 내용을 로컬에 병합
* git diff <브랜치1> <브랜치2>: 브랜치1과 브랜치2의 차이 확인
* git tag 1.0.0 <커밋ID>: 특정 commit ID에 꼬리표 달기 (주로 새 SW 버전을 발표할 때 사용)
* git checkout -- <파일 이름>: 특정 파일을 최근 commit 상태로 되돌리기
* git reset --hard origin/master: 원격 저장소의 최신 내용을 가져오고, 로컬 master 브랜치가 해당 내을 가리키도록 함
* gitk: git의 내장 GUI
* git config color.ui true: 콘솔에서 git output을 컬러로 출력하기
* git config format.pretty oneline: 이력(log)에서 확정본 1개를 딱 한 줄로만 표시하기
* git add -i: 파일을 추가할 때 대화식으로 추가하기
git과 github
* 가장 최근 commit 상태 되돌리기
1. git reset HEAD
- 장점: 쉽다
- 단점: commit이 날아간다, 강제 push가 필요하
# 모든 로컬 변경사항(staged 상태)을 유지
git reset --soft HEAD
# 작업 상태는 그대로 두지만 index 리셋 (default)
git reset --mixed HEAD
# 모든 작업 상태 내 변경 사항을 버림
git reset --hard HEAD
# reset 이후 원격 저장소와 충돌이 있을 경우 강제 push
git push --force
2. branch를 만들어서 되돌리기
- 장점: 커밋이 사라지지 않는다
- 단점: 트리가 지저분해진다
# 되돌아가고자 하는 커밋ID로 checkout
git checkout HEAD
# 새 브랜치 생성, commit
git checkout -b <브랜치 이름>
git add .
git commit -m <메세지>
# 메인 브랜치에서 merge 후, 충돌 해결 시 새 브랜치 내용 채택
git merge <새 브랜치>
3. git revert
- 장점: 가장 정석적이며 커밋이 사라지지 않는다
- 단점: 충돌이 날 수 있다
# 되돌리기용 commit 생성
git revert HEAD
# 3개의 commit revert
git revert HEAD~3..head
* 작업 중인 내용 임시 저장
- git stash: 임시 저장
- git stash apply: 임시 저장된 내용 적용
- git stash drop: stash 제거
- git stash pop: apply + drop
* commit 덮어쓰기
- git commit --amend: 이전 커밋 덮어쓰기
- 이미 push를 한 경우 push --force 가 필요함
'Git' 카테고리의 다른 글
Git Commit 메세지 종류 (0) | 2023.10.28 |
---|---|
Git Command 정리 (4) | 2023.09.04 |