[책] 인간다운 Git

[책] 인간다운 Git


인간다운 Git
데이비드 디마리 저/이태상 역

버전 관리의 요소

버전 관리 시스템(Version Control System) VCS

어떤 작업물의 최종본만 갖고 있는 것이 아니라 그 이전 각 수정본을 모두 보유함으로써, 필요할 때 이전 버전을 참고하거나 그 버전으로 되돌릴 수 있게 하자

병합 충돌 (merge conflict)

포함하고자 하는 변경 사항을 먼저 스테이징하고 그 다음에 커밋을 하는 것은 마찬가지다

Git 은 충돌이 있는 각 파일에 충돌마커(conflict marker)라고 하는 불가사의하고 난해한 표식을 넣는다.

1
$ git merge master

꺾쇠괄호가 연속으로 있는 라인이 충돌 마커이며, 두 충돌 마커 사이가 충돌 영역이다.

1
2
$ git add about.html
$ git commit -m "merge branch"

리모트

리모트 저장소(remote repository)는 내 컴퓨터가 아닌 원격에 있는 git 프로젝트의 사본을 말한다.

GitHub

실전에서 대부분의 팀은 GitHub로 호스팅하는 하나의 공유 사본을 주된 저장소로 URL며, 이를 git의 관용어로 오리진origin이라고 한다.

마스터 브랜치를 주된브랜치로 할 것인지가 사용자에게 달렸듯, 오리진 리모트 역시 마찬가지다.

1
$ git push <remote-name> <branch-name>

리모트 추가

1
2
3
$ git remote add origin <remote-repository>
$ git remote
origin

SSH(Secure Shell)

오늘날의 오픈소스 생태계에 있어서 SSH 프로토콜의 유용성이 제한을 받는 한 가지 단점이 있다.

SSH는 프라이빗 저장소에만 사용할 수 있다는 점이다.

Git 프로토콜

git 프로토콜은 git에만 있는 유일무이한 프로토콜이지만, 주로 읽기 전용이라는 이유로 오늘날에는 잘 사용되진 않는다. HTTPS가 더 나은 선택이다.

리모트 브랜치로 작업하기

1
2
$ git push origin new-homepage
$ git pull origin new-homepage

리모트의 병합 충돌

1
2
3
$ git pull origin master
$ git add -A
$ git commit -m "Merge origin"

푸시 거부

git의 어떤 장난에도 놀아나고 싶지 않다면, 항상 푸시하기 전 먼저 풀pull을 해서 로컬 사본을 최신으로 만들기 바란다.

변경 사항을 pull하는 것이 문제가 되는 경우는 거의 없으며 오히려 많은 이득을 얻는다.

브랜치 추적

1
$ git push -u origin new-homepage

추적 관계를 설정하는 가장 간단한 방법은 git push를 할 때 --set-upstream(또는 -u) 옵션을 추가하는 것이다.

기존 브랜치 체크아웃

1
$ git fetch origin

기본적인 git branch 명령은 로컬 사본에 존재하는 브랜치 목록을 보여주지만 --remote(-r) 옵션을 추가하면 git이 알고 있는 모든 리모트 브랜치를 보여준다.

1
$ git branch --remote

히스토리

로그보기

1
$ git log

--pretty 옵션을 사용하면 미리 정이된 다양한 형식 중 하나를 선택하거나, 사용자가 원하는 형식을 지정할 수 있게 한다.

1
$ git log --pretty=oneline

new-homepage 브랜치의 히스토리를 보여달라는 명령이다.

1
$ git log new-homepage

master 와의 병합 전까지 new-homepage에 추가됐던 모든 커밋을 훑어보기 쉽게 확인하는 명령

1
$ git log --oneline master..new-homepage

'heroku’라는 단어가 포함됐으며 Gemfile이라는 파일을 변경시킨 커밋만 필터링

1
$ git log --author=AUTHOR --grep=heroku --oneline Gemfile

커밋 메시지

연계 기능을 이용하려면 먼저 원하는 에디터를 git에 설정해야 한다.

1
$ git config --global core.editor "atom --wait"

커밋 메시지의 목적은 변경 사항을 요약하는 것이다. 이 커밋에서 변경된 내용을 간결하고 명쾌하게 설명하는 메시지를 작성해야 한다.

내가 어떤 일을 했고 이게 내가 한 일이다 라는 식의 훨씬 쉬운 얘기로 설명할 수 있다.

1
2
$ git commit -m "Update homepage for lunch"
$ git commit -m "Fix typo in screen.css"

커밋 비교

1
$ git diff

저장소의 현재 헤드 커밋(HEAD)과 그 전 커밋(HEAD~1)의 차이를 보기 위한 명령어

1
$ git diff --stat HEAD~1

통계를 보는 일이 의미 있다고 생각되면 git log 명령에 --stat 옵션을 붙여 사용할 수 있다.

1
$ git log --stat --pretty=format:"%h (%an) %s" HEAD~1..

태그

경량(lightweight): 마치 브랜치와 비슷하게 단지 커밋을 가리키는 이름으로만 저장

1
$ git tag <tag-name> <commit-id>

주석(annotated): 커밋 메시지와 같이 메시지를 추가로 포함

1
$ git tag <tag-name> -a -m "branch release"

브랜치와 마찬가지로 태그도 git push를 사용해 리모트로 공유할 수 있다.

1
$ git push <tag-name>

방향성 비순환 그래프

DAG(directed acyclic graph)는 데이터 구조의 한 종류다. 각 개별 노드가 다른 노드를 가리키고 그런 참조들이 정보의 사슬을 구축하며, 작업이 진행되면서 커밋이 추가됨에 따라 나무 뿌리처럼 퍼져 나가는 모양으로 계속 자라는 구조다.

명령어 목록

  • git config [–global] : git 을 설정하는 명령
  • git init : 현재 작업 사본 안에서 새 git 프로젝트를 만든다.
  • git clone [directory] : 해당 URL에 있는 git 프로젝트를 로컬 컴퓨터의 새 디렉터리로 복제
  • git status [-s] [path/to/thing]
  • git add [–all] filename.txt
  • git rm folder/filename.txt
  • git mv oldpath.txt newpath.txt
  • git reset filename.txt : 스테이징된 filename.txt를 git reset을 사용해 스테이징이 되지 않은 상태로 되돌린다.
  • git commit [-a] [-m “Your message”]
  • git branch [-r|-a]
  • git branch []
  • git checkout [-b]
  • git merge
  • git remote add
  • git remote rm
  • git push
  • git pull
  • git fetch : 리모트의 모든 사항을 로컬 사본으로 복사한다. git pull 명령을 실행하면 git fetch 작업은 자동으로 포함된다.
  • git log [–oneline] [–pretty] []
  • git diff [–stat] []
  • git tag [-a] [-m] []
  • git tag [-d]
  • git tag [-l]
  • git push --tags

추천 Git 앱

  • GitHub 데스크톱
  • 타워(Tower)
  • 소스트리(SourceTree)

Git 호스팅 서비스

  • GitHub
  • Bitbucket
  • Beanstalk

추가정보

공유하기