Git

우아한 테크코스 6기 프리코스: Git 학습 내용 정리

Jinmidnight 2023. 11. 1. 02:41

※ 우아한 테크코스 프리코스 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