Git 기본 명령어 정리

이번 우아한테크코스 7기 프리코스를 진행하면서 자주 사용하는 Git 명령어뿐만 아니라 잘 사용하지 않았던 명령어들도 활용하게 되었다는 것을 깨달았다. 이를 복습하고자, 기본 커맨드와 다양한 명령어를 실습하고 정리하려고 한다.

1. 기본 설정 및 초기화

1.1 git init

Git 저장소를 초기화하여 현재 디렉토리를 새로운 Git 저장소로 설정한다.

$ git init

Git 폴더가 생성되며, 해당 디렉토리는 Git으로 관리되기 시작한다.

Initialized empty Git repository in C:/Users/bbt12/Desktop/git_test/.git/

1.2 git config

사용자 이름과 이메일을 설정하여 커밋 작성자 정보를 등록한다.

$ git config --global user.name "Your Name"
$ git config --global user.email "your.email@example.com"

git config –list 명령어로 설정된 정보를 확인할 수 있다.

$ git config --list
user.email=bbt1250912@gmail.com
user.name=Grayson1999

2. 저장소 상태 확인

2.1 git status

현재 작업 중인 파일의 상태를 확인하여 변경된 파일이나 스테이징된 파일 목록을 보여준다.

$ git status
On branch master
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        A.txt
        B.txt
        C.txt
        D.txt
        E.txt

2.2 git log

커밋 기록을 확인하여 이전 작업 내역을 살펴본다.

$ git log
commit 08a7b8f092e0d69123656caeadeaa0baf68996de (HEAD -> master)
Author: Grayson1999 <bbt1250912@gmail.com>
Date:   Tue Oct 22 19:40:09 2024 +0900

    feat: A 기능 추가

    A라는 엄청난 기능을 추가함

3. 파일 추적 및 스테이징

3.1 git add

변경된 파일을 Staging Area로 옮겨 Git이 변경 사항을 추적하도록 준비한다.

$ git add [파일명 | .]
  • git add .: 현재 디렉토리에서 변경되었거나 새로 추가된 모든 파일을 스테이징한다.
  • git add {특정 파일}: 특정 파일만 스테이징한다.
$ git add B.txt
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   B.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        C.txt
        D.txt

3.2 git restore –staged

스테이징된 파일을 Staging Area에서 제거하고, 다시 Unstaged 상태로 되돌린다.

$ git restore --staged [파일명 | .]
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        B.txt
        C.txt
        D.txt
        E.txt

4. 커밋하기

4.1 git commit

스테이징된 변경 사항을 저장소에 커밋하며, 커밋 메시지를 추가하여 기록한다.

$ git commit -m 'feat: B라는 소박한 기능 추가'
$ git log
commit 2a145e1aee724f8eefa3a16041faf93a237b30f9 (HEAD -> master)
Author: Grayson1999 <bbt1250912@gmail.com>
Date:   Wed Oct 23 14:58:58 2024 +0900

    feat: B라는 소박한 기능 추가

4.2 git commit –amend

마지막 커밋 메시지를 수정하거나 커밋 내용을 변경한다.

$ git commit --amend -m 'B라는 거대한 기능 추가로 커밋 메시지 변경'
$ git log
commit c5b0a86eaedf73ca757a39ab629e14e2500f3ec8 (HEAD -> master)
Author: Grayson1999 <bbt1250912@gmail.com>
Date:   Wed Oct 23 14:58:58 2024 +0900

    B라는 거대한 기능 추가로 커밋 메시지 변경

5. 브랜치 관리

5.1 git branch

브랜치를 생성하거나 삭제하고, 목록을 확인한다.

$ git branch 새브랜치명
$ git branch
  grayson
* master
  • git branch -d: 병합된 로컬 브랜치를 삭제할 때 사용한다. 병합되지 않은 브랜치를 강제로 삭제하려면 git branch -D를 사용한다.
$ git branch -d grayson2
Deleted branch grayson2 (was c5b0a86).

5.2 git checkout

다른 브랜치로 이동하거나 특정 커밋으로 되돌아간다.

$ git checkout {브랜치명 | 해시}
$ git checkout grayson
Switched to branch 'grayson'

5.3 git switch

브랜치를 전환하거나 새 브랜치를 생성한다.

$ git switch master
Switched to branch 'master'
  • git switch -c: 새 브랜치를 생성하고 해당 브랜치로 전환한다.
$ git switch -c grayson2

※ git switch와 git checkout의 차이점

  • git switch: 브랜치 전환 및 생성에 특화된 명령이다.
  • git checkout: 더 범용적인 명령으로, 커밋, 브랜치 전환 등이 가능하다.

6. 병합 및 충돌 해결

6.1 git merge

다른 브랜치를 현재 브랜치에 병합한다.

$ git merge 브랜치명

병합 후 충돌이 없으면 성공 메시지가 출력된다. 충돌이 발생하면 다음과 같은 메시지가 나타난다.

$ git merge grayson2
Updating c5b0a86..9fc798f
Fast-forward
 C.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 C.txt

6.2 git rebase

기존 브랜치의 커밋 히스토리를 재정렬하는 데 사용한다.

  • 기본적으로 rebase는 한 브랜치의 변경 사항을 다른 브랜치 위에 적용하여 마치 해당 브랜치가 그 위에서 바로 작업된 것처럼 히스토리를 수정하는 것으로, 더 깔끔한 커밋 히스토리를 남기고 싶을 때 사용한다.
grayson: C - B - A
grayson2: E - A
$ git rebase grayson2
Successfully rebased and updated refs/heads/grayson.
grayson: C - B - E - A
$ git log
commit 05ec340d2822ff527f76db88d9a10bd47360654b (HEAD -> grayson)
Author: Grayson1999 <bbt1250912@gmail.com>
Date:   Wed Oct 23 15:41:38 2024 +0900

    feat: grayson2 브랜치에서 C 기능 추가

commit 2cf1e8631902ecba0eb5c230aed24caddf7edacf
Author: Grayson1999 <bbt1250912@gmail.com>
Date:   Wed Oct 23 14:58:58 2024 +0900

    B라는 거대한 기능 추가로 커밋 메시지 변경

commit 18424c474a2139acd637fb0dbf71db0395456bb3 (grayson2)
Author: Grayson1999 <bbt1250912@gmail.com>
Date:   Wed Oct 23 15:57:56 2024 +0900

    feat: E라는 기능을 추가

commit 08a7b8f092e0d69123656caeadeaa0baf68996de
Author: Grayson1999 <bbt1250912@gmail.com>
Date:   Tue Oct 22 19:40:09 2024 +0900

    feat: A 기능 추가

주의할 점

  • 공유된 브랜치에서는 rebase를 피하는 것이 좋다. 다른 사람들이 사용하는 브랜치의 커밋 히스토리를 변경하면 혼란을 초래할 수 있다.

6.3 git cherry-pick

git cherry-pick은 특정 커밋만을 선택적으로 다른 브랜치에 적용하는 명령어이다. 즉, 여러 커밋 중에서 필요한 커밋만 골라서 가져와 현재 브랜치에 추가할 수 있다.

grayson: C - B - A
grayson2: D - E - A
$ git cherry-pick 18424
[grayson 062b025] feat: E라는 기능을 추가
 Date: Wed Oct 23 15:57:56 2024 +0900
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 E.txt
grayson: E - C - B - A

7. 원격 저장소와의 상호작용

7.1 git remote

원격 저장소를 추가한다.

$ git remote add origin 저장소URL
$ git remote -v
origin  https://github.com/grayson1999/git_test.git (fetch)
origin  https://github.com/grayson1999/git_test.git (push)

7.2 git push

로컬 브랜치의 변경 사항을 원격 저장소에 업로드한다.

$ git push origin 브랜치명
  • -u 옵션: 푸시할 때 로컬 브랜치를 원격 브랜치에 연결한다. 이후에는 git push만 입력해도 해당 브랜치로 자동으로 푸시된다.
$ git push -u origin grayson
...
 * [new branch]      grayson -> grayson
branch 'grayson' set up to track 'origin/grayson'.

7.3 git pull

원격 저장소의 변경 사항을 로컬로 가져와 병합한다.

$ git pull origin 브랜치명
$ git pull origin grayson
From https://github.com/grayson1999/git_test
 * branch            grayson    -> FETCH_HEAD

7.4 git clone

원격 저장소를 복제하여 로컬에 저장한다.

$ git clone 저장소URL

8. 되돌리기

8.1 git reset

특정 커밋으로 되돌리거나 스테이징된 파일을 취소한다.

$ git reset [option] 커밋ID
$ git reset 95e179ea96491b831ed4e4237499360e78ba22c6
Unstaged changes after reset:
D       E.txt
  • --soft: HEAD(커밋 기록)만 되돌리고, 스테이징 영역과 작업 디렉토리는 그대로 유지한다. 커밋만 되돌리고, 파일 수정 내용은 유지하고 싶을 때 사용한다.
  • --mixed (기본 옵션): HEAD와 스테이징 영역을 되돌리지만, 작업 디렉토리는 그대로 유지한다. 스테이징된 파일들을 다시 Unstaged 상태로 돌리고 싶을 때 사용한다.
  • --hard: HEAD, 스테이징 영역, 작업 디렉토리 모두 특정 커밋으로 되돌린다. 모든 변경 사항이 삭제된다. 작업 내용과 커밋 모두를 완전히 되돌리고, 모든 변경 사항을 삭제하고 싶을 때 사용한다.

8.2 git revert

이전 커밋을 되돌리는 새로운 커밋을 생성한다. 공유 브랜치에서 권장하는 방법이다.

$ git revert 커밋ID
commit bd46f25bd40142a088bd0f3a4b34f7805a8eeab0 (HEAD -> grayson2)
Author: Grayson1999 <bbt1250912@gmail.com>
Date:   Wed Oct 23 16:41:02 2024 +0900

    Revert "feat: E라는 기능을 추가"

    This reverts commit 062b02571da503137bf5e8b59f36f4fafa149254.

revert, reset 차이점

특성 git revert git reset
목적 커밋을 되돌리는 새로운 커밋을 추가 특정 커밋으로 히스토리 자체를 되돌림
히스토리 유지 여부 히스토리를 유지하고 되돌림 커밋을 추가 히스토리를 변경하며 되돌린 이후의 커밋을 제거
안전한 사용 환경 공유된 브랜치에서 안전하게 사용 가능 로컬 브랜치에서만 사용하는 것이 좋음
사용 옵션 단일 커밋을 되돌릴 때 사용 –soft, –mixed, –hard 옵션으로 다양한 되돌리기 가능
데이터 손실 가능성 손실 없음 –hard 사용 시 데이터 손실 가능

9. 기타 명령어

9.1 git tag

  1. 태그 추가하기

아래 명령어로 태그를 추가할 수 있다. 이 경우 HEAD가 가리키고 있는 커밋에 v0.1이라는 태그를 추가한다.

$ git tag v0.1

  1. 이전 태그와의 커밋 메시지 확인하기

git log 명령어를 사용하여 마지막 태그 이후의 커밋 메시지를 확인할 수 있다.

$ git log v0.1..HEAD --pretty=format:%s

  1. 특정 기능에 대한 커밋 확인하기

특정 태그에서 HEAD까지 원하는 을 찾아서 검색할 수 있다.

$ git log <last release>..HEAD --grep feat

9.2 git stash

작업 중인 변경 사항을 임시로 저장하고 워킹 디렉토리를 깨끗하게 유지한다.

사용 이유

  • 작업 도중에 브랜치를 전환해야 할 때
  • 작업 도중에 새로운 업데이트를 받아야 할 때
  • 변경 사항을 보존하면서 디렉토리를 초기 상태로 유지하고 싶을 때

동작 방법

  • 변경 사항 임시 저장:
$ git stash

Saved working directory and index state WIP on grayson2: bd46f25 Revert "feat: E라는 기능을 추가"
  • 임시 저장 목록 확인:
$ git stash list

stash@{0}: WIP on grayson2: bd46f25 Revert "feat: E라는 기능을 추가"
  • 임시 저장된 작업 복원:
$ git stash apply

On branch grayson2
    Changes not staged for commit:
      (use "git add/rm <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
            deleted:    D.txt

    no changes added to commit (use "git add" and/or "git commit -a")
  • 임시 저장된 작업 삭제:
$ git stash drop

Dropped refs/stash@{0} (67987ef47523125f4b0ac689d072facaaa8ecc69)

스태시에서 가장 최근에 저장한 내용을 삭제한다.

마무리

Git에서 사용하는 기본 명령어와 추가적인 명령어들을 정리해보았다. 이를 통해 Git의 전반적인 동작 과정을 이해할 수 있었다. 깊이 있는 공부는 아니었지만, 앞으로 이러한 기본 개념을 바탕으로 더 복잡한 기능들을 차근차근 공부해 나갈 예정이다.

위로 스크롤