git

설치

작업의 흐름

여러분의 로컬 저장소는 git이 관리하는 세 그루의 나무로 구성돼있어요.

  • 첫번째 나무인 작업 디렉토리(Working directory)는 실제 파일들로 이루어져있고,
  • 두번째 나무인 인덱스(Index)는 준비 영역(staging area)의 역할을 하며,
  • 마지막 나무인 HEAD는 최종 확정본(commit)을 나타내요. 작업의 흐름

git 환경 세팅

git config --list
git config --global -e
git config --global user.name "내이름"
git config --global user.email "내메일주소"
git config --global core.autocrlf true
// 윈도우 사용자
git config --global core.autocrlf input
// 맥 사용자

운영체제 마다 에디터에서 새로운 줄바꿈을 할 때 들어가는 문자열이 달라진다.
윈도우는 text \r\n
맥은 text \n
이런 차이점 때문에 git 저장소를 다양한 운영체제 쓰는 경우 내가 수정하지 않았음에도 불구하고 줄바꿈 문자열이 달라져서 git history를 보는데 문제가 있을 수 있다.
이것을 수정할 수 있는 속성이 바로 autocrlf 이다.
윈도에서 true로 설정하게 되면 git에 저장할때는 \r을 삭제하게 되고 다시 git에서 윈도우로 가져올 때에는 자동으로 \r 을 붙여준다.
맥에서는 input으로 설정하게 되면 git에서 받아올때는 별다른 수정이 일어나지 않지만 저장할 때는 \r 을 삭제해준다.
맥에서 \r 이 붙지 않음에도 불구하고 이렇게 처리를 해주는 것은 맥에서 이메일을 받아온 텍스트를 복사해서 붙여넣을 때 실수로 \r 이 들어갈 수 있기 때문이다.

git 저장소 만들기

기존 디렉토리를 git 저장소로 만들기 init

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

git init

이 명령은 .git이라는 하위 디렉토리를 만든다. .git 디렉토리에는 저장소에 필요한 뼈대 파일(Skeleton)이 들어 있 이 명령만으로는 아직 프로젝트의 어떤 파일도 관리하지는 않습니다. 즉, 새로운 git 저장소가 만들어집니다. Git이 파일을 관리하게 하려면 저장소에 파일을 추가하고 커밋해야 합나다. git add 명령으로 파일을 추가하고 커밋합니다.

git add *.c 
git add -A
git rm --cached <파일명>
// 인덱스에서 워킹으로 즉 unracked됨
git add README 
git commit -m 'initial project version'
git status
git log
// 커밋이력
git log --graph --all --decorate

원격 저장소를 Clone하기

다른 프로젝트에 참여하거나(Contribute) Git 저장소를 복사하고 싶을 때 git clone 명령을 사용합니다.
git clone을 실행하면 프로젝트 히스토리를 전부 받아옵니다.
git clone [원격저장소url] 명령으로 저장소를 Clone합니다.

git clone 원격저장소url
//현재 디렉토리로 clone
git clone 원격저장소url ./
git remote

git remote로 확인해보면 remote의 별칭이 origin 으로 자동 세팅되어 있는 것이 확인됩니다.
다른 디렉토리 이름으로 Clone할 수 있다

git clone 원격저장소url 새디렉토리명

추가와 확정 add commit

변경된 파일은 아래 명령어로 (인덱스에) 추가할 수 있어요.

git add <파일 이름>
git add *

이것이 바로 git의 기본 작업 흐름에서 첫 단계에 해당돼요.
하지만 실제로 변경 내용을 확정하려면 아래 명령을 내려야 한답니다.

git commit -m "이번 확정본에 대한 설명"

자, 이제 변경된 파일이 HEAD에 반영됐어요.
하지만, 원격 저장소에는 아직 반영이 안 됐답니다.

git status
git status -s
git status --short

파일의 상태를 확인할 수 있습니다.

git commit -am "커밋 메시지 내용"

git commit 명령을 실행할 때 -a 옵션을 추가하면 Git은 Tracked 상태의 파일을 자동으로 Staging Area에 넣습니다. 그래서 git add 명령을 실행하는 수고를 덜 수 있을 것입니다.

git 커밋 메시지 작성법 구글링 해보자!

변경 내용 발행하기 push

현재의 변경 내용은 아직 로컬 저장소의 HEAD 안에 머물고 있어요.
이제 이 변경 내용을 원격 서버로 올려봅시다. 아래 명령을 실행하세요.

git remote
// 현 폴더의 원격 저장소를 확인한다
git remote add origin <원격 서버 주소>
git push - u origin master

origin: 리모트 저장소 별칭, master : 브랜치 를 의미합니다. (다른 가지를 발행하려면 master를 원하는 가지 이름으로 바꿔주세요.)
-u는 원격저장소로부터 업데이트를 받은 후 push를 한다는 의미이므로 습관적으로 -u 사용을 권장합니다.
만약 기존에 있던 원격 저장소를 복제한 것이 아니라면(clone으로 만든 것이 아니라면), 원격 서버의 주소를 git에게 알려줘야 해요.

이제 변경 내용을 원격 서버로 발행할 수 있어요.

평행우주 넘나들기 branch

가지는 안전하게 격리된 상태에서 무언가를 만들 때 사용해요. 여러분이 저장소를 새로 만들면 기본으로 master 가지가 만들어집니다. 이제 다른 가지를 이용해서 개발을 진행하고, 나중에 개발이 완료되면 master 가지로 돌아와 병합하면 돼요. branch 아래 명령으로 "feature_x"라는 이름의 가지를 만들고 갈아탑니다.

git branch <새로만들 브랜치이름>
git checkout <옮길 브랜치이름>
git checkout master
git checkout -b feature_x
// feature_x 브랜치를 만들고 이 브랜치로 옮긴다

가지들을 살펴보기

git branch
git branch -a
// 로컬과 원격의 브랜치를 모두 볼 수 있다

아래 명령으로 master 가지로 돌아올 수 있어요.

git checkout master

master 상태에서 feature_x 가지와 병합하기

git merge feature_x

아래 명령으로는 가지를 삭제할 수 있어요.

git branch -d feature_x

여러분이 새로 만든 가지를 원격 저장소로 전송하기 전까지는 다른 사람들이 접근할 수 없어요.

git push origin <가지 이름>
git push origin myidea
git checkout -b myidea origin/myidea
//로컬에 myidea 브랜치를 만들고 그 브랜치로 이동한 후, 원격 origin/myidea를 가져온다
git push -d origin myidea
// 원격의 myidea 브랜치를 삭제

갱신과 병합 merge

여러분의 로컬 저장소를 원격 저장소에 맞춰 갱신하려면 아래 명령을 실행하세요.

git fetch
// 원격 브랜치의 커밋 상태 새 업데이트 내역 확인
git status
// 원격에서 pull 받아야 할 것이 있는지 살펴본다.
git pull origin master

이렇게 하면 원격 저장소의 변경 내용이 로컬 작업 디렉토리에 받아지고(fetch), 병합(merge)된답니다.
되도록 fetch 후 pull !

pull vs fetch

  • fetch : 원격저장소의 내용을 가져온다.
    • 신중하게 작업할 때 쓰인다. fetch를 한 후, 브랜치를 따서 테스트 한 다음 로컬작업디렉토리와 병합하고 브랜치를 마스터와 병합한후 브랜치 삭제
  • pull : fetch 한 내용을 로컬 작업 디렉토리에 병합 작업까지 한다.

다른 가지에 있는 변경 내용을 현재 가지(예를 들면, master 가지)에 병합하려면 아래 명령을 실행하세요.

git merge <가지 이름>

첫번째 명령이든 두번째 명령이든, git은 자동으로 변경 내용을 병합하려고 시도해요.
문제는, 항상 성공하는 게 아니라 가끔 충돌(conflicts)이 일어나기도 한다는 거예요.
이렇게 충돌이 발생하면, git이 알려주는 파일의 충돌 부분을 여러분이 직접 수정해서 병합이 가능하도록 해야 하죠.
충돌을 해결했다면, 아래 명령으로 git에게 아까의 파일을 병합하라고 알려주세요.

git add <파일 이름>

변경 내용을 병합하기 전에, 어떻게 바뀌었는지 비교해볼 수도 있어요.

git diff <원래 가지> <비교 대상 가지>

fork pull request

fork

github에서 맘에 드는 프로젝트로 가서 우측 상단 fork 버튼을 클릭합니다.
fork가 완료되면 개인 계정에 저장소가 만들어집니다.(복제됩니다)

pull request

fork해서 작업한 내용을 원본 저장소에 push 하고 싶으면,
pull request 요청을 보냅니다.

코드리뷰

gerrit

게릿은 무료 웹 팀 코드 협업 도구이다. 소프트웨어 개발자가 팀에서 웹 브라우저를 사용해 소스 코드의 다른 사람의 수정 사항을 검토하거나 변경 사항을 승인 또는 거부할 수 있다. 분산 버전 관리 시스템인 Git과 밀접하게 통합된다. gerrit

꼬리표 달기 tag

소프트웨어의 새 버전을 발표할 때마다 꼬리표를 달아놓으면 좋아요. (물론 꼬리표는 SVN 등에 이미 존재하는 기능이지요.)
아래 명령을 실행하면 새로운 꼬리표인 1.0.0을 달 수 있어요.

git tag 1.0.0 1b2e1d63ff

위 명령에서 1b2e1d63ff 부분은 꼬리표가 가리킬 확정본 식별자입니다.
아래 명령으로 확정본 식별자를 얻을 수 있어요.

git log

확정본 식별자의 앞부분 일부만 입력해도 꼬리표를 붙일 수 있지만, 그 일부분이 반드시 고유하다는 조건이 필요해요.

작업 취소

과거로 돌아가는 방법

1. 과감한 방법 reset

돌아갈 과거 이후 행적은 복원할 여지 없이 완전히 지우겠다는 것(소스트리 : 이 커밋까지 현재 브런치를 초기화 (옵션에서 hard 체크))

git reset <커밋번호여섯자리> --hard

2. 신중한 방법 revert

커밋 되돌리기

git revert <커밋번호여섯자리>

3. 히스토리를 일렬로 재배치 rebase

(소스트리 : 재배치)

git rebase <재배치할 브랜치 이름>

개별파일 원복

git checkout  -- <파일> 
// 워킹트리의 수정된 파일을 index에 있는 것으로 원복
git checkout HEAD -- <파일명> 
// 워킹트리의 수정된 파일을 HEAD에 있는 것으로 원복(이 경우 --는 생략가능)
git checkout FETCH_HEAD -- <파일명> 
// 워킹트리의 수정된 파일의 내용을 FETCH_HEAD에 있는 것으로 원복? merge?(이 경우 --는 생략가능)

index 추가 취소

git reset -- <파일명> 
// 해당 파일을 index에 추가한 것을 취소(unstage). 워킹트리의 변경내용은 보존됨. (--mixed 가 default)
git reset HEAD <파일명> 
// 위와 동일

commit 취소

git reset HEAD^ 
// 최종 커밋을 취소. 워킹트리는 보존됨. (커밋은 했으나 push하지 않은 경우 유용)
git reset HEAD~2 
// 마지막 2개의 커밋을 취소. 워킹트리는 보존됨.
git reset --hard HEAD~2 
// 마지막 2개의 커밋을 취소. index 및 워킹트리 모두 원복됨.
git reset --hard ORIG_HEAD 
// 머지한 것을 이미 커밋했을 때,  그 커밋을 취소. (잘못된 머지를 이미 커밋한 경우 유용)
git revert HEAD 
// HEAD에서 변경한 내역을 취소하는 새로운 커밋 발행(undo commit). (커밋을 이미 push 해버린 경우 유용)

워킹트리 전체 원복

git reset --hard HEAD 
// 워킹트리 전체를 마지막 커밋 상태로 되돌림. 마지막 커밋이후의 워킹트리와 index의 수정사항 모두 사라짐. 
                                  (변경을 커밋하지 않았다면 유용)
git checkout HEAD . 
// ??? 워킹트리의 모든 수정된 파일의 내용을 HEAD로 원복.
git checkout -f 
// 변경된 파일들을 HEAD로 모두 원복(아직 커밋하지 않은 워킹트리와 index 의 수정사항 모두 사라짐. 신규추가 파일 제외)

참조 : reset 옵션

--soft 
// index 보존, 워킹트리 보존. 즉 모두 보존.
--mixed 
// index 취소, 워킹트리만 보존 (기본 옵션)
--hard 
// index 취소, 워킹트리 취소. 즉 모두 취소.

untracked 파일 제거

git clean -f
git clean -f -d 
// 디렉토리까지 제거

자주 사용되는 명령어

$ git branch -> 로컬 branch 확인 
$ git branch -r 서버 branch 확인 
$ git checkout -b 브랜치명 브랜치를 만들고 바로 이동 
$ git branch -d(D) test 브랜치 삭제 
$ git status 현재상태(머지나 추가사항) 확인 
$ git add 경로 에러를 해결하고 추가하여 에러해결 
$ git stash 임시저장 
$ git stash pop 임시저장한파일 불러오기 
$ git remote prune origin 깃랩에서 삭제한거 서버와 동기화 
$ git push origin :브랜치네임 서버에서 삭제하기 
$ git remote 
$ git push origin dev 
$ git config http.postBuffer 104857600 git오류시 해결 
$ git merge --squash dev 
$ git merge --no-ff feature- : 새로운 가지 따서 merge(관리상 용이) 
$ git clone 주소 
$ git remote set-url origin 주소 : gitlap 저장소 변경시 설정 
$ git remote -v : gitlap 저장소 주소 확인 // 고아 브랜치 만드는 방법 
$ git checkout master 
$ git checkout --orphan c_YYMMDD_CAMPAIGNNAME 
$ git rm -rf . 
$ git push origin c_YYMMDD_CAMPAIGNNAME
git config --global - -list // 전역 설정 정보 조회
git config - -list // 저장소별 설정 정보 조회
git config --global color.ui “auto” // Git의 출력결과 색상 활성화하기
git config --global user.email "user@naver.com"
git config --global user.name "userid"

유용한 힌트

git의 내장 GUI

gitk

콘솔에서 git output을 컬러로 출력하기

git config color.ui true

이력(log)에서 확정본 1개를 딱 한 줄로만 표시하기

git config format.pretty oneline

파일을 추가할 때 대화식으로 추가하기

git add -i

아이디와 비밀번호 저장하기
git 콘솔에서 다음과 같이 한번만 입력해 놓으면 push나 pull 등 서버에 접속하면서 팝업으로 뜨는 아이디 비밀번호창을 띄우지 않도록 아이디 및 비번을 기억하도록 할 수 있습니다.

git config credential.helper store 

.gitignore - 파일 무시하기

# .gitignore
# a comment - 이 줄은 무시한다. 
# 확장자가 .a인 파일 무시 
*.a 
# 윗 줄에서 확장자가 .a인 파일은 무시하게 했지만 lib.a는 무시하지 않는다. 
!lib.a 
# 루트 디렉토리에 있는 TODO파일은 무시하고 subdir/TODO처럼 하위디렉토리에 있는 파일은 무시하지 않는다. 
/TODO 
# build/ 디렉토리에 있는 모든 파일은 무시한다. 
build/ 
# `doc/notes.txt`같은 파일은 무시하고 doc/server/arch.txt같은 파일은 무시하지 않는다. 
doc/*.txt 
# `doc` 디렉토리 아래의 모든 .txt 파일을 무시한다. 
doc/**/*.txt

remote: Permission to 에러

git test를 위한 유용한 cmd 명령어

:wq
// 이대로 저장 후 vim 에디터 나오기
rm -rf .git
// git 제거
echo hello > a.txt
// hello라는 텍스트가 담긴 a.txt 파일 생성
touch b.txt
// b.txt 라는 빈 파일 생성
cat a.txt
// a.txt 읽기

링크 & 자료

그래픽 클라이언트

Tower (OS X용)
Source Tree (OS X용, 무료)
GitHub for Mac (OS X용, 무료)

한글 안내서

Pro Git 필독
A Visual Git Guide
Git 작업 흐름
누구나 쉽게 이해할 수 있는 Git 입문
git 간편 안내서 GIT4 - SourceTree 협업 try git 초심자를 위한 Github 협업

영문 안내서

Pro Git
Think like a git
GitHub Help
A Visual Git Guide
git cheat sheet