ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 왕초보를 위한 Git 명령어 모음집 (1)
    IT 이야기 2024. 2. 2. 10:00

    이 글을 읽는 법

    Git에는 수많은 명령어가 있습니다. 이번 글에서는 개발 팀에 입사한 초보 개발자가 협업하면서 겪게 될 시나리오를 토대로 다음과 같은 Git 명령어를 정리합니다:

    • Git 최초 설정: git config
    • 로컬 저장소와 원격 저장소의 개념 이해하기: git init, git clone, git remote, git push, git fetch, git pull
    • 로컬 저장소의 세 가지 단계: git status, git add, git commit, git diff, git restore, git reset, git stash
    • 커밋과 브랜치의 개념 이해하기: git switch, git merge, git cherry-pick
    • 커밋 로그 그래프로 원하는 커밋 검색하기: git log, git show, git config alias.*, git checkout

    각 섹션은 다음과 같은 흐름으로 진행됩니다:

    • 학습 목표: 어떤 목표를 달성할 수 있는지 설명합니다.
    • 사전 지식: 명령어를 실습하기 전에 필요한 사전 지식을 설명합니다.
    • 명령어 실습: Git 명령어를 실습합니다.
    • 문제 풀이: 실습한 명령어를 활용하여 문제를 풀어봅니다.

    목차

    왕초보를 위한 Git 명령어 모음집 1탄

    1. Git 최초 설정
    2. 로컬 저장소와 원격 저장소의 개념 이해하기
    3. 로컬 저장소의 세 가지 단계
    왕초보를 위한 Git 명령어 모음집 2탄

    1. 커밋과 브랜치의 개념 이해하기
    2. 커밋 로그 그래프로 원하는 커밋 검색하기

     

    1. Git 최초 설정

    Git을 설치하고 나면 사용 환경을 설정할 수 있습니다. 한 번 설정하면 Git은 이 설정에 따라 동작합니다.

    학습 목표

    • Git을 처음 설치하고 나서 사용자 이름과 이메일을 설정할 수 있습니다.
    • 개인 프로젝트에 적용되는 설정과 회사 프로젝트에 적용되는 설정을 구분해서 설정할 수 있습니다.

    사전 지식

    Git의 설정 파일은 적용되는 범위에 따라 세 가지로 나뉩니다:

    • system: 시스템 전체에 적용되는 설정 파일입니다. /etc/gitconfig 파일에 저장됩니다.
    • global: 현재 사용자에게만 적용되는 설정 파일입니다. ~/.gitconfig 파일에 저장됩니다.
    • local: 현재 작업 중인 저장소에만 적용되는 설정 파일입니다. .git/config 파일에 저장됩니다.

    Git은 설정 파일을 읽을 때 가장 넓은 범위에서 가장 좁은 범위로, 즉 system, global, local 순으로 불러옵니다. 같은 설정이 여러 파일에 존재할 경우, 좁은 범위의 설정이 우선 적용됩니다. 예를 들어, global 설정 파일에 user.name 설정이 있더라도, local 설정 파일에 같은 user.name 설정이 있다면, local 설정 파일의 user.name 설정이 적용됩니다.


    명령어 실습

    Git을 처음 설치하고 나서 사용자 이름과 이메일을 설정합니다:

    $ git config --global user.name datalater
    
    $ git config --global user.email the7mincheol@gmail.com

    만약 이름에 공백 문자열이 있을 경우 따옴표로 감싸야 합니다(예: "Min Cho"). 이메일을 설정할 때는 GitHub 계정에 등록한 이메일을 사용하는 것을 권장합니다. GitHub에서 커밋을 보여줄 때 커밋에 기록된 이메일 주소를 토대로 GitHub 프로필 사진을 표시합니다.

    설정한 내용을 확인합니다:

    $ git config --global --get user.name
    datalater
    
    $ git config --global --get user.email
    the7mincheol@gmail.com


    문제 풀이

    Q. 기존에 사용자 이름을 datalater로 사용하고 있었는데, 새로운 회사에 입사하여 영어 이름 Min을 쓰게 되었습니다. 회사 프로젝트에서 작업 후 커밋을 해보니 커밋 작성자 이름이 datalater로 나옵니다. 개인 프로젝트에서는 datalater를 그대로 사용하고, 회사 프로젝트에서는 Min으로 바꾸고 싶습니다. 어떻게 하면 될까요?

    A. local 스코프 옵션을 넣어서 새로운 사용자 이름을 설정하면 됩니다:

    $ cd ~/grepp/company-project
    
    $ git config --get user.name
    datalater
    
    $ git config --local user.name Min
    
    $ git config --get user.name
    Min

    Q. 현재 프로젝트에 적용되는 모든 Git 설정을 한번에 확인하고 싶어요. 어떻게 하면 되나요?

    A. 다음 옵션을 함께 사용하면 됩니다:

    $ git config --list --show-origin --show-scope
    system  file:/opt/homebrew/etc/gitconfig        credential.helper=osxkeychain
    global  file:/Users/cheo/.gitconfig     user.email=the7mincheol@gmail.com
    global  file:/Users/cheo/.gitconfig     user.name=datalater
    local   file:.git/config        user.name=Min
    ...
    • --list: 모든 설정을 출력합니다.
    • --show-origin: 설정이 저장된 파일의 경로를 출력합니다.
    • --show-scope: 설정이 적용되는 범위를 출력합니다.

    Q. 설정 파일을 코드 에디터에서 편집하고 싶어요. 어떻게 하면 되나요?

    A. --edit 옵션을 사용하세요. 또는 Vim이나 VS Code 같은 에디터로 직접 파일을 열어서 편집해도 됩니다:

    $ git config --global --edit
    
    $ vi ~/.gitconfig
    $ code .git/config


    2. 로컬 저장소와 원격 저장소의 개념 이해하기

    내 컴퓨터에서 Git으로 버전 관리를 하는 저장소를 로컬 저장소(local repository)라고 합니다. 원격 저장소(remote repository)는 인터넷이나 다른 네트워크 상에 위치한 Git 저장소를 말하며, 여러 개발자가 공유하여 협업할 수 있는 저장소입니다.

    학습 목표

    • 로컬 저장소를 만들 수 있습니다.
    • 로컬 저장소와 원격 저장소를 연결할 수 있습니다.
    • 로컬 저장소에서 작업한 내용을 원격 저장소에 업로드할 수 있습니다.
    • 원격 저장소의 내용을 로컬 저장소로 내려받을 수 있습니다.

    사전 지식

    Git 저장소를 만드는 방법은 두 가지가 있습니다:

    • git init: 아직 버전 관리를 시작하지 않은 디렉토리를 Git 저장소로 만듭니다.
    • git clone: 이미 존재하는 원격 저장소를 로컬 저장소로 복제합니다.

    로컬 저장소와 원격 저장소는 git remote 명령어를 통해 연결됩니다. git pushgit fetch 명령어는 각각 로컬 저장소의 내용을 원격 저장소에 업로드하고, 원격 저장소의 내용을 로컬 저장소로 내려받습니다.


    명령어 실습

    혼자 사이드 프로젝트를 진행하기 위해 새로운 디렉토리를 만들고, 해당 디렉토리를 Git 저장소로 만듭니다:

    $ md side-project && cd side-project
    
    $ git init

    Git 저장소가 잘 만들어졌는지 어떻게 알 수 있을까요? .git 디렉토리가 존재하는지 확인하면 됩니다. .git 디렉토리는 Git이 프로젝트 버전 관리에 필요한 모든 정보를 저장하는 데이터베이스입니다. 따라서 모든 Git 저장소에는 .git 디렉토리가 필수적으로 존재합니다.

    $ ls .git
    ./           FETCH_HEAD   HEAD         description  info/        refs/
    ../          FETCH_LOG    config       hooks/       objects/

    출력된 내용 중에 config 파일이 보이시나요? .git 디렉토리 내부에 있는 config 파일이 이전 섹션에서 학습했던 로컬 스코프 설정 파일입니다.

    이제 로컬 저장소를 원격 저장소와 연결하겠습니다. 원격 저장소를 만드는 방법은 GitHub에서 새 저장소를 만드는 URL에 접속하거나 Pro Git 문서 - GitHub 프로젝트 관리하기를 참고해주세요.

    이 글에서 다루는 원격 저장소(datalater/side-project)는 가상의 예시입니다. 직접 만들어서 실습해보세요.

    $ git remote add origin https://github.com/datalater/side-project.git

    origin은 로컬 저장소에서 원격 저장소를 참조하는 이름입니다. 원격 저장소를 가리킬 때 주소 전체를 입력할 필요 없이 origin이라는 이름으로 간단하게 참조할 수 있습니다.

    이제 작업을 추가해서 원격 저장소에 업로드하겠습니다:

    $ touch README.md && echo "Hello, world" > README.md
    
    $ git add README.md
    
    $ git commit -m "Add README.md"
    
    $ git push -u origin main
    • git add <file>: <file>을 스테이지에 추가합니다.
    • git commit -m <message>: -m 옵션을 사용해서 커밋 메시지를 입력합니다.
    • git push -u <remote> <branch>: 로컬 저장소에서 작업한 내용을 원격 저장소에 업로드합니다.

    git push -u origin main 명령어에서 -u(=--set-upstream) 옵션은 현재 push 하려는 로컬 저장소의 main 브랜치가 원격 저장소의 main 브랜치를 추적(upstream tracking)하도록 하는 설정입니다. 이 설정을 한 번 해두면 추후 git pushgit pull을 실행할 때 원격 브랜치의 이름을 명시하지 않아도 됩니다. Git이 자동으로 현재 브랜치와 연결된 원격 브랜치를 찾아 사용합니다.

    참고로 원격 저장소 추적 설정을 하지 않은 브랜치에서 git push 또는 git pull과 같이 <remote><branch>를 설정하지 않고 실행하면 다음과 같은 에러 메시지가 출력됩니다:

    $ git switch -c new-branch
    
    $ git push
    fatal: 현재 브랜치 new-branch에 업스트림 브랜치가 없습니다.
    현재 브랜치를 푸시하고 해당 리모트를 업스트림으로 지정하려면
    다음과 같이 하십시오.
    
        git push --set-upstream origin new-branch

    이제 원격 저장소에 다시 가보면 새로 작성한 README 파일이 업로드된 것을 확인할 수 있습니다. 참고로 add 명령어로 스테이지에 추가하는 것과 commit 명령어로 .git 디렉토리에 저장하는 것이 어떤 의미인지는 다음 섹션에서 다루겠습니다.

    이번에는 이미 만들어진 원격 저장소를 클론해서 로컬 저장소를 만들겠습니다.

    $ git clone https://github.com/datalater/main-project.git
    $ cd main-project

    마찬가지로 .git 디렉토리가 존재하는 것을 확인할 수 있습니다.

    $ ls .git

    클론한 저장소는 원격 저장소에서 가져왔기 때문에 git remote 설정을 하지 않더라도 이미 연결되어 있습니다. git remote 명령어로 확인해보겠습니다:

    $ git remote -v
    origin    https://github.com/datalater/main-project.git (fetch)
    origin    https://github.com/datalater/main-project.git (push)
    • -v: --verbose 옵션의 약어로 원격 저장소의 주소까지 포함해서 정보를 더 자세하게 출력합니다.

    참고로 Git 명령어의 옵션에 관한 도움말은 git <명령어> --help 또는 git <명령어> -h 명령어를 입력하면 확인할 수 있습니다. 명령어를 배울 때 도움말을 적극 활용해보세요. 빠르게 숙달될 수 있습니다.

    현재 상태에서 추가 작업을 하고 git push 명령어를 실행하면 작업한 내용이 원격 저장소에 업로드됩니다.

    $ touch README.md && echo "Hello, world" > README.md
    
    $ git add README.md
    
    $ git commit -m "Add README.md"
    
    $ git push -u origin main

    원격 저장소에 업데이트된 내용을 로컬 저장소로 내려받으려면 git fetch 명령어를 사용하면 됩니다.

    $ git fetch

    그런데 git fetch를 실행해도 현재 작업 폴더에는 업데이트가 반영되지 않습니다. 왜냐하면 git fetch 명령어는 원격 저장소의 내용을 로컬 저장소의 .git 디렉토리에 내려받기만 하고, 현재 작업 폴더에는 반영하지 않기 때문입니다. 원격 저장소의 내용을 현재 작업 폴더에 반영하려면 git fetch 이후에 git merge 명령어를 실행하면 됩니다:

    $ git merge origin/main

    git fetchgit merge 명령어는 원격 저장소의 내용을 로컬 작업 폴더에 반영할 때 함께 쓰이는데, 이 둘을 한 번에 처리하는 명령어가 바로 git pull 명령어입니다.

    $ git pull

    git fetchgit pull 명령어의 차이점을 다시 정리하겠습니다. git fetch 명령어는 원격 저장소의 내용을 로컬 저장소의 .git 디렉토리에 저장하는 것만 하기 때문에 작업 폴더에는 반영되지 않고, git pull 명령어는 원격 저장소의 내용을 로컬 저장소의 작업 폴더에 반영하는 것까지 한번에 수행합니다.

    문제 풀이

    Q. 오픈 소스로 공개된 블로그 템플릿 프로젝트를 사용해서 개인 블로그를 만들려고 합니다. 템플릿에서 몇 가지 기능을 수정할 것이기 때문에 개인 원격 저장소에서 작업할 예정입니다. 그런데 개인 작업은 별도로 진행하더라도 오픈 소스 프로젝트에서 추가되는 기능이나 버그 해결 업데이트는 개인 저장소에 반영하고 싶습니다. 어떻게 하면 될까요?

    A. 하나의 로컬 저장소에서 두 개의 원격 저장소(원본 원격 저장소 및 개인 원격 저장소)를 연결하면 됩니다.

    $ git clone https://github.com/shuding/nextra.git
    
    $ git remote -v
    origin    https://github.com/shuding/nextra.git (fetch)
    origin    https://github.com/shuding/nextra.git (push)
    
    $ git remote rename origin upstream
    $ git remote add origin <개인 원격 저장소 주소>
    • git clone으로 원본 원격 저장소를 로컬 저장소로 복제합니다.
    • git remote -v 명령어로 현재 연결된 원격 저장소 정보를 확인합니다.
    • git remote rename <기존 이름> <새 이름> 명령어로 기존 원격 저장소의 이름을 upstream으로 변경합니다.
    • git remote add <원격 저장소 이름> <원격 저장소 주소> 명령어로 개인 원격 저장소를 추가합니다.

    이제 원본 저장소는 upstream이라는 이름으로, 개인 저장소는 origin이라는 이름으로 연결되었습니다. 오픈 소스 프로젝트의 업데이트를 내려받아서 개인 원격 저장소에 반영하는 방법은 다음과 같습니다:

    $ git fetch upstream
    $ git merge upstream/main
    $ git push origin main

    개인 작업을 업로드하는 방법은 다음과 같습니다:

    $ git add
    $ git commit
    $ git push origin main

    Q. 로컬에서 작업하던 원격 저장소가 삭제되어 fork가 불가능한 상황입니다. 로컬에서 작업하던 저장소를 개인 원격 저장소로 백업하고 싶습니다. 어떻게 하면 될까요?

    A. git remote 명령어로 개인 원격 저장소를 추가해서 업로드하면 됩니다.

    $ git remote add backup https://github.com/datalater/backup.git
    $ git push backup main

    Q. 현재 작업 중인 브랜치의 내용은 변경하지 않고 원격 저장소에 업로드된 브랜치를 로컬 저장소로 가져오고 싶습니다. 어떻게 하면 될까요?

    A. git fetch 명령어를 실행하면 됩니다.

    $ git branch -r
    origin/HEAD -> origin/main
    origin/main
    
    $ git fetch
    
    $ git branch -r
    origin/HEAD -> origin/main
    origin/main
    origin/new-remote-branch
    
    $ git switch new-remote-branch
    • git branch -r: -r 옵션(=--remotes)을 사용하면 원격 저장소의 브랜치 목록을 확인할 수 있습니다.
    • git fetch: 원격 저장소의 내용을 로컬 저장소로 내려받습니다. 이때 원격 저장소에 새로 추가된 브랜치도 함께 내려받습니다.
    • git switch <branch>: <branch> 브랜치로 이동합니다.

    Q. 원격 저장소에 업로드한 작업 브랜치를 삭제하고 싶습니다. 어떻게 하면 될까요?

    A. git push origin --delete <branch> 명령어를 실행하면 됩니다.

     

    3. 로컬 저장소의 세 가지 단계

    Git은 로컬 저장소의 파일을 세 가지 단계로 나눠서 관리합니다. 작업 폴더(Working Directory), 스테이지(Staging Area), .git 디렉토리(Git Directory)입니다. 세 가지 단계를 이해하면 버전 관리 흐름이 어떻게 진행되는지 이해할 수 있습니다.

    학습 목표

    • 작업 폴더의 파일을 수정하고, 스테이지에 추가하고, 커밋할 수 있습니다.
    • 현재 버전 관리 상태를 확인할 수 있습니다.
    • 각 단계에서 변경한 내용을 확인할 수 있습니다.
    • 각 단계에서 변경한 내용을 취소할 수 있습니다.

    사전 지식

    Git은 로컬 저장소의 파일을 세 가지 단계로 나눠서 관리합니다:

    • 작업 폴더(Working Directory): 로컬 저장소의 실제 파일이 위치하는 디렉토리입니다.
    • 스테이지(Staging Area): 커밋할 파일을 추가하는 공간입니다.
    • .git 디렉토리(Git Directory): 커밋이 완료되어 스냅샷이 저장되는 데이터베이스 공간입니다.

    즉, 파일을 수정하고 바로 저장하는 게 아니라 Git은 중간에 스테이지 영역을 두고 스테이지를 거쳐서 커밋하도록 합니다.

    왜 그렇게 할까요? 스테이지 영역이 없는 경우를 생각해보겠습니다:

    스테이지 영역이 없다면 자동으로 모든 변경 사항이 커밋 대상이 됩니다. 결국 모든 변경을 저장하거나 또는 모두 저장하지 않거나(all or nothing) 둘 중에 하나인 상황이 됩니다. 이렇게 되면 여러 파일을 수정했지만 일부만 커밋하고 싶은 경우 대응이 어렵습니다. 또한 불필요하거나 임시 파일 등이 커밋에 포함될 위험도 있습니다.

    반면에 스테이지 영역을 두면 개발자가 변경한 파일 중에서 커밋하고 싶은 부분을 선택적으로(selective) 정할 수 있습니다. 이렇게 되면 여러 작업을 한꺼번에 하더라도 각각 목적이 다른 변경 사항을 분리해서 따로 커밋할 수 있습니다. 이러한 과정은 변경 사항을 더욱 명확하게 조직화하고, 관련된 변경끼리 모아 커밋을 만들어서 프로젝트 이력을 깔끔하게 정리하는 데 도움을 줍니다. 또한 변경 사항을 스테이지 영역에 추가하기 전에 개발자가 세심하게 검토하는 기회가 생겨서 커밋의 품질을 자연스럽게 높이도록 유도합니다.

    명령어 실습

    기존에 존재하던 README 파일을 수정하겠습니다.

    $ echo "Hello, world" >> README.md
    
    $ git status
    커밋하도록 정하지 않은 변경 사항:
      (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오)
      (use "git restore <file>..." to discard changes in working directory)
        수정함:        README.md

    git status 명령어를 실행하면 현재 버전 관리 상태를 확인할 수 있습니다. 출력된 메시지를 보면 git add 명령어와 git restore 명령어가 언급되어 있습니다. git add 명령어는 작업 폴더의 변경 사항을 스테이지에 추가할 때 사용합니다. git restore 명령어는 작업 폴더에 있는 변경 사항을 취소할 때 사용합니다. git restore --staged 옵션을 붙이면 스테이지에 추가한 변경 사항을 취소합니다.

    git add 명령어로 스테이지 영역에 추가하기 전에 어떤 변경이 있는지 확인하려면 git diff 명령어를 실행합니다:

    $ git diff
    diff --git a/README.md b/README.md
    index 27acc27c..6fd867bc 100644
    --- a/README.md
    +++ b/README.md
    @@ -51,3 +51,4 @@ Any change to example/docs will be re-rendered instantly.
    
     If you update the core or theme packages, a rebuild is required. Or you can use
     the watch mode for both nextra and the theme in separated terminals.
    +Hello, world

    diff 출력에서 + 기호가 붙은 줄은 새롭게 추가된 코드 줄입니다. 삭제된 코드 줄은 - 기호로 표시됩니다.

    변경 사항을 검토했으니 README 파일을 스테이지에 추가하겠습니다:

    $ git add README.md
    
    $ git status
    커밋할 변경 사항:
      (use "git restore --staged <file>..." to unstage)
        수정함:        README.md

    git add 실행 후 git status 명령어의 출력 메시지가 바뀌었습니다. 이전에 보았던 것처럼 변경 사항을 취소할 수 있는 방법을 알려줍니다. 현재는 스테이지 영역에 추가되었으니 git restore --staged 옵션을 붙여서 사용하면 됩니다.

    커밋하기 전에 스테이지에 추가된 변경 사항을 확인해보겠습니다:

    $ git diff --staged
    diff --git a/README.md b/README.md
    index 27acc27c..6fd867bc 100644
    --- a/README.md
    +++ b/README.md
    @@ -51,3 +51,4 @@ Any change to example/docs will be re-rendered instantly.
    
     If you update the core or theme packages, a rebuild is required. Or you can use
     the watch mode for both nextra and the theme in separated terminals.
    +Hello, world

    참고로 --staged 옵션 대신 --cached 옵션을 사용해도 동일하게 확인할 수 있습니다.

    README 파일을 커밋하겠습니다:

    $ git commit -m "Update README.md"
    
    $ git status
    커밋할 사항 없음, 작업 폴더 깨끗함

    git status 명령어를 실행하면 커밋할 사항이 없고 작업 폴더가 깨끗하다고 합니다. Git이 감지하는 변경 사항이 없다는 뜻입니다.

    그런데 커밋을 완료한 이번에는 git status 출력 메시지에서 취소할 수 있는 방법을 알려주지 않네요. 작업 폴더나 스테이지에 실수로 추가한 경우 restore 명령어로 취소할 수 있었습니다. 커밋한 내용은 어떻게 취소할 수 있을까요?

    $ git reset --soft HEAD~
    • git reset <target-commit>: reset 명령어는 현재 커밋되어 있는 프로젝트를 <target-commit>의 스냅샷 상태로 변경하라는 명령어입니다.
    • git reset <mode> <target-commit>: 위에서 설명했던 것처럼 현재 프로젝트를 현재 커밋에서 <target-commit> 상태로 변경합니다. 그런데 현재 커밋과 <target-commit> 사이에 있는 변경 사항은 어떻게 처리해야 할까요? 이러한 변경 사항을 아예 삭제할지, 작업 폴더에 남길지, 스테이지에 남길지 결정하는 것이 <mode>입니다.
    • HEAD~: ~(틸드)는 부모 커밋을 의미합니다. 즉 HEAD~HEAD의 부모 커밋을 의미하므로 HEAD의 이전 커밋을 의미합니다. HEAD~2HEAD의 부모의 부모 커밋을 의미하므로 HEAD의 두 단계 이전 커밋을 의미합니다.

    위 명령어에서 --soft 모드는 현재 커밋에 등록된 변경을 스테이지 단계로 내리라는 뜻입니다. --mixed 모드는 현재 커밋에 등록된 변경을 작업 폴더로 내리라는 뜻입니다. --hard 모드는 현재 커밋에 등록된 변경을 작업 폴더에서 완전히 삭제하라는 뜻입니다. 즉, 프로젝트 버전을 이전 커밋 상태로 완전히 되돌립니다.

    특정 변경을 커밋한 후에 아래 명령어를 각각 실행해보면 차이점을 확인할 수 있습니다.

    $ git reset --soft HEAD~
    
    $ git reset --mixed HEAD~
    
    $ git reset --hard HEAD~

    아직 커밋하지 않은 사항을 삭제하지 않고, 임시로 어딘가에 저장하고 싶다면 git stash 명령어를 사용하면 됩니다. git stash 명령어는 커밋하지 않은 변경 사항을 임시로 보관합니다. Git의 stash는 스택(stack) 구조를 가지고 있습니다. LIFO(Last-In First-Out) 방식에 따라 최근에 보관한 변경 사항을 가장 먼저 꺼냅니다.

    git stash list 명령어로 현재 스택에 저장된 변경 사항을 확인할 수 있고, git stash pop 명령어를 사용하면 스택에 저장된 변경 사항을 다시 작업 폴더로 가져올 수 있습니다.

    $ echo "Temporary Hello" >> README.md
    
    $ git status -s
    M  README.md

    git status 명령어에 -s 옵션을 넣으면 현재 버전 관리 상태를 짧은 형식(short formats)으로 출력합니다. M은 수정된 파일(Modified)을 나타내는 표시입니다. 더 많은 표시에 관해서는 Pro Git 문서 - git status를 참고하세요.

    git stash는 작업 폴더 또는 스테이지에 있는 변경 사항을 임시로 보관합니다. 명령어 실행 후 출력되는 메시지를 보면 working directory and index state WIP라고 나옵니다. WIP는 Work In Progress의 약어로, 작업 중인 내용을 의미합니다.

    $ git stash
    Saved working directory and index state WIP on ...
    
    $ git status -s

    작업 폴더에 있던 변경 사항이 사라졌으므로 git status -s 명령어를 실행하면 아무것도 출력되지 않습니다.

    git stash pop 명령어를 실행하면 임시 보관한 내용을 다시 가져옵니다.

    $ git stash pop
    
    $ git status -s
    M  README.md


    문제 풀이

    Q. 실험을 하기 위해 여기저기 디버깅 코드를 추가했다가 실험이 끝나서 이전 커밋 상태로 깨끗하게 되돌리고 싶습니다. 어떻게 하면 될까요?

    A. git reset --hard HEAD 명령어를 실행하면 됩니다.

    Q. 수정한 파일뿐만 아니라 새로 추가한 파일도 stash 하고 싶습니다. 어떻게 하면 될까요?

    A. git stash -u 명령어를 실행하면 됩니다. -u 옵션은 --include-untracked 옵션의 약어로, 지금까지의 커밋 이력에 존재하지 않아서 추적하지 않고 있는 파일(untracked)도 stash에 추가합니다.

    글 작성: 조민철(Grepp 프론트엔드 개발자)
    편집자: Tami


    왕초보를 위한 Git 명령어 모음집 1탄이 도움되셨다면 2탄도 확인해 보세요!
    👉 2탄 바로가기

     

    댓글

Programmers