📌 Git CLI
* git으로 관리할 폴더에서 실행
1. git init : 저장소 생성 (git 초기화)
2. git add : Staging Area로 보냄 (확정)
3. git status : 현재 상태 확인
4. git commit -m : 파일의 변경 사항에 대한 메세지 생성
5. git restore : (한 번이라도 commit 한 적 있을 때) 작업 내용 취소
6. git log : 커밋 이력 확인
7. git remote : 원격 저장소(Remote) 브랜치
8. git clone : 원격 저장소에서 로컬 저장소로 복제
9. git reset : 이전 상태로 복원 (이력 제거)
10. git checkout : 과거 커밋 이력 확인
11. git branch : 브랜치(branch) 생성
12. git switch/checkout : 브랜치(branch) 변경, 이동
13. git merge : 브랜치 병합하기
14. git push : 로컬의 변경 이력을 원격 저장소(remote)로 전송
15. git pull : 리모트의 내용을 로컬에 반영 (fetch + merge)
16. git fetch : 원격저장소의 변경된 커밋을 가져옴
17. git stash : 워킹 디렉토리에 수정된 내용을 임시 저장소에 저장
18. git rm : 워킹 디렉토리의 파일 삭제 (staging area엔 있음)
1. git init : 저장소 생성 (git 초기화)
: 현재 디렉토리를 Git 저장소로 만든다.
- .git 폴더(숨김 폴더)가 생성됨 👉 git repository가 됨
- ✨ 루트에서 git init을 하면 안된다 ❌
- => git 저장소 안에 또 다른 git 저장소를 만들면 안됨 ❌
- => 초기화 작업은 한 번만 해야 한다.
- => .git은 프로젝트 폴더의 최상위 폴더에만 있어야 함
- (ex. ~(루트) > techit-school > learn-commit 순일 때 learn-commit 폴더를 git으로 관리해야 함)
* git 저장소 폴더에 .git이 있어야 함
🔺 .git 확인하기
ls -a
🔺 .git 제거하기
rm -r .git
2. git add : Staging Area로 보냄 (확정)
: 변경 사항이 있는 파일을 Staging Area(index)에 추가
git add 파일명
git add * : 전체 디렉토리 선택
git add . : 현재 디렉토리의 변경사항을 모두 선택
3. git status : 현재 상태 확인
git status
- 변경된 파일명이 빨간색으로 보일 경우 Working Directory 상태
- 변경된 파일명이 초록색으로 보일 경우 Staging Area 상태
- nothing to commit, working tree clean의 경우 변경 내용이 없음을 나타냄
4. git commit -m : 파일의 변경 사항에 대한 메세지 생성
git commit -m "커밋 메시지"
옵션 1. commit
: COMMIT_EDITMSG 창을 열어서 수정할 커밋할 수 있음
git commit
- 해당 브랜치에만 있음
- ex) likelion 브랜치에서 커밋 저장 시 likelion 브랜치에만 있음
- main 브랜치에서 저장 시 main 브랜치에만 있음
- HEAD : 마지막 commit을 조회하고 있음
옵션 2. --amend
: 마지막 커밋 메시지 수정
git commit --amend
5. git restore : (한 번이라도 commit 한 적 있을 때) 작업 내용 취소
: Working Directory에 변경 내용을 취소할 경우(Tracked File), 수정한 내용이 삭제됨
git restore 파일명
- 위치(Staging / Working)에 따라 작업이 다름
옵션 1. staged
: Staging Area에 변경 내용을 Working Directory로 되돌릴 경우, Staging에 있는 디렉토리를 Working으로 옮김
git restore --staged 파일명
- 한 번 state로 보냈다가 다시 Working Dir로 가져온 파일에는 restore 사용
- 한 번도 커밋을 한 적 없는 파일에는 rm 사용
git rm --cached 파일명
6. git log : 커밋 이력 확인
# 커밋 Log를 한 줄로 보기
git log --oneline
# 그래프 형태로 보기
git log --oneline --graph
# Log가 많을 경우 모두 출력하고자 할 때
git config --global core.pager cat
# 모든 branch를 그래프로 보기
git log --oneline --graph --all
7. git remote : 원격 저장소(Remote) 브랜치
* 깃허브에서 레파지토리를 만들면 👉 mkdir (파일 생성) + git init(git 초기화)까지 된 상태
- remote: 원격 저장소
- origin: 별칭
# 원격 저장소 브랜치 조회
git remote -v
# 리모트 branch 추가
- 로컬 저장소를 원격 저장소(remote)에 등록하는 코드 (레파지토리마다 다름)
# 원격 저장소 삭제
git remote rm origin
* HEAD 👉 로컬 저장소 / origin 👉 원격 저장소
- origin/main이 안보임 ❌ 🟰 로컬/원격 브랜치가 서로 연결이 안되어있는 상태 or 최신 변동사항이 반영되지 않았을 때
- origin/main이 보임 ⭕ 🟰 해당 커밋까지 원격저장소에 push 되어 있음
8. git clone : 원격 저장소에서 로컬 저장소로 복제
git clone 주소 저장할파일명
(ex. git clone https://github.com/kwonboryong/learn-commit.git learn-reset)
* 주소: 깃허브 레파지토리의 <> Code에서 주소 복사
* cp : 로컬 ➡ 로컬로 복제
clone : 원격 ➡ 로컬로 복제 (clone도 remote로 삭제)
# 특정 브랜치 로컬로 clone하기
git switch -t origin/student
- 로컬 브랜치 확인
git branch
9. git reset : 이전 상태로 복원 (이력 제거)
: 커밋 기록은 삭제되지만 Working Directory에 변경 사항은 남김
git reset HEAD~n/hashcode
* HEAD~n : HEAD에서 n단계 이전으로 돌아가기
* push 후에는 commit을 reset하거나 rebase 하지 않는 것이 좋다.
- reset / rebase는 로컬에 있는 커밋에만 진행
# git reset의 옵션
옵션 1. mixed (기본값)
: commit 취소 후 언스태이징(Unstaging (= Working)) 상태로 되돌린다.
=> 코드를 수정하고 commit 하고 싶을 때 사용
=> 해당 hashcode 커밋을 Working 디렉토리로 이동시킴
git reset --mixed HEAD~n/hashcode
= git reset HEAD~n/hashcode
(--mixed 생략 가능)
* hashcode
옵션 2. soft
: commit 기록 삭제, Working Directory와 Staging Area에 변경 사항은 남긴다.
=> Staging에 위치함, 내용(코드)은 그대로
=> 커밋 내용을 수정하고 싶을 때 사용
git reset --soft HEAD~n/ hashcode
옵션 3. hard
: HEAD~n 커밋 시점으로 복원, 커밋과 내용(코드) 모두 삭제
=> 수정사항이 없었던 때로 되돌리기 때문에 수정한 코드는 삭제됨
git reset --hard HEAD~n/hashcode
* reflog로 되돌리기 가능 O
1. git reflog으로 커밋 전체 기록 조회
2. `git reset --hard 복원하고자 하는 커밋의 해쉬코드`
* git reflog: commit 전체 기록
* git 옵션 설정
git config --global -e
10. git checkout : 과거 커밋 이력 확인
: 해당 커밋 메시지를 가리키는 시점으로 돌아간다.
=> 과거 이력만 확인함 (reset과 다름)
# n개 이전의 커밋/ 특정 커밋으로 이동
git checkout HEAD~n/hashcode
# 최근(마지막) 커밋으로 복귀
git checkout main
11. git branch : 브랜치(branch) 생성
* branch: 가지 (main이 중심)
git branch 브랜치명
(ex. git branch likelion)
# 현재 위치한 브랜치 조회
git branch
옵션 1. -d
: 브랜치 삭제
git branch -d 브랜치명
(ex. git branch -d likelion)
옵션 2. -m
: 브랜치명 변경
git branch -m 원래브랜치명 새로운브랜치명
(ex. git branch -m likelion techit)
-> likelion 브랜치 이름을 techit으로 변경
12. git switch/checkout : 브랜치(branch) 변경, 이동
- checkout 명령이 여러 기능을 가지고 있기 때문에 브랜치 이동을 위한 기능으로 switch 명령이 추가됨
(checkout, switch 모두 사용 가능)
git checkout 브랜치명
git switch 브랜치명
* 브랜치를 변경하고 싶을 때!
수정한 내용이 있다면 commit 후 switch 해야 함
옵션 1. switch -c / checkout -b
: 브랜치 생성 + 이동
git switch -c 브랜치명
(ex. git switch -c likelion)
git checkout -b 브랜치명
(ex. git checkout -b likelion)
옵션 2. main
: main 브랜치로 복귀
git switch main
* GUI로 브랜치 이동(switch)하는 방법
- GUI -> CLI 영향 X
- GUI로 바꾼 건 CLI엔 영향이 없다
- CLI -> GUI 영향 O
13. git merge : 브랜치 병합하기
git merge 병합할 브랜치명
(ex. git merge likelion)
-> likelion 브랜치를 main 브랜치로 병합 (현재 main 브랜치)
옵션 1. --abort
: 진행 중인 merge 취소
git merge --abort
❗커밋하지 않은 변경사항이 있는 경우에는 --abort를 수행할 수 없음
✨ 충돌(conflict) 해결 쉽게 하기 => config 설정에 mergetool 추가
1. `git config --global -e`로 파일 열기
2. 아래 코드 추가
[merge]
tool = vscode
[mergetool "vscode"]
cmd = code --wait $MERGED
✨ 충돌을 수동으로 해결하는 법
- 두 개의 브랜치에서 같은 파일을 따로 수정 👉 같은 줄에 다른 코드가 있으면 충돌 발생 👉 git mergetool 사용 👉 Accept 방식을 선택해서 해결
Accept 방식을 선택해서 해결
📍 merge 방식
1. fast forward merge (직렬)
- 이전 브랜치의 커밋이 현재 브랜치에 직접 적용될 수 있을 때 발생
- 이전 브랜치의 히스토리가 현재 브랜치의 히스토리와 같을 때 or 현재 브랜치의 직전 커밋의 부모가 이전 브랜치의 마지막 커밋인 경우 발생
- 충돌이 없는 경우에는 Git이 자동으로 fast forward merge를 수행하여 브랜치를 병합
* merge 방식 강제 변경
- fast-forward merge 되는 게 싫으면, `git merge —no-ff 브랜치명`을 사용해서 강제로 3-way merge를 할 수도 있다.
git merge —no-ff 브랜치명
2. 3-way merge (병렬)
- 두 개의 다른 브랜치가 같은 파일을 동시에 수정하고 커밋한 경우에 발생
- Git은 3-way merge를 사용하여 두 브랜치의 변경 사항과 공통 조상의 변경 사항을 비교
- 변경 사항을 결합하고 충돌이 발생하지 않으면 자동으로 병합. 하지만 충돌이 발생하면 수동으로 충돌을 해결해야 함
* Github에 올리기
- VS Code 왼쪽 Source Control에서 해당 파일의 publish 누르기
❗저장된 원격 저장소가 없어야 가능⭕
- `git remote -v`로 연결된 원격 저장소(remote) 확인
- remote가 있다면 `git remote rm origin`으로 삭제하면 public 버튼이 생김
14. git push : 로컬의 변경 이력을 👉 원격 저장소(remote)로 전송
git push
# 로컬의 main 브랜치의 변경 이력을 리모트 main 브랜치로 보내기
git push -u 브랜치명 main
(ex. git push -u origin main)
* git push 순서
1. github에서 레파지토리 생성
- 레파지토리 주소 복사
2. git remote -v로 리모트 확인
3. git remote add 별칭 레파지토리주소
git remote add mine https://github.com/kwonboryong/html-css.git
4. 서로 관련 기록이 없는 두 저장소의 병합 허용하기
git pull origin main --allow-unrelated-histories
5. git push --set-upstream 별칭 push할브랜치
git push --set-upstream mine student
push할 대상 => mine (내꺼)
pull할 대상 => origin (선생님꺼)
* 로컬 저장소와 원격 저장소를 동기화 시켜줘야 함
HEAD 👉 로컬 저장소
origin 👉 원격 저장소
15. git pull : 원격 저장소의 내용을 👉 로컬에 반영 (fetch + merge)
git pull
# 리모트 main 브랜치의 변경 이력을 로컬 main 브랜치로 가져오기
git pull origin main
16. git fetch : 원격 저장소의 변경된 커밋을 가져옴
: 원격 저장소에 있는 변경 내역들을 로컬 저장소로 pull 하기 전에 변경된 내역들만 가져와서 확인시켜주는 기능
git fetch 원격 저장소명
- 원격저장소에 있는 내용을 pull 하기 전에 어떠한 변경 내역들이 있는지 변경 내역에 대한 로그를 확인하고 신중히 결정한 후에 pull 할 수 있다.
- ❗ Pull 👉 원격 저장소의 정보를 모두 가져와서 working directory까지 가져옴
- ❗ Fetch 👉 원격 저장소의 변경된 커밋만 가져옴
# FETCH_HEAD에 업데이트된 원격저장소의 최신 커밋이 현재 브랜치에 병합
git merge FETCH_HEAD
# `git fetch + merge FETCH_HEAD` 명령어를 한 번에 사용
git fetch; git merge FETCH_HEAD
✨ FETCH_HEAD
: Git에서 Fetch 할 때 마다 업데이트 되는 .git 디렉터리 하위에 위치한 파일
- 이 파일에는 원격저장소가 병합할 때 마다 생기는 최신 커밋의 정보가 들어 있다.
➕ 변경된 내역을 병합해서 로컬저장소의 최신커밋 버전으로 만들기는 아래 참고
17. git stash : Working 디렉토리의 수정된 내용을 임시 저장소에 저장
: 워킹 디렉토리에 수정된 내용을 임시 저장소에 저장해두는 명령어
- commit 하지 않은 상태에서 브랜치 변경할 때 사용
git stash
* stash: 임시 저장소
# stash list 확인하기
git stash list
# stash에 저장해놓은 파일을 Working Directory로 다시 가져옴
git stash apply
# stash에 저장해놓은 파일 삭제하기
git stash drop
# stash에 저장해놓은 파일을 꺼내오기 + 삭제하기 (apply + drop)
git stash pop
✨ commit 하지 않은 상태에서 브랜치 변경하는 방법
- commit까지 하기엔 애매한 코드 변경일 때 사용
1. git stash
2. git switch ssam
3. git pull
4. git stash list
5. git stash apply
6. git stash drop
18. git rm -rf : Working 디렉토리의 파일 삭제
: 워킹 디렉토리의 파일 삭제 (staging area엔 올라가있는 상태)
- git rm -rf로 지우면 워킹 디렉토리엔 삭제돼도 스테이징엔 올라가 있는 상태임
=> commit + push해서 삭제된 것도 업데이트 해줘야 함
순서
git rm -rf `폴더/파일명`
git commit -m "커밋 메세지(~ 삭제)"
git push
📌 Git이 관리하는 저장소의 기본 브랜치가 master일 경우 main으로 변경하기
* master는 인종차별적 단어라 main을 사용하는 추세
# git init 명령으로 생성된 저장소의 기본 브랜치가 master일 때 -> main으로 브랜치명 변경
git branch -m main
# git init 명령으로 Git 저장소를 초기화 시킬 때 브랜치가 main이 되도록 설정
git init -b main
# 로컬 환경에서 git init 명령을 통해 Git 저장소를 초기화하면 기본 브랜치가 main이 되도록 설정
git config --global init.defaultBranch main
📌 상태 메시지가 한글로 나올 경우 영어로 변경하기
1. 현재 Language 조회
echo $LANG
2. .zshrc 파일을 Visual Studio Code로 열고 기본 언어 변경
code ~/.zshrc
export LANG=en_US.UTF-8
3. source 명령을 사용하여 .zshrc 파일을 실행
source ~/.zshrc
📌 알아두면 유용한 Git Config 설정
# 인증 절차 생략
git config --global credential.helper store
# 15분 동안 인증 유예
git config --global credential.helper cache
# timeout 옵션을 사용하여 인증 유예시간 지정 가능 (3600 = 1시간)
git config --global credential.helper 'cache --timeout=3600'
# Github 폴더 및 파일명 대소문자 구분 (!주의 필요)
git config --global core.ignorecase false
참고