- 소스코드 주고받기가 필요 없고, 같은 파일을 여려 명이 동시에 작업하는 등 병렬 개발이 가능해지며, 버전 관리가 용이해져 생산성이 증가한다.
- 소스코드의 수정 내용이 커밋 단위로 관리되고, 패치 형식으로 배포할 수 있기 때문에 프로그램의 변동 과정을 체계적으로 관리할 수 있고, 언제든지 지난 시점의 소스코드로 점프(Checkout)할 수 있다.
- 새로운 기능을 추가하는 개발을 할 경우, 브랜치를 통해 충분히 실험을 한 뒤 본 프로그램에 합치는 방식(Merge)으로 개발을 진행할 수 있다.
- '분산' 버전관리이기 때문에, 인터넷이 연결되지 않은 곳에서도 개발을 진행할 수 있으며, 중앙 저장소가 폭파되어도 다시 원상복구할 수 있다.
- 팀 프로젝트가 아닌, 개인 프로젝트일지라도 Git을 통해 버전 관리를 하면 체계적인 개발이 가능해지고, 프로그램이나 패치를 배포하는 과정도 간단해진다. (Pull을 통한 업데이트, Patch 파일 배포)
- 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로 가져와 합치는 작업을 의미한다.
- Git은 서버저장소와 개발자 저장소가 독립적으로 commit history를 가져갈 수 있기 때문에 매우 유연한 방식으로 소스를 운영할 수 있으며, 이러한 유연성이 Git의 가장큰 장점이다.
- SVN은 보통 대부분의 기능을 완성해놓고 소스를 중앙저장소에 commit
- commit의 이미 자체가 중앙 저장소에 해당 기능을 공개한다는 의미.
- Git과 가장큰 차이점 개발자가 자신만의 version history를 가질 수 없다.
- commit 한 내용에 실수가 있으면 다른 개발자에게 바로 영향을 미치게되는 단점이 있다.
- 로컬저장소와 원격 저장소의 분리가 되어 있어서 로컬저장소의 독립적인 관리가 가능하다. 개발자가 자신만의 로컬 commit history를 가질수 있다.
- commit한 내용에 실수가 있더라도 바로 서버에 영향을 미치지 않는다.
- 빠르고 쉬운 브랜치 생성 및 병합 가능하여 목적별로 기능 및 수정을 위해 아이디어 실험등을 이유로 브랜치를 만들어 관리할 수 있다.
- 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”).
- 코드는 아래 세 단계에 걸쳐 저장된다. (스테이징 → 커밋 → 원격저장소)
1. git add >파일명> 으로 파일을 스테이징 상태로 넣는다.
2. git commit 으로 스테이징된 모든 변경사항을 커밋한다. (여기까지가 로컬에서의 작업)
3. git push 로 커밋된 저장소를 원격저장소로 밀어 넣는다.
- 전역 사용자명 / 이메일 구성하기
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 <원격저장소 주소>
- 간단한 커밋 방법
$ 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