skip navigation

기본 개념

01. Git을 사용하면 가능한 것

  • - 소스코드 주고받기가 필요 없고, 같은 파일을 여려 명이 동시에 작업하는 등 병렬 개발이 가능해지며, 버전 관리가 용이해져 생산성이 증가한다.

  • - 소스코드의 수정 내용이 커밋 단위로 관리되고, 패치 형식으로 배포할 수 있기 때문에 프로그램의 변동 과정을 체계적으로 관리할 수 있고, 언제든지 지난 시점의 소스코드로 점프(Checkout)할 수 있다.

  • - 새로운 기능을 추가하는 개발을 할 경우, 브랜치를 통해 충분히 실험을 한 뒤 본 프로그램에 합치는 방식(Merge)으로 개발을 진행할 수 있다.

  • - '분산' 버전관리이기 때문에, 인터넷이 연결되지 않은 곳에서도 개발을 진행할 수 있으며, 중앙 저장소가 폭파되어도 다시 원상복구할 수 있다.

  • - 팀 프로젝트가 아닌, 개인 프로젝트일지라도 Git을 통해 버전 관리를 하면 체계적인 개발이 가능해지고, 프로그램이나 패치를 배포하는 과정도 간단해진다. (Pull을 통한 업데이트, Patch 파일 배포)

02. Git 관련 주요 용어

  • - Repository(저장소) : 저장소란 말그대로 파일이나 폴더를 저장해 두는 곳이며 Git 저장소가 제공하는 좋은 점 중 하나는 파일이 변경 이력 별로 구분되어 저장된다는 점이다.
    비슷한 파일이라도 실제 내용 일부 문구가 서로 다르면 다른 파일로 인식하기 때문에 파일을 변경 사항 별로 구분해 저장할 수 있다.

  • - Woriking Tree(작업트리) : Git 에서는 우리가 흔히 말하는 폴더를 '작업 트리'(Work Tree)라고 부른다.

  • - StagingArea(인덱스) : 작업한 내용이 올라가는 임시 저장 영역이다. 이 영역을 이용하여 작업한 내용 중 커밋에 반영할 파일만 선별하여 커밋을 수행할 수 있다. Git의 '커밋' 작업은 '작업 트리'에 있는 변경 내용을 저장소에 바로 기록하는 것이 아니라 그 사이 공간인 'Stainging Area(인덱스)'에 파일 상태를 기록(stage - 스테이징 한다고 표현하기도 함)하게 되어 있습니다.
    따라서 저장소에 변경 사항을 기록하기 위해서는, 기록하고자 하는 모든 변경 사항들이 ‘Stainging Area(인덱스)’ 존재해야 합니다.
    예를 들어, 10개의 파일을 수정했지만 그 중에 7개만 저장소에 공개하고 싶을 때, 변경한 10개의 파일 중 7개를 선택하는 작업이 바로 '인덱스에 등록' 또는 '스테이징(stage)'이라 표현하는 작업 입니다.

  • - Commit : 현재 변경된 작업 상태를 점검을 마치면 확정하고 작업한 내용을 로컬 저장소에 저장하는 과정이다.
    각각의 커밋은 의미 있는 변경 단위이고, 변경에 대한 설명을 커밋 로그(메시지)로 남긴다. (버그 수정, 기능 추가 등 특별한 의미가 있는 업데이트를 작업 별로 구분해서 각각 커밋하면, 나중에 이력을 보고 특정 변경 내용을 찾기 쉽습니다.)

  • - Tag : 현커밋의 임의 위치에 쉽게 찾아갈 수 있도록 붙여놓은 이정표를 태그라 한다. 태그가 붙여진 커밋은 Commit ID 대신 태그명을 입력하여 쉽게 체크아웃 할 수 있도록 한다. (아래 그림 version1.0 / version1.1)

  • - Push : 로컬 저장소의 내용 중 원격 저장소에 반영되지 않은 커밋을 원격 저장소(Github)로 보내는 과정.

  • - Head : 현재 작업중인 Branch를 가르킨다.

  • - Branch : 커밋을 단위로 구분된 소스코드 타임라인에서 분기해서 새로운 커밋을 쌓을 수 있는 가지를 만드는 것, 혹은 그 가지를 브랜치라한다. 독립적으로 어떤 작업을 진행하기 위한 개념 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있다.

  • - Merge : 브랜치와 반대되는 개념으로, 하나의 브랜치를 다른 Branch와 내용을 현재 Branch로 가져와 합치는 작업을 의미한다.

03. Svn과 Git의 비교특징

- Git은 서버저장소와 개발자 저장소가 독립적으로 commit history를 가져갈 수 있기 때문에 매우 유연한 방식으로 소스를 운영할 수 있으며, 이러한 유연성이 Git의 가장큰 장점이다.

SVN
  • - SVN은 보통 대부분의 기능을 완성해놓고 소스를 중앙저장소에 commit

  • - commit의 이미 자체가 중앙 저장소에 해당 기능을 공개한다는 의미.

  • - Git과 가장큰 차이점 개발자가 자신만의 version history를 가질 수 없다.

  • - commit 한 내용에 실수가 있으면 다른 개발자에게 바로 영향을 미치게되는 단점이 있다.

Git
  • - 로컬저장소와 원격 저장소의 분리가 되어 있어서 로컬저장소의 독립적인 관리가 가능하다. 개발자가 자신만의 로컬 commit history를 가질수 있다.

  • - commit한 내용에 실수가 있더라도 바로 서버에 영향을 미치지 않는다.

  • - 빠르고 쉬운 브랜치 생성 및 병합 가능하여 목적별로 기능 및 수정을 위해 아이디어 실험등을 이유로 브랜치를 만들어 관리할 수 있다.

04. 명령어 정리

주요 명령어 설명
  • - git init : 깃 저장소를 초기화한다. 저장소나 디렉토리 안에서 이 명령을 실행하기 전까지는 그냥 일반 폴더이다. 이것을 입력한 후에야 추가적인 깃 명령어들을 줄 수 있다.

  • - git config : “configure”의 준말, 처음에 깃을 설정할 때 가장 유용하다.

  • - git help : 명령어를 잊어버렸다? 커맨드 라인에 이걸 타이핑하면 21개의 가장 많이 사용하는 깃 명령어들이 나타난다. 좀 더 자세하게 “git help init”이나 다른 용어를 타이핑하여 특정 깃 명령어를 사용하고 설정하는 법을 이해할 수도 있다.

  • - git status : 저장소 상태를 체크. 어떤 화일이 저장소 안에 있는지, 커밋이 필요한 변경사항이 있는지, 현재 저장소의 어떤 브랜치에서 작업하고 있는지 등을 볼 수 있다.

  • - git add : 저장소 상태를 체크. 어떤 화일이 저장소 안에 있는지, 커밋이 필요한 변경사항이 있는지, 현재 저장소의 어떤 브랜치에서 작업하고 있는지 등을 볼 수 있다.

  • - git commit : 깃의 가장 중요한 명령어. 어떤 변경사항이라도 만든 후, 저장소의 “스냅샷”을 찍기 위해 이것을 입력한다. 보통 “git commit -m “Message hear.” 형식으로 사용한다. -m은 명령어의 그 다음 부분을 메시지로 읽어야 한다는 것을 말한다.

  • - git branch : 여러 협업자와 작업하고 자신만의 변경을 원한다? 이 명령어는 새로운 브랜치를 만들고, 자신만의 변경사항과 화일 추가 등의 커밋 타임라인을 만든다.

  • - git checkout : 글자 그대로, 현재 위치하고 있지 않은 브랜치를 “체크아웃”할 수 있다. 이것은 체크하길 원하는 브랜치로 옮겨가게 해주는 탐색 명령이다. master 브랜치를 들여다 보고 싶으면, git checkout master를 사용할 수 있고, git checkout cats로 또 다른 브랜치를 들여다 볼 수 있다.

  • - git merge : 브랜치에서 작업을 끝내고, 모든 협업자가 볼 수 있는 master 브랜치로 병합할 수 있다. git merge cats는 “cats” 브랜치에서 만든 모든 변경사항을 master로 추가한다.

  • - git push : 로컬 컴퓨터에서 작업하고 당신의 커밋을 깃허브에서 온라인으로도 볼 수 있기를 원한다면, 이 명령어로 깃허브에 변경사항을 “push”한다.

  • - git pull : 로컬 컴퓨터에서 작업할 때, 작업하고 있는 저장소의 최신 버전을 원하면, 이 명령어로 깃허브로부터 변경사항을 다운로드한다(“pull”).

05. Git 명령어

  • - 코드는 아래 세 단계에 걸쳐 저장된다. (스테이징 → 커밋 → 원격저장소)

  • 1. git add >파일명> 으로 파일을 스테이징 상태로 넣는다.

  • 2. git commit 으로 스테이징된 모든 변경사항을 커밋한다. (여기까지가 로컬에서의 작업)

  • 3. git push 로 커밋된 저장소를 원격저장소로 밀어 넣는다.

Git 초기설정 (앞으로 사용할 임의의 계정을 만듭니다)
  • - 전역 사용자명 / 이메일 구성하기

    git config --global user.name "이름"
    $ git config --global user.email "메일주소"
    (로컬 디렉토리에서 git 저장소로 변경 push 하려면 github 계정명과 패스워드를 계속 입력해야하는 번거로움이 있기에 초기에 설정)
  • - 저장소별 사용자명 / 이메일 구성하기 (해당 저장소 디렉토리로 이동한 후)

    $ git config user.name "이름"
    $ git config user.email "메일주소"
    
  • - 전역 설정 정보 조회

    $ git config --global --list
    
  • - 저장소별 설정 정보 조회

    $ git config --list
    
기본적인 사용법
  • - 폴더 생성

    $ mkdir "name" :  make directory
    
  • - 폴더 이동

    $ cd "name" : change directory
    
  • - 현재 Git 버전 확인

    $ git --version
    
  • - 새로운 저장소 초기화

    $ git init
    
  • - 원격 저장소 복제

    $ git clone <원격저장소 주소>
    
  • - 새로운 파일 추가하거나 존재하는 파일 스테이징

    $ git add <파일>         // 일부 파일 추가
    $ git add *			// 전체 파일 추가
    
  • - 커밋

    $ git commit -m “변경 메시지"
    
  • - 변경사항 체크

    $ git status
    
  • - 원격저장소 추가

    $ git remote add origin <원격저장소 주소>
    
  • - 원격으로 보내기

    $ git push origin master <원격저장소 주소>
    
  • - 원격으로부터 받아오기

    $ git pull origin master <원격저장소 주소>
    
Commit
  • - 간단한 커밋 방법

    $ git add <변경한 파일명>
    $ git commit -m “변경 메시지"
    - add 와 commit이 한 세트 입니다.
    
  • - 추적되는 모든 파일의 변경사항 커밋하기 (add 과정 생략)

    $ git commit -m “변경 메시지" -a
    - add 과정을 생략하고 한꺼번에 커밋까지 실행합니다.
    
  • - 마지막 커밋 고치기

    $ git commit -m “변경된 커밋 메시지 내용" --amend
    - 빼먹은 파일이 있으면 add 명령어로 파일 추가 후 커밋 덮어쓰기 가능
    - 커밋 메시지만 수정할때도 위의 명령어로 가능
    
  • - 커밋 합치기

    $ git rebase -i HEAD~4		// 최신 4개의 커밋을 하나로 합치기
    
  • - 커밋 이력 확인

    $ git log				// 모든 커밋로그 확인
    $ git log -3				// 최근 3개 커밋로그 확인
    $ git log --pretty=oneline		// 각 커밋을 한 줄로 표시
    
    - 커맨드에서 빠져 나올시 키보드 “Q” 누름
    
  • - 커밋 취소

    $ git reset HEAD^			// 마지막 커밋 삭제
    $ git reset --hard HEAD		// 마지막 커밋 상태로 되돌림
    $ git reset HEAD *			// 스테이징을 언스테이징으로 변경
    
기타
  • - 파일 삭제

    $ git rm <파일명>			// 원격 저장소와 로컬 저장소에 있는 파일 삭제
    $ git rm --cached <파일명>		// 원격 저장소에 있는 파일 삭제
    
  • - 현재 작업 트리와 인덱스의 차이점 보기

    $ git diff
    $ git diff --color-words			// 색상으로 구분해줌
    
  • - 원격 브랜치 갱신

    $ git fetch
    - 원격저장소의 변경사항을 가져와서 갱신합니다. (새로고침 상태)
    
  • - 로컬저장소와 깃허브 저장소 연결

    $ git remote -v
    - 연결상태를 확인한다.
    
    $ git remote add origin https://github.com/username/myproject.git
    - 로컬과 원격 저장소를 연결한다.
    
    $ git push origin master
    - 깃허브로 푸시한다.
    
  • - 로컬저장소에 내려받기

    $ git clone https://github.com/username/myproject.git
    - Github의 모든 파일들을 가져오기만 함
    
    $ git pull https://github.com/username/myproject.git
    - local repository와 비교하여 병합을 하고, local repository에 저장( add )까지 수행
    

git pull = git fetch + git merge