이전에 Commit에 대한 글에서 이야기했듯, 작업 트리(Working tree)의 변경 이력을 저장소로 등록하려면 인덱스를 거쳐 commit해 줘야 합니다. 여기서의 저장소는 로컬 저장소로, 변경 이력을 원격 저장소에 적용하기 위해선 push라는 과정이 하나 더 필요합니다.

git status

만들어 두었던 저장소에 파일 하나를 추가하고, 콘솔에서 해당 디렉토리로 이동한 후 git status 명령어를 입력합니다.

$ touch sample.txt
$ git status
On branch master

No commits yet

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

    sample.txt

nothing added to commit but untracked files present (use "git add" to track)
$

git status 명령어는 현재 작업 트리의 상태를 보여줍니다. 여기서는 만들어진 sample.txt를 Untracked files로 분류하고 있습니다. 이전에 File status lifecycle에서 이야기했던 것처럼, 새로 만들어진 파일을 Git이 관리하게(Tracked로 변경) 하려면 파일을 index로 옮겨 한 번 커밋해 주어야 합니다.

git add [files ...]

$ git add sample.txt

git add 명령어를 입력하는 경우, 파일들은 수정 여부에 따라 Staged 상태로 변경됩니다.(Unmodified -> Staged는 불가능하기 때문) 다시 git status를 입력하면, 파일이 인덱스에 추가(staging)되었음을 확인할 수 있습니다.

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   sample.txt

참고로 현재 디렉토리 위치를 포함하여 하위의 모든 변경사항을 인덱스로 옮기려면 git add 뒤의 path를 와일드카드로 입력하면 됩니다.

$ git add .
$ git add directory/.
$ git add *
$ git add directory/*

git commit -m [message]

수정 사항을 인덱스로 옮겼으니 이제 정말로 commit하는 일만 남았습니다.

$ git commit -m "First commit!"

git commit에 들어갈 수 있는 옵션은 아래처럼 정말 많습니다.

git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
       [--dry-run] [(-c | -C | --fixup | --squash) <commit>]
       [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
       [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
       [--date=<date>] [--cleanup=<mode>] [--[no-]status]
       [-i | -o] [-S[<keyid>]] [--] [<file>…​]

필수로 들어가야 하는 건 위의 -m 옵션으로, 해당 커밋에 대한 메시지를 의미합니다. 메시지 없이는 커밋이 되지 않습니다. 이전 글에서 이야기했듯 하나의 커밋에는 40자리 hex로 이루어진 고유 이름이 붙습니다. 이렇게 새롭게 생성된 파일을 커밋하고 나면, Untracked 파일들이 Tracked가 되고, Unmodified 상태로 git의 관리를 받기 시작함과 동시에, Index에 존재하던 변경 이력들이 커밋 정보들과 함께 HEAD로 이동합니다.

Index 생략하기

커밋은 Staging area(Index)에 올라와 있는 변경 사항들을 대상으로 진행됩니다. Staging area는 커밋할 파일을 정리한다는 점에서 매우 유용하지만 복잡하기만 하고 필요하지 않은 때도 있습니다. git commit 명령에 -a 옵션을 추가하면, Tracked&Modified 상태의 파일을 자동으로 Staging Area에 넣어 커밋합니다. 그래서 git add 명령을 실행하는 수고를 덜 수 있습니다.

$ git commit -a "Commit!"

'Git 레거시 글' 카테고리의 다른 글

[Git] 원격 저장소에 Push하기  (3) 2018.05.21
[Git] 원격 저장소 만들기  (0) 2018.05.20
[Git] 로컬 저장소 만들기  (0) 2018.05.18
[Git] 설치와 초기 설정  (0) 2018.05.17
[Git] 작업 트리와 인덱스  (0) 2018.05.16

Git의 로컬 저장소를 만드는 방법은 두 가지입니다. 기존 프로젝트를 Git 저장소로 만드는 방법이 있고 다른 서버에 있는 원격 저장소를 Clone하는 방법이 있습니다.

기존 프로젝트를 Git 저장소로 만들기

기존 프로젝트를 Git으로 관리하고 싶을 때, 프로젝트의 디렉토리로 이동해서 아래과 같은 명령을 실행합니다.

$ git init
Initialized empty Git repository in /Users/mingyu/Desktop/test/.git/

이 명령은 .git이라는 하위 디렉토리를 숨겨진 채로 만듭니다. .git 디렉토리에는 저장소에 필요한 뼈대 파일이 들어 있습니다. 이 명령만으로는 git이 아직 프로젝트의 어떤 파일도 관리하지 않습니다(모두 Untracked 상태이므로). working tree의 파일을 index로 스테이징하고, commit하는 과정이 필요합니다.

원격 저장소를 clone하기

원격 서버에 이미 존재하는 Git 저장소를 복사하고 싶을 때 git clone 명령을 사용합니다. git clone을 실행하면 프로젝트 히스토리를 전부 받아옵니다. 그래서 서버의 디스크가 망가져도 클라이언트 저장소 중에서 아무거나 하나 가져다가 복구하면 됩니다. Git도 오픈 소스로 관리되고 있으니, git 프로젝트를 clone해 보겠습니다.

$ git clone https://github.com/git/git.git

이 명령은 git이라는 디렉토리를 만들고 .git이라는 하위 디렉토리를 숨겨진 채로 만듭니다. 그리고 저장소의 데이터를 모두 가져와서, 자동으로 코드를 히스토리 중 가장 최신 상태로 만들어 둡니다. 아래와 같이 clone에 옵션을 주면, 다른 디렉토리 이름으로 clone할 수 있습니다.

$ git clone https://github.com/git/git.git mygit

init과 clone의 차이

git init기존 프로젝트에 git을 초기화하는 명령으로, 로컬 저장소가 생기며 원격 저장소에 대한 정보(remote)는 없습니다. 반대로 git clone원격 저장소의 정보를 불러와 로컬 저장소를 생성하는 것이므로 원격 저장소에 대한 정보가 있습니다. 따라서 remote -v 명령으로 현재 프로젝트에 등록된 원격 저장소를 확인해 보면, 실제로 origin이라는 이름의 remote가 자동으로 등록되어 있습니다.

$ git remote -v
origin    https://github.com/git/git.git (fetch)
origin    https://github.com/git/git.git (push)

따라서 git init으로 저장소를 만들게 되면, git remote를 이용해 원격 저장소에 대한 정보를 설정해 주어야 합니다. [Git] 원격 저장소 만들기에서 remote 설정에 대해 알아볼 수 있습니다.

'Git 레거시 글' 카테고리의 다른 글

[Git] 원격 저장소 만들기  (0) 2018.05.20
[Git] 로컬 저장소에 Commit하기  (0) 2018.05.19
[Git] 설치와 초기 설정  (0) 2018.05.17
[Git] 작업 트리와 인덱스  (0) 2018.05.16
[Git] 커밋(Commit)  (0) 2018.05.15

저장소, 커밋, 작업 트리와 인덱스 개념을 알았으니 이제 실제로 Git을 설치하고 초기 설정을 진행해 봅시다. Git bash를 사용하도록 하겠습니다.

Mac에서 설치

Mac이라면 Homebrew를 통해 간편하게 설치할 수 있습니다.

> brew install git

Windows에서 설치

Git for Windows를 설치합니다.

git config

이제 git bash를 열고, git의 사용 환경을 적절하게 설정해 주도록 합시다. git config라는 명령어를 사용합니다. Git은 이 설정에 따라 동작하고, 이때 사용하는 설정 파일은 세 가지나 됩니다.

  • /etc/gitconfig : 시스템의 모든 사용자와 모든 저장소에 적용되는 설정입니다. git config --system 옵션으로 이 파일을 읽고 쓸 수 있다.
  • ~/.gitconfig : 특정 사용자에게만 적용되는 설정입니다. git config --global 옵션으로 이 파일을 읽고 쓸 수 있습니다.
  • .git/config : 이 파일은 Git 디렉토리에 있고 특정 저장소(혹은 현재 작업 중인 프로젝트)에만 적용됩니다. 이와 같은 각 설정의 우선순위는 역순이며, 따라서 .git/config가 /etc/gitconfig보다 우선됩니다.

윈도우용 Git은 $HOME 디렉토리(%USERPROFILE% 환경변수)에 있는 .gitconfig 파일을 찾습니다. 보통 C:\Documents and Settings\%USERNAME% 또는 C:\Users\%USERNAME%입니다.

가장 먼저 해야 하는 것은 사용자 이름과 이메일 주소를 설정하는 것입니다. Git은 매 커밋마다 이 정보를 사용하고, 한 번 커밋한 후에는 정보를 변경할 수 없습니다. Github과 같은 Git 호스팅 서비스에 가입되어 있다면 해당 정보를 사용하고, 아직 가입하지 않았다면 나중에라도 필요할 때가 올테니, 가입해 두시기 바랍니다.

> git config --global user.name "JoMingyu"
> git config --global user.email "city7310@naver.com"

--global 옵션으로 설정한 것은 딱 한 번만 하면 됩니다. 해당 시스템에서 해당 사용자가 사용할 때에는 global 정보를 사용합니다. 만약 프로젝트마다 다른 이름과 이메일 주소를 사용하고 싶으면 --global 옵션을 빼고 명령을 실행하면 됩니다. git config --list 명령을 실행하면 설정한 모든 것들을 보여줍니다.

> git config --list
credential.helper=osxkeychain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
user.name=JoMingyu
user.email=city7310@naver.com


'Git 레거시 글' 카테고리의 다른 글

[Git] 로컬 저장소에 Commit하기  (0) 2018.05.19
[Git] 로컬 저장소 만들기  (0) 2018.05.18
[Git] 작업 트리와 인덱스  (0) 2018.05.16
[Git] 커밋(Commit)  (0) 2018.05.15
[Git] 저장소(repository)  (0) 2018.05.14

+ Recent posts