🧑💻 명령어
$ git init
📄 결과
.git
숨길 폴더가 생성된다..git
폴더를 삭제하고 git init
을 재시도하면 된다.🧑💻 명령어
# main 브랜치
$ git clone {저장소 URL}
# 특정 브랜치
$ git clone -b {브랜치명} --single-branch {저장소 URL}
✏️ 정의
현재 '로컬저장소' 의 상태를 보여주는 명령어이다.
다음과 같은 정보를 얻을 수 있다.
1.Working tree
상태: 현재 수정되거나 새로 생성된 파일들을 나열한다.
2.Staging area
상태: git add 명령어로 추가된 파일들을 나열한다.
3.커밋할 변경사항
: git commit 명령어로 커밋될 변경사항을 나열한다.
4.현재 브랜치 정보
: 현재 브랜치의 이름을 나열한다.
5.현재 커밋의 SHA-1 해시값
: 현재 커밋의 해시값을 나열한다.
🧑💻 명령어
$ git status
📄 결과
$ git status
On branch search3
Changes to be committed: # 스테이징 영역에 넘어가 있는 변경 내용을 보여준다.
(use "git reset HEAD <file>..." to unstage)
modified: src/components/Control/Control.jsx
modified: src/components/Input/Input.jsx
modified: src/components/List/ListItem.jsx
Changes not staged for commit: # 아직 워킹 디렉토리에 있는 변경 내용을 보여준다.
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: src/components/Search/Search.jsx
modified: src/components/Search/Search.stories.jsx
Untracked files: # 아직 워킹 디렉토리에 있으면서 한 번도 해당 Git 저장소가 관리한 적이 없는 새로운 파일을 보여준다.
(use "git add <file>..." to include in what will be committed)
src/components/Search/useSearch.js
📌 git 상태에 대한 자세한 내용은 여기를 클릭하면 확인할 수 있다.
✏️ 정의
Git
에서 파일을 추적하고commit
하기 위한 준비 단계에 해당한다.
즉, 다음 변경(commit
) 을 기록할 때 까지 변경분을 모아놓기 위해 사용한다.
따라서, 후에 설명 할git commit
명령어를 통해 명시적으로 기록을 남기기 전까지는git add
명령어를 무한히 실행해도 저장소의 변경 이력에는 어떠한 영향도 주지 않는다.
🧑💻 명령어
# 특정 파일명을 가진 파일만 add
$ git add {파일명}
# 특정 확장자를 가진 파일만 add
$ git add *.c
# '현재' 디렉토리 기준 모든 변경 내용
$ git add .
# 작업 디렉토리 내의 모든 변경 내용
$ git add -A
# 각 변경 사항을 터미널에서 하나씩 직접 눈으로 확인하면서 스테이징 영역으로 넘기거나 제외하고 싶을 때
$ git add -p
📄 결과
🔔 참고
git add -A
는 작업 디렉토리 상에 어디에 위치하든 항상 동일하게 모든 변경 내용을 스테이징 영역으로 넘긴다.git add .
는 실행한 디렉토리 이하에서 발생한 변경 내용만 포함하며, 해당 디렉토리 기준으로 상위 디렉토리 변경 내용을 포함하지 않는다.git add .
를 최상위 root 디렉토리에서 실행한다면 git add -A
와 동일한 기능을 한다.✏️ 정의
변경 사항을 '로컬저장소' 에
commit
하는 데 사용되는 명령어이다.
즉, 변경 사항을 로컬저장소에 기록하고, 이러한 변경 사항에 대한commit message
를 추가한다.
🧑💻 명령어
# commit만 실행
$ git commit -m '메시지'
# add와 commit 동시에 실행 (단, 이미 tracked된 파일만 add로 staged됨)
$ git commit -am '메시지'
# 메시지 없이 commit 실행
$ git commit -allow-empty-message -m ''
📄 결과
✏️ 정의
로컬저장소의 변경 사항을 '원격저장소' 로 업로드하는 명령어이다.
명령어를 사용하여 원격저장소에 변경 내용을 업로드하기 위해선, 먼저git add
와git commit
을 사용하여 로컬 장소에 변경 사항을 저장해야 한다.
🧑💻 명령어
# 원격 브랜치 생성
$ git push {원격저장소 이름} {branch 이름}
# 이미 코드를 push하여 기록이 되어있을 때, 새로 push하지 않고 코드 변경 이력을 덮어쓰고 싶을 때
$ git push -f {원격저장소 이름} {branch 이름}
# 원격 브랜치 삭제
$ git push {원격저장소 이름} --delete {branch 이름}
❗️원격저장소에 반영이 된 코드는 함부로 수정하면 협업 시 코드 충돌이 날 수 있기에 -f
옵션 사용엔 신중해야 한다.
📄 결과
🧑💻 명령어
1) fetch
# 전체 동기화
$ git fetch --all` 또는 `git fetch {원격저장소이름}
# 특정 브랜치 동기화
$ git fetch {원격저장소이름} {브랜치명}
# 이미 삭제한 원격 브랜치를 로컬 저장소와 동기화
$ git fetch --prune
2) remote update
$ git remote update
3) pull
$ git pull {원격저장소이름} {브랜치명}
📄 결과
git fetch
와 git remote update
는 원격저장소의 변경 내용을 가져오는 명령어이다.git pull
명령어는 원격저장소의 변경 내용을 가져옴과 동시에 로컬저장소와 병합한다.fetch
또는 remote update
명령어를 사용하고, 가져온 내용을 로컬과 병합하기 위해선 git pull
명령어를 이용한다.🧑💻 명령어
1) 원격저장소 이름 및 URL 확인
# 이름만 확인
$ git remote
# URL까지 확인
$ git remote -v
2) 원격저장소 등록 (이름 생략시 origin
으로 자동 등록)
$ git remote add {이름} {저장소 URL}
3) 원격저장소 이름 변경
$ git remote rename {변경 전 이름} {변경 할 이름}
4) 원격저장소 연결 해제
$ git remote remove {이름}
✏️ 정의
Git에서 Branch는 코드의 변경 사항을 분리하고 개별적으로 관리하기 위해 사용되는 개념이다.
즉, 독립적으로 개발되는 작업 내용을 분리하여 동시에 진행할 수 있도록 도와준다.
🧑💻 명령어
# 생성 O + checkout X
$ git branch {이름}
$ 생성 O + checkout O
$ git checkout -b {이름}
# 생성 X, checkout O
$ git checkout {이름}
🧑💻 명령어
$ git merge {합칠 branch 이름}
📄 결과
# main으로부터 hotfix 분기
$ git checkout main
$ git checkout -b hotfix
# hotfix 작업이 끝난 후 main과 merge
$ git checkout main
$ git merge hotfix
# 작업이 끝난 hotfix는 삭제
$ git branch -D hotfix
🔔 참고
merge commit
이 자동으로 생성된다.# 현재 브랜치가 hotfix라는 가정이며 원격저장소의 main 브랜치와 merge
$ git merge origin/main
# 다음과 같은 merge commit이 자동으로 생성된다.
$ Merge remote-tracking branch 'origin/main' into hotfix
...
❗️혼자 작업하는 프로젝트라면 큰 상관은 없지만 여러 사람과 협업하는 프로젝트에
merge commit
을 만들기 시작하면 히스토리가 지저분해질 수 있다.
❗️ 따라서merge commit
을 만들지 않으려면rebase
로 병합시키면 된다.
📌 merge와 관련 된 자세한 내용은 여기를 클릭하면 된다.
✏️ 정의
기존 브랜치의 변경 사항을 다른 브랜치의 끝에 적용하는 Git 명령어다.
즉, 다른 브랜치의 변경 사항을 기존 브랜치의 변경 사항 위에 적용하는 것이다.
🧑💻 명령어
# main 브랜치에 hotfix 브랜치를 병합
$ git rebase hotfix
# -i(interactive) 옵션을 통해 commit을 수정
$ git rebase -i {브랜치명}
# -i 옵션을 통해 편집기가 실행되면 다음과 같은 명령어를 제공
# commit 선택
$ pick
# commit 메시지 수정
$ reword
# commit 수정
$ edit
# commit 합치기
$ squash
$ fixup
# commit 실행
$ exec
# commit 삭제
$ drop
✏️ 정의
'로컬저장소' 의
commit
기록을 조작하여 이전 커밋으로 돌아가거나, 특정 파일의 수정 내역을 취소하는 등 작업 내용을 변경하는 명령어이다.
🧑💻 명령어
# default로 --mixed 모드가 적용
$ git reset {commit hash}
# --soft
$ git reset --soft {commit hash}
# --hard
$ git reset --hard {commit hash}
commit hash
는 되돌아가고자 하는 시점의 commit hash
를 넣어야 한다.$ git reset {B의 commit hash}
세 가지 모드가 존재한다.
1) --soft
add
까지 적용되었으며 말 그대로 commit
만 취소 된 상태이다.commit
을 할 수 있다.2) --mixed
add
까지 풀어버리는 모드이다.add
하여 커밋해야 한다.--mixed
모드로 default 적용된다.3) --hard
✏️ 정의
'원격저장소' 의 이전
commit
을 취소하고 새로운commit
을 생성한다.
reset
은 로컬저장소의 커밋 이력을 관리하는 용도라면,revert
는 원격저장소의 커밋 이력을 관리하는 용도이다.
reset
과 다르게 이전 커밋을 삭제하여 이전 버전의 내용을 원래대로 깔끔하게 원복하는 것이 아니라, '새로운 커밋' 을 생성하여 취소한다.
❗️revert
를 사용하는 핵심 목적은, 이전 커밋이 삭제되지 않기 때문에 이전 커밋에 의존하는 다른 작업들에 영향을 주지 않는다는 것이다.
🧑💻 명령어
$ git revert {commit hash}
📄 결과
# commit message의 예시
Revert "revet test"
This reverts commit 8e1c2b2aabe99fca068f2f3a51da561bc2c717a4.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch rebase
# Changes to be committed:
# modified: README.md
#
~
~
✏️ 정의
merge
또는rebase
결과 충돌이 났을 때, 명령어 이전 상태로 되돌아가고 싶을 때 사용한다.
🧑💻 명령어
# git merge 후 충돌났을 때
$ git merge --abort
# git rebase 후 충돌났을 때
$ git rebase --abort
✏️ 정의
가장 최근의
commit
을 수정하는 명령어이다.
다음과 같은 상황에서 사용할 수 있다.
1. 마지막 commit message를 수정하고 싶을 때
2. 수정한 파일을 마지막 commit에 추가하고 싶을 때
3. 수정한 파일과 commit message를 함께 수정하고 싶을 때
🧑💻 명령어
$ git commit --amend
📄 결과
amend
를 실행하면 commit history가 변경되므로 이미 push한 commit
을 수정하면 안된다.amend
는 '로컬'에서만 수행해야 한다.reset
을 통해 커밋을 지웠다가 다시 commit
을 날릴 필요없이 일단 수정 후, git add
후에 git commit --amend
명령어를 치면 마지막으로 날린 커밋의 내용을 수정하여 같이 올릴 수 있다.✏️ 정의
현재 작업중인 변경사항을 임시로 저장하는 명령어이다.
즉, 작업 중인 변경사항을 일시적으로 저장하고 다른 브랜치로 전환하거나 다른 작업을 할 수 있다.
🧑💻 명령어
# 현재까지 작업했던 변경 사항들을 저장
$ git stash
# stash로 저장 된 변경 사항 리스트 확인
$ git stash list
# 리스트에 있는 작업물 다시 가져오기 (리스트에서 삭제 X)
$ git stash apply # 0번째 작업물을 가져옴
$ git stash apply {번호} # 번호에 해당하는 작업물을 가져옴
# 리스트에 있는 stash
$ git stash drop # 가장 높은 번호의 작업물 삭제
$ git stash drop {번호} # 번호에 해당하는 작업물 삭제
# apply + drop
$ git stash pop # 가장 높은 번호에 적용 (최신 작업물)
$ git stash pop {번호} # 번호에 해당하는 작업물에 적용
📄 결과
git stash
로 작업물을 저장할 때 번호는 가장 거꾸로 부여된다.A->B->C
순서로 저장했을 경우, 0 = C
, 1 = B
, 2 = A
)✏️ 정의
checkout
명령이 이름과 다르게 많은 용도를 내포하여 사용자에게 혼란을 줄 수 있었다.
따라서git
버전 2.23 이후 부터는checkout
의 기능을 세분화 한switch
와restore
가 생기게 되었다.
switch
checkout
의 가장 큰 사용처는 바로 브랜치를 변경하는 부분이다.switch
라는 명령어로 대체하였다.🧑💻 명령어
# 브랜치 변경
$ git switch {브랜치명}
# 생성과 동시에 브랜치 변경
$ git switch -c {브랜치명} # git checkout -b {브랜치명} 과 완벽하게 동일한 기능
# HEAD가 아니라 틎겅 브랜치나 커밋에서 만들고 싶을 때
$ git switch -c {브랜치명} {commit hash}
restore
checkout
의 또 다른 기능은 working tree
의 파일 수정을 복원하는 것이다.🧑💻 명령어
# 이전 checkout 명령어
$ git checkout -- README.md
# restore를 이용한 명령어
$ git restore README.md
# reset 대신하여 staging area에 들어간 수정 내용을 commit에서 제외하고 싶을 때
$ git reset HEAD README.md # reset
$ git restore --staged README.md # restore
✏️ 정의
git repository에 특정 시점마다 tag를 달아 어떤 작업을 수행했는지 알 수 있다.
보통 Version을 달아 놓는다.
일반적으로 2가지 종류로 나뉜다.
1. 일반 태그 (Lightweight Tag): 단순 버전만 남기는 태그
2. 주석 태그 (Annotated Tag): 만든 사람의 이름, 이메일, 태깅 날짜, 태그 메시지 등을 저장하며 GPG(GNU Privacy Guard)로 서명까지 가능
🧑💻 명령어
$ git tag
$ git tag {태그 이름}
$ git tag -a {태그 이름} -m "만든 사람, 이메일, 날짜 등 내용 기입"
$ git tag -d {태그 이름}
특정 태그만 push를 할 경우
$ git push origin {태그 이름}
생성한 모든 태그를 push 할 경우
$ git push origin --tags
✏️ 정의
git과 github을 사용하면서 github 원격 저장소에 잘못 올라간 파일을 삭제하고 싶은 경우가 생긴다. 이러한 경우에 사용되는 명령어이다.
🧑💻 명령어
$ git rm {파일경로}
$ git rm -r {폴더경로}
$ git rm -r .
이 과정은 로컬에서의 삭제 과정이며, 삭제 후엔 만드시 add
-> commit
-> push
과정이 어루어져야 원격저장소까지 반영이 된다.
🧑💻 명령어
$ git branch -m {new name}
🧑💻 명령어
# 1. 일단 이름 변경
$ git branch -m {new name}
# 2. 원격 old name 브랜치 삭제 - 반드시 앞에 :를 붙인다!!
$ git push origin :{old name}
# 3. 원격에 new name 브랜치 push
$ git push --set-upstream origin {new name}