Git 시작하기 2

Git 저장소 만들기

1. 기존 프로젝트를 Git 저장소로 만드는 방법

$ git init

이 명령은 .git이라는 하위 디렉토리를 만든다. .git 디렉토리에는 저장소에 필요한 뼈대 파일(Skeleton)이 들어 있다.

2. 다른 서버에 있는 저장소를 Clone하는 방법

  • 다른 프로젝트에 참여하거나
  • Git 저장소를 복사하고 싶을때 git clone 명령을 사용한다.
  • 서버에 있는 모든 데이터를 복사하고, 프로젝트 히스토리 전부를 받아온다.

git clone [url] 명령어로 저장소를 복사한다.

$ git clone git://github.com/schacon/grit.git

이 명령은 grit이라는 디렉토리를 만들고 그 안에 .git 디렉토리를 만든다.

저장소의 데이터를 모두 가져와서 자동으로 가장 최신 버전을 Checkout해 놓는다.

grit 디렉토리로 이동하면 Checkout으로 생성한 파일을 볼 수 있고 당장 하고자 하는 일을 시작할 수 있다.

# /grit/이 아니라 다른 디렉토리 이름 /mygrit/으로 Clone할 수 있다. 

$ git clone git://github.com/schacon/grit.git mygrit

3. Git은 다양한 프로토콜을 지원한다.

  • git:// git 프로토콜
  • https:// HTTP 프로토콜
  • user@server:/path.git 과 같은 SSH프로토콜도 가능

Git의 기초 - 수정하고 저장소에 저장하기

  • 프로젝트를 진행하는 워킹 디렉토리의 모든 파일은 크게 Tracked(관리대상임)Untracked(관리대상이 아님)로 나눈다.

  • Tracked 파일은 이미 스냅샷에 포함돼 있던 파일이다.

  • Tracked 파일은 또 Unmodified(수정하지 않음)Modified(수정함) 그리고 Staged(커밋으로 저장소에 기록할) 상태 중 하나이다.

  • 나머지 파일은 모두 Untracked 파일이다.

  • Untracked 파일은 워킹 디렉토리에 있는 파일 중 스냅샷에도 Staging Area에도 포함되지 않은 파일이다.

1. git status - 파일의 상태 확인하기

git status 명령어를 사용한다. Clone 한 후에 바로 이 명령을 실행하면 아래와 같은 메세지를 볼 수 있다.

$ git status
on branch is up-to-data with 'orgin/master'.
nothing to commit, working directory clean
  • 파일을 하나도 수정하지 않았다
  • TrackedModified 상태인 파일이 없다
  • 작업중인 기본 브랜치가 master 이다. 라는 것을 알 수 있다.

2. git add - 파일을 새로 추적하기

git add명령으로 파일을 추적한다.

# Git 은 README 파일을 추적한다
$ git add README

git status 명령을 실행하면 README 파일이 Tracked 상태이면서 Staged 상태라는 것을 확인할 수 있다

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   README
  • Changes to be committed 에 들어 있는 파일은 Staged 상태라는 것을 의미한다.
  • 이후에 커밋을 하게되면 git add를 실행한 시점의 파일이 커밋되어 저장소 히스토리에 남는다.

3. .gitignore - 특정 파일 무시하기

  • 어떤 파일은 Git에 자동으로 추가되거나 Untracked파일이라고 보여줄 필요가 없다.
  • 이럴때는 .gitignore파일을 만들고 그안에 무시할 파일 패턴을 적는다.
$ touch .gitignore
$ vi .gitignore
# [i] 입력 후 무시할 파일을 작성해 준다. 
# [:wq] -> 저장 후 닫기 

.gitignore파일에 입력하는 패턴의 예

$ cat .gitignore

# Custom -> 이 줄은 무시한다. 부연설명 같은 기능
.idea/  # .idea/ 디렉토리 아래의 모든 파일 무시
.config_secret/
secrets.tar
c.sh
.media/
.static_root/
!lib.a  # lib.a는 무시하지 않는다. 

# Front code
/front/  

# Created by https://www.gitignore.io/api/linux,macos,python,django,pycharm

### Django ###
*.log  # 확장자가 .log인 파일은 무시한다.
*.pot
*.pyc
__pycache__/ # __pycache__/ 디렉토리에 있는 모든 파일은 무시한다. 
local_settings.py
db.sqlite3
media

doc/*.txt  # `doc/notes.txt`같은 파일은 무시하고 doc/server/arch.txt같은 파일은 무시하지 않는다.

doc/**/*.txt   # `doc` 디렉토리 아래의 모든 .txt 파일을 무시한다.
  • .gitignore 파일은 보통 처음에 만들어 두는 것이 좋다. 그래서 Git 저장소에 커밋하고 싶지 않은 파일을 실수로 커밋하는 일을 방지 할 수 있다.

  • .gitignore 파일을 수정할 때는 주의해야 할 점이 실수로 파일명을 고치거나 삭제 했을때 민감한 정보가 담긴 파일이 순식간에 저장소에 커밋되어 올라 갈수 있다.

  • (해당 커밋을 삭제해도 히스토리는 남아서 시크릿키가 오픈되면 온갖 나라에 흩어져 있는 해커들의 밥이 될 수 있다. 잇힝 ㅠㅠ 경험담이다. )

4. git diff - 상태변경 내용 보기

  • git diff , 이 명령어는 워킹 디렉토리에 있는 것과 Staging Area에 있는 것을 비교한다. 그래서 수정하고 아직 Stage하지 않은 것을 보여 준다.

  • git diff --staged , 이 명령어는 저장소에 커밋한 것과 Staging Area에 있는 것을 비교한다.

5. git commit - 변경사항 커밋하기

  • git commit - 이 명령어를 실행하면 지정된 편집기가 실행되고 아래와 같은 내용을 표시한다.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#       new file:   README
#       modified:   benchmarks.rb
#
~
~
~
".git/COMMIT_EDITMSG" 10L, 283C
  • git commit -v 옵션을 추가하면 편집기에 diff 메세지도 추가된다.

  • git commit -m "------" 이 명령어로 커밋 메세지를 첨부할 수 있다.

$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
 2 files changed, 3 insertions(+)
 create mode 100644 README
  • master 브랜치에서 커밋했고, 체크섬은 463dc4f이다.
  • 수정한 파일과 삭제됐거나 추가된 줄이 몇 줄인지 알려준다.

6. git commit -a -m "00000" - Staging Area 생략하기

  • git commit 명령을 실행할 때 -a옵션을 추가하면 Git은 Tracked 상태의 파일을 자동으로 Staging Area에 넣는다. git add 명령을 대신한다.

7. git mv file_from file_to - 파일 이름 변경하기

$ git mv '파일이름1' '파일이름2'

# '파일이름1' -> '파일이름2' 로 바꿔준다

$ git mv README.txt README
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    README.txt -> README