[Git] Git 명령어

Wonhyun Kwon·2023년 5월 12일
0

Git

목록 보기
2/5
post-thumbnail

1. 로컬저장소 등록

🧑‍💻 명령어

$ git init

📄 결과

  • 해당 디렉토리에 .git 숨길 폴더가 생성된다.
  • 초기화를 원할 때 .git 폴더를 삭제하고 git init 을 재시도하면 된다.

2. 원격저장소로부터 프로젝트 Clone

🧑‍💻 명령어

# main 브랜치
$ git clone {저장소 URL}

# 특정 브랜치
$ git clone -b {브랜치명} --single-branch {저장소 URL}

3. git status: 파일 상태 확인

✏️ 정의

현재 '로컬저장소' 의 상태를 보여주는 명령어이다.


다음과 같은 정보를 얻을 수 있다.
1. Working tree 상태: 현재 수정되거나 새로 생성된 파일들을 나열한다.
2. Staging area 상태: git add 명령어로 추가된 파일들을 나열한다.
3. 커밋할 변경사항: git commit 명령어로 커밋될 변경사항을 나열한다.
4. 현재 브랜치 정보: 현재 브랜치의 이름을 나열한다.
5. 현재 커밋의 SHA-1 해시값: 현재 커밋의 해시값을 나열한다.


🧑‍💻 명령어

$ git status

📄 결과

  • git에 의해 관리되는 파일들의 현재 상태를 확인할 수 있다.
  • 구체적으로, 작업 디렉토리와 스테이징 영역의 상태를 확인할 수 있다.
$ 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 상태에 대한 자세한 내용은 여기를 클릭하면 확인할 수 있다.


4. add

✏️ 정의

Git 에서 파일을 추적하고 commit 하기 위한 준비 단계에 해당한다.
즉, 다음 변경( commit ) 을 기록할 때 까지 변경분을 모아놓기 위해 사용한다.
따라서, 후에 설명 할 git commit 명령어를 통해 명시적으로 기록을 남기기 전까지는 git add 명령어를 무한히 실행해도 저장소의 변경 이력에는 어떠한 영향도 주지 않는다.


🧑‍💻 명령어

# 특정 파일명을 가진 파일만 add
$ git add {파일명}

# 특정 확장자를 가진 파일만 add
$ git add *.c

# '현재' 디렉토리 기준 모든 변경 내용
$ git add .

# 작업 디렉토리 내의 모든 변경 내용
$ git add -A

# 각 변경 사항을 터미널에서 하나씩 직접 눈으로 확인하면서 스테이징 영역으로 넘기거나 제외하고 싶을 때
$ git add -p

📄 결과

  • 이 명령어를 통해 '작업 디렉토리(working directory)' 상의 변경 내용을 '스테이징 영역(staging area)' 에 추가한다.

🔔 참고

  • git add -A 는 작업 디렉토리 상에 어디에 위치하든 항상 동일하게 모든 변경 내용을 스테이징 영역으로 넘긴다.
  • 반면에 git add . 는 실행한 디렉토리 이하에서 발생한 변경 내용만 포함하며, 해당 디렉토리 기준으로 상위 디렉토리 변경 내용을 포함하지 않는다.
  • 즉, git add . 를 최상위 root 디렉토리에서 실행한다면 git add -A 와 동일한 기능을 한다.

5. commit

✏️ 정의

변경 사항을 '로컬저장소'commit 하는 데 사용되는 명령어이다.
즉, 변경 사항을 로컬저장소에 기록하고, 이러한 변경 사항에 대한 commit message 를 추가한다.


🧑‍💻 명령어

# commit만 실행
$ git commit -m '메시지'

# add와 commit 동시에 실행 (단, 이미 tracked된 파일만 add로 staged됨)
$ git commit -am '메시지'

# 메시지 없이 commit 실행
$ git commit -allow-empty-message -m ''

📄 결과

  • '로컬저장소' 에 변경사항을 기록한다.
  • commit을 하면 스테이징 영역은 '초기화' 된다.

6. push

✏️ 정의

로컬저장소의 변경 사항을 '원격저장소' 로 업로드하는 명령어이다.
명령어를 사용하여 원격저장소에 변경 내용을 업로드하기 위해선, 먼저 git addgit commit 을 사용하여 로컬 장소에 변경 사항을 저장해야 한다.


🧑‍💻 명령어

# 원격 브랜치 생성
$ git push {원격저장소 이름} {branch 이름}

# 이미 코드를 push하여 기록이 되어있을 때, 새로 push하지 않고 코드 변경 이력을 덮어쓰고 싶을 때
$ git push -f {원격저장소 이름} {branch 이름}

# 원격 브랜치 삭제
$ git push {원격저장소 이름} --delete {branch 이름}

❗️원격저장소에 반영이 된 코드는 함부로 수정하면 협업 시 코드 충돌이 날 수 있기에 -f 옵션 사용엔 신중해야 한다.


📄 결과

  • '원격저장소' 에 변경사항을 기록한다.

7. fetch, remote update, pull

🧑‍💻 명령어

1) fetch

# 전체 동기화
$ git fetch --all` 또는 `git fetch {원격저장소이름}

# 특정 브랜치 동기화
$ git fetch {원격저장소이름} {브랜치명}

# 이미 삭제한 원격 브랜치를 로컬 저장소와 동기화
$ git fetch --prune

2) remote update

$ git remote update

3) pull

$ git pull {원격저장소이름} {브랜치명}

📄 결과

  • git fetchgit remote update는 원격저장소의 변경 내용을 가져오는 명령어이다.
  • 즉, 원격저장소의 변경사항을 로컬저장소로 가져오지만, '반영은 하지 않는다.'
    git pull 명령어는 원격저장소의 변경 내용을 가져옴과 동시에 로컬저장소와 병합한다.
  • 따라서, 로컬과 원격 간의 차이점을 확인만 하는 용도는 fetch 또는 remote update 명령어를 사용하고, 가져온 내용을 로컬과 병합하기 위해선 git pull 명령어를 이용한다.

8. remote

🧑‍💻 명령어

1) 원격저장소 이름 및 URL 확인

# 이름만 확인
$ git remote

# URL까지 확인
$ git remote -v

2) 원격저장소 등록 (이름 생략시 origin 으로 자동 등록)

$ git remote add {이름} {저장소 URL}

3) 원격저장소 이름 변경

$ git remote rename {변경 전 이름} {변경 할 이름}

4) 원격저장소 연결 해제

$ git remote remove {이름}

9. branch

✏️ 정의

Git에서 Branch는 코드의 변경 사항을 분리하고 개별적으로 관리하기 위해 사용되는 개념이다.
즉, 독립적으로 개발되는 작업 내용을 분리하여 동시에 진행할 수 있도록 도와준다.


🧑‍💻 명령어

# 생성 O + checkout X
$ git branch {이름}

$ 생성 O + checkout O
$ git checkout -b {이름}

# 생성 X, checkout O
$ git checkout {이름}

10. merge

🧑‍💻 명령어

$ git merge {합칠 branch 이름}

📄 결과

  • 다음과 같은 상황이 있다.
    1. main 브랜치로부터 hotfix 브랜치를 분기한다.
    2. hotfix 브랜치의 작업이 끝난 후 main 브랜치에 다시 병합(merge)한다.
    3. 병합이 끝난 후 hotfix 브랜치는 삭제한다.
# main으로부터 hotfix 분기
$ git checkout main
$ git checkout -b hotfix

# hotfix 작업이 끝난 후 main과 merge
$ git checkout main
$ git merge hotfix

# 작업이 끝난 hotfix는 삭제
$ git branch -D hotfix

🔔 참고

  • 현재 checkout 되어 있는 브랜치(main)를 기준으로 merge 할 대상 브랜치(hotfix)가 현재 브랜치로 합쳐진다.
  • 원격브랜치와 직접 merge할 경우 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와 관련 된 자세한 내용은 여기를 클릭하면 된다.


11. rebase

✏️ 정의

기존 브랜치의 변경 사항을 다른 브랜치의 끝에 적용하는 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

12. reset

✏️ 정의

'로컬저장소'commit 기록을 조작하여 이전 커밋으로 돌아가거나, 특정 파일의 수정 내역을 취소하는 등 작업 내용을 변경하는 명령어이다.


🧑‍💻 명령어

# default로 --mixed 모드가 적용
$ git reset {commit hash}

# --soft
$ git reset --soft {commit hash}

# --hard
$ git reset --hard {commit hash}

📄 결과
  • commit hash 는 되돌아가고자 하는 시점의 commit hash 를 넣어야 한다.
  • 즉, A -> B -> C 시간 순서의 커밋이 있을 때, C의 커밋을 지우고 싶으면 B로 reset 해야한다.
$ git reset {B의 commit hash}
  • 세 가지 모드가 존재한다.
    1) --soft

    • 이전 커밋으로 되돌아가지만, 변경 내용은 그대로 스테이지에 남겨둔다.
    • 즉, add까지 적용되었으며 말 그대로 commit 만 취소 된 상태이다.
    • 따라서, 바로 다시 commit 을 할 수 있다.

    2) --mixed

    • 이전 커밋으로 되돌아가면서, 변경 내용은 스테이지에서 제거된다.
    • 즉, add 까지 풀어버리는 모드이다.
    • 따라서, 변경 내용을 다시 add 하여 커밋해야 한다.
    • 명령어 뒤에 모드없이 사용하면 --mixed 모드로 default 적용된다.

    3) --hard

    • 이전 커밋으로 되돌아가면서, '변경 내용도 모두 제거' 된다.
    • 이 모드는 작업 내용을 '강제'로 지우기 때문에, 사용 전에 주의가 필요하다.

13. revert

✏️ 정의

'원격저장소' 의 이전 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
#
~
~

14. abort

✏️ 정의

merge 또는 rebase 결과 충돌이 났을 때, 명령어 이전 상태로 되돌아가고 싶을 때 사용한다.


🧑‍💻 명령어

# git merge 후 충돌났을 때
$ git merge --abort

# git rebase 후 충돌났을 때
$ git rebase --abort

15. amend

✏️ 정의

가장 최근의 commit 을 수정하는 명령어이다.


다음과 같은 상황에서 사용할 수 있다.
1. 마지막 commit message를 수정하고 싶을 때
2. 수정한 파일을 마지막 commit에 추가하고 싶을 때
3. 수정한 파일과 commit message를 함께 수정하고 싶을 때


🧑‍💻 명령어

$ git commit --amend

📄 결과

  • 실행하면 git은 수정할 수 있는 commit message 에디터를 따로 연다.
  • 에디터에서 수정하고 싶은 내용을 입력한다.
  • ❗️amend 를 실행하면 commit history가 변경되므로 이미 push한 commit 을 수정하면 안된다.
  • ❗️즉, amend 는 '로컬'에서만 수행해야 한다.
  • commit 후에 추가로 변경사항이 있다면, 굳이 reset 을 통해 커밋을 지웠다가 다시 commit 을 날릴 필요없이 일단 수정 후, git add 후에 git commit --amend 명령어를 치면 마지막으로 날린 커밋의 내용을 수정하여 같이 올릴 수 있다.

16. stash

✏️ 정의

현재 작업중인 변경사항을 임시로 저장하는 명령어이다.
즉, 작업 중인 변경사항을 일시적으로 저장하고 다른 브랜치로 전환하거나 다른 작업을 할 수 있다.


🧑‍💻 명령어

# 현재까지 작업했던 변경 사항들을 저장
$ 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)

17. checkout, switch, restore

✏️ 정의

checkout 명령이 이름과 다르게 많은 용도를 내포하여 사용자에게 혼란을 줄 수 있었다.
따라서 git 버전 2.23 이후 부터는 checkout 의 기능을 세분화 한 switchrestore 가 생기게 되었다.


  1. switch
    checkout 의 가장 큰 사용처는 바로 브랜치를 변경하는 부분이다.
    이 기능을 분리하여 switch 라는 명령어로 대체하였다.

🧑‍💻 명령어

# 브랜치 변경
$ git switch {브랜치명}

# 생성과 동시에 브랜치 변경
$ git switch -c {브랜치명} # git checkout -b {브랜치명} 과 완벽하게 동일한 기능

# HEAD가 아니라 틎겅 브랜치나 커밋에서 만들고 싶을 때
$ git switch -c {브랜치명} {commit hash}
  1. restore
    checkout 의 또 다른 기능은 working tree 의 파일 수정을 복원하는 것이다.
    예를 들어 README.md 파일이 수정되었을 때, 수정 사항을 롤백하고 이전 커밋으로 되돌리고 싶으면 다음과 같이 실행하면 된다.

🧑‍💻 명령어

# 이전 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

18. tag

✏️ 정의

git repository에 특정 시점마다 tag를 달아 어떤 작업을 수행했는지 알 수 있다.
보통 Version을 달아 놓는다.
일반적으로 2가지 종류로 나뉜다.
1. 일반 태그 (Lightweight Tag): 단순 버전만 남기는 태그
2. 주석 태그 (Annotated Tag): 만든 사람의 이름, 이메일, 태깅 날짜, 태그 메시지 등을 저장하며 GPG(GNU Privacy Guard)로 서명까지 가능

🧑‍💻 명령어

  1. 현존하는 tag 확인
$ git tag

  1. 일반 태그 생성
$ git tag {태그 이름}

  1. 주석 태그 생성
$ git tag -a {태그 이름} -m "만든 사람, 이메일, 날짜 등 내용 기입"

  1. 삭제
$ git tag -d {태그 이름}

  1. 원격 저장소 push

특정 태그만 push를 할 경우

$ git push origin {태그 이름}

생성한 모든 태그를 push 할 경우

$ git push origin --tags



19. cache 삭제

✏️ 정의

git과 github을 사용하면서 github 원격 저장소에 잘못 올라간 파일을 삭제하고 싶은 경우가 생긴다. 이러한 경우에 사용되는 명령어이다.

🧑‍💻 명령어

  1. 특정 파일만 삭제
$ git rm {파일경로}
  1. 특정 폴더만 삭제
$ git rm -r {폴더경로}
  1. 프로젝트 모든 파일 삭제
$ git rm -r .

이 과정은 로컬에서의 삭제 과정이며, 삭제 후엔 만드시 add -> commit -> push 과정이 어루어져야 원격저장소까지 반영이 된다.




20. 브랜치 이름 변경

1. 로컬 브랜치

🧑‍💻 명령어

$ git branch -m {new name}

2. 원격 브랜치

🧑‍💻 명령어

# 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}
profile
모든 사용자가 만족하는 UI를 만드는 FE 개발자 권원현입니다.

0개의 댓글