All'alba vincerò

At dawn, I will win!

Git

Git CLI

나디아 Nadia 2024. 4. 24. 18:52

 
 

📌 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 디렉터리 하위에 위치한 파일
- 이 파일에는 원격저장소가 병합할 때 마다 생기는 최신 커밋의 정보가 들어 있다.

 
 
 
➕ 변경된 내역을 병합해서 로컬저장소의 최신커밋 버전으로 만들기는 아래 참고

 

[GIT] Fetch (커밋 정보 가져오기)

fetch 기능은 git의 pull과 어느정도 비슷한 부분이 있어요.pull은 원격 저장소의 내용을 가져와서 로컬 저장소에 복사하는 기능이라면,fetch는 원격 저장소에 변경된 내용만 가져와서 확인할 수 있게

velog.io

 
 
 
 
 

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

 
 
 


 

참고

 

 

[Git] reset 자세히 알아보기

git reset을 사용하는 경우? 다음과 같은 커밋 네역이 있다고 생각 합시다. 커밋 이전까지는 생각 못했던 심각한 실수를 C3로 commit 해버린 상태입니다. 이런 상황에서 실수로 커밋한 부분을 되돌리

antilog.tistory.com

 

 

05-03 merge의 종류 : fast-forward, 3-way merge

브랜치간 merging을 할 때 새로운 commit이 생겨날 수도 있고, 그렇지 않을 수도 있다. 본 절에서는 대표적인 merge의 종류인 fast-forward와 3-way m…

wikidocs.net

 

 

[GIT] Fetch (커밋 정보 가져오기)

fetch 기능은 git의 pull과 어느정도 비슷한 부분이 있어요.pull은 원격 저장소의 내용을 가져와서 로컬 저장소에 복사하는 기능이라면,fetch는 원격 저장소에 변경된 내용만 가져와서 확인할 수 있게

velog.io