
🧑💻 명령어
$ 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가 생기게 되었다.
switchcheckout 의 가장 큰 사용처는 바로 브랜치를 변경하는 부분이다.switch 라는 명령어로 대체하였다.🧑💻 명령어
# 브랜치 변경
$ git switch {브랜치명}
# 생성과 동시에 브랜치 변경
$ git switch -c {브랜치명} # git checkout -b {브랜치명} 과 완벽하게 동일한 기능
# HEAD가 아니라 틎겅 브랜치나 커밋에서 만들고 싶을 때
$ git switch -c {브랜치명} {commit hash}
restorecheckout 의 또 다른 기능은 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}