본문 바로가기

책/프로 Git

Git 도구-7 - Subtree Merge Subtree Merge 서브모듈 시스템이 무엇이고 어디에 쓰는지 배웠다. 그런데 같은 문제를 해결하는 방법이 또 하나 있다. Git은 Merge하느 시점에 무엇을 Merge할지, 어떤 전략을 사용할지 결정해야 한다. Git은 브랜치 두 개를 Merge할 때에는 Recursive 전략을 사용하고 세 개 이상의 브랜치를 Merge할 때에는 Octopus 전략을 이용한다. 이 전략은 자동으로 선택된다. Merge할 브랜치가 두개면 Recursive 전략이 선택된다. Recursive 전략은 Merge하려는 두 커밋과 공통 조상 커밋을 이용하는 3-way merge를 사용하기 때문에 단 두 개의 브랜치에만 적용할 수 있다. Octopus 전략은 브랜치가 여러개라도 Merge할 수 있지만 비교적 충돌이 쉽게 일.. 더보기
Git 도구-6 - 서브모듈 서브모듈 프로젝트를 수행하다 보면 다른 프로젝트를 사용해야 하는 경우가 종종 있다. 보통 사용할 프로젝트들은 독립적으로 개발된 라이브러리들이다. 이런 상황에서 자주 생기는 이슈는 두 프로젝트를 별개로 다루면서도 그중 하나를 다른 하나 안에서 사용할 수 있어야 한다는 것이다. Atom 피드를 제공하는 웹사이트를 만든다고 가정하자. Atom 피드를 생성하는 코드는 직접 작성하지 않고 라이브러리를 가져다 쓰기로 했다. 그러면 CPAN이나 Ruby gem 같은 라이브러리 관리 도구를 사용하거나 해당 소스를 프로젝트로 복사해야 한다. 사실 라이브러리를 수정하는 것은 어렵다. 하지만 수정한 라이브러리를 모든 사용자가 이용할 수 있도록 배포하는 것은 더 어렵다. 그래서 프로젝트에 라이브러리 코드를 포함시켜서 수정하는.. 더보기
Git 도구-5 - Git으로 버그 찾기 Git으로 버그 찾기 파일 어노테이션 어떤 메서드에 버그가 있으면 git blame 명령으로 그 메서드의 각 줄을 누가 언제 마지막을 고쳤는지 찾아낼 수 있다. 첫 항목 그 줄을 마지막에 수정한 커밋의 SHA-1 값이다. 두 번째, 세번째 항목은 누가 언제 그 줄을 커밋했는지 보여준다. 그 뒤에 파일의 줄 번호와 내용을 보여준다. ^4832fe2 에서 ^표시는 해당줄이 처음 커밋했다는 뜻이다. 즉 그 이후 커밋이 한번도 없다는 뜻이다. $ git blame -L 12,22 simplegit.rb ^4832fe2 (Scott Chacon 2008-03-15 10:31:28 -0700 12) def show(tree = 'master') ^4832fe2 (Scott Chacon 2008-03-15 10:31.. 더보기
Git 도구-4 - 히스토리 단장하기 히스토리 단장하기 일하다 보면 커밋 히스토리를 수정해야할 때가 있는데, Git은 다음과 같은 일을 할 수 있다. Staging Area가 있어서 커밋할 파일을 고르는 일을 커밋하는 순간으로 미룰 수 있다. Stash 명령으로 하던일을 미룰 수 있다. 커밋 순서를 변경할 수 있다. 커밋 메시지와 커밋 파일도 변경할 수 있다. 여러개의 커밋을 합칠 수 있다. 하나의 커밋을 여러개로 분리할 수도 있다. 커밋 전체를 삭제할 수도 있다. 이러한 작업들은 다른 사람과 공유하기 전에 해야한다. 마지막 커밋을 수정하기 커밋 메시지를 수정하는 방법 $ git commit --amend 파일 목록을 수정하는 방법 $ git add OR git rm $ git commit --amend 이때 SHA-1 값이 바뀌기 때문에 .. 더보기
Git 도구-3 - Stashing Stashing Stash 명령을 사용하면 워킹 디렉터리에서 수정한 파일 만 저장한다. 다음 파일들을 보관한다. Modified 이면서 Tracked 상태인 파일 Staging Area에 있는 파일 아직 끝나지 않은 수정사항을 스택에 잠시 저장했다가 나중에 다시 적용할 수 있다. 하던 일을 Stash하기 파일 두 개 수정하고 그 중 하나는 Staging Area에 추가한다. $ git status Changes to be committed: (use "git reset HEAD ..." to unstage) modified: index.html Changes not staged for commit: (use "git add ..." to update what will be committed) (use ".. 더보기
Git 도구-2 - 대화형 명령어 대화형 명령어 git add 명령에 -i 나 --interactive 옵션을 주고 실행하면 대화형 모드로 들어간다. $ git add -i staged unstaged path 1: unchanged +0/-1 TODO 2: unchanged +1/-1 index.html 3: unchanged +5/-1 lib/simplegit.rb *** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help What now> Staging Area 파일 추가하고 추가 취소하기 위의 Commands 처럼 2, 나 u 입력하고 엔터 What now> 2 staged unstaged path 1: unchang.. 더보기
Git 도구-1 - 리비전 조회하기 리비전 조회하기 리비전 하나 가리키기 짧은 SHA-1 다음 명령은 모두 같은 명령이다. $ git show 1c002dd4b536e7479fe34593e72e6c6c1819e53b $ git show 1c002dd4b536e7479f $ git show 1c002d git log 명령어에 --abbrev-commit 옵션을 추가하면 기본 7자의 해시를 보여주고 중복되면 더 긴 해시값을 보여준다. $ git log --abbrev-commit --pretty=oneline ca82a6d changed the version number 085bb3b removed unnecessary test code a11bef0 first commit 보통은 8 ~ 10자 로도 충분하다. 리눅스 커널도 해시값 12자만 .. 더보기
분산 환경에서의 Git-5 - 프로젝트 운영하기 프로젝트 운영하기 프로젝트 운영은 크게 두 가지로 이루어진다. fotmat-patch 명령을 생성한 Patch를 이메일로 받아서 프로젝트에 Patch를 적용하는것 프로젝트의 다른 리모트 저장소로 부터 변경내용을 Merge하는 것 토픽 브랜치에서 일하기 임시로 토픽 브랜치에 통합해보고 나서 메인 브랜치에 통합 하는 것이 좋다. Patch를 적용할 때 이리저리 수정해볼 수 있다. 더 고민할 점이 있으면 Patch를 적용해 둔 채로 나중에 미룰 수도 있다. 프로젝트의 관리자라면 임시 통합할 토픽 브랜치의 이름을 잘 지어야 한다. 예를 들어 sc라는 사람이 작업한 Patchfkaus sc/ruby-client처럼 앞에 닉네임을 붙여서 브랜치를 만들 수 있다. $ git branch sc/ruby_client m.. 더보기