본문 바로가기

기술관련/형상관리도구

Git 2.7의 뛰어난 새로운 기능을 확인해 보세요

Git 2.6부터 불과 2 개월 후 엄청난 기능과 수정, 그리고 성능 향상을 달성 한 Git 2.7 이 출시되었습니다.

git worktree 의 완성

Git 2.5에서 도입 된 멋진 git worktree 명령을 사용하면 여러 저장소 지점에서 체크 아웃이나 지점에서 작업을 다른 디렉토리에서 동시에 수행 할 수 있습니다. 예를 들어, 간단한 수정을 할 필요가 있지만 작업 사본을 더럽 히고 싶지 않으면 다음과 같이 새로운 지점을 새 디렉토리에 확인하실 수 있습니다.

 

$ git worktree add -b hotfix/BB-1234 ../hotfix/BB-1234
Preparing ../hotfix/BB-1234 (identifier BB-1234)
HEAD is now at 886e0ba Merged in bedwards/BB-13430-api-merge-pr (pull request #7822)

 

Git 2.7 리포지토리의 작업 트리 (및 관련 지점)를 표시하는 git worktree list 하위 명령이 추가되어 있습니다.

$ git worktree list
/Users/kannonboy/src/bitbucket/bitbucket            37732bd [master]
/Users/kannonboy/src/bitbucket/staging              d5924bc [staging]
/Users/kannonboy/src/bitbucket/hotfix/BB-1234       37732bd [hotfix/BB-1234]

 

워크 트리를 지원하는 git bisect 명령도 개선되었습니다. "좋은"커밋과 "나쁜"커밋을 추적하는 bisect 의 참조가 .git / refs / bisect 에서 .git / refs / worktrees / $ worktree_name / refs / bisect 로 이동했기 때문에 여러 작업 트리에서 동시에 bisect를 수행 할 수 합니다.

Git 2.7에서는 무결성을 위해 디스크에서 작업 트리의 클론을 만들 수 있습니다. 이는 독립적인 새로운 Git 저장소 (다른 작업 트리가 아닌)가 생성됩니다.

실제로 Git 워크 트리는 지점만을위한 것이 아닙니다! 나는이 기사에 Git의 기능을 조사 때 Git v2.6.0 및 v2.7.0 태그를 나란히 비교하기 위해 그들을 다른 워크 트리 에 체크 아웃하고 빌드했습니다.

 

$ git worktree add ../git-v2.6.0 v2.6.0
Preparing ../git-v2.6.0 (identifier git-v2.6.0)
HEAD is now at be08dee Git 2.6
$ git worktree add ../git-v2.7.0 v2.7.0
Preparing ../git-v2.7.0 (identifier git-v2.7.0)
HEAD is now at 7548842 Git 2.7
$ git worktree list
/Users/kannonboy/src/git         7548842 [master]
/Users/kannonboy/src/git-v2.6.0  be08dee (detached HEAD)
/Users/kannonboy/src/git-v2.7.0  7548842 (detached HEAD)
$ cd ../git-v2.7.0 && make

 

git stash 의 일부 개선

git rebase 를 좋아하는 분들은 --autostash 옵션을 알고있을 것이다. 이것은 작업 사본에서 열린 로컬 변경 사항을 리베스 전에 자동으로 은신하여 리베이스 완료 후 다시 적용하는 것입니다.

 

$ git rebase master --autostash
Created autostash: 54f212a
HEAD is now at 8303dca It's a kludge, but put the tuple from the database in the cache.
First, rewinding head to replay your work on top of it...
Applied autostash.

 

이는 더티 워크 트리에서 리베스 수있어 편리합니다. 또한이를 기본적으로 수행하는rebase.autostash 의 편리한 config 플래그도 다음과 같이 글로벌하게 할 수 있습니다.

 

$ git config --global rebase.autostash true

 

rebase.autostash 은 실제로 Git 1.8.4 에서 사용할 수 있지만 2.7 --no-autostash 옵션이 플래그를 취소 할 수 있습니다. 이것을 사용하면 더티 워크 트리를 경고 할만한 것으로, 주로 무결성을 위해 준비되어있는 것이라고 생각됩니다.

 

$ git rebase master --no-autostash
Cannot rebase: You have unstaged changes.
Please commit or stash them.

 

뭔가 간과하고 있을지도 모릅니다 만, 적절한 유스 케이스를 알고 있다면 가르쳐주세요!

config 플래그라고하면 Git 2.7에는 stash.showPatch 도 소개되어 있습니다. git stash show 의 기본 동작은 은신 한 파일의 개요를 표시합니다.

 

$ git stash show
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

 

-p 를 통과 git stash show 가 "패치 모드」가 모든 diff가 표시됩니다.

 

diff --git a/package.json b/package.json
index c876b26..e21eeb3 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,7 @@
     "mkdirp": "^0.5.0",
     "byline": "^4.2.1",
     "express": "~3.3.4",
-    "git-guilt": "^0.1.0",
+    "git-guilt": "^0.1.1",
     "jsonfile": "^2.0.0",
     "jugglingdb-sqlite3": "0.0.5",
     "jugglingdb-postgres": "~0.1.0",

 

stash.showPatch 이 기본 동작을합니다. 다음과 같이이를 사용할 수 있습니다.

 

$ git config --global stash.showPatch true

 

stash.showPatch 을 사용했지만 파일의 설명 만 표시하고 싶어졌다 경우 대신 --stat 옵션을 전달하여 원래의 동작을 복원 할 수 있습니다.

 

$ git stash show --stat
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

 

git filter-branch 의 속도 (및 진행률 표시 줄)

git filter-branch 는 git history를 반영하기 위해서는 폭넓게 사용할 도구입니다. 모든 커밋 객체는 부모의 참조 (그리고 어쩔 수없이 모든 조상 참조)을 가지고 있기 때문에 특정 커밋을 다시 쓰는 것은 모든 자손을 다시 작성할 수도 있습니다. 즉, 이전 커밋을 대상으로하는 경우는 history에 대한 사소한 다시 작업조차도 시간을 필요로하게 될 것입니다.

Git 2.7에는 새로운 편리한 진행률 막대가 도입되어 filter-branch 명령이 완료 될 때까지 어느 정도의 시간이 걸리는지를 예측할 수 있습니다.

 

 

게다가 인덱스 나 트리를 수정하지 filter-branch 명령이 지금은 인덱스로드를 날려 극적으로 고속화하고 있습니다. 위의 GIF 이미지는 commit-filter 명령을 사용하여 각 커밋 이름과 관련이있는 Git author을 내 본명 ( "Tim Pettersen")에서 닉네임 ( "Kannonboy")에 대체되었다. 또한 트리에는 만지고 없습니다. Bitbucket Server의 첫 번째 1000 커밋을 다시 작성하는 데 걸린 시간은 Git 2.7.0에서 불과 38 묘한 정도입니다 그것에 대해 Git 2.6.0에서는 약 64 초되었습니다. 놀랍게도 약 40 % 고속화 한 것입니다. 성능 향상 테스트에서는 더욱 놀라운 것은 약 60 % 의 절감 효과를 나타냈다.

.gitignore 에서 비활성화 개선

.gitignore 파일 저장소에서 작업 트리에있는 특정 파일을 제외 할 수 있지만,  파일명 앞에  ! 를 지정("무시한다"의 의미) 하여 다음과 같이 패턴을 해제 할 수 있습니다.

 

# .gitignore
*.json
!cat.json

 

이제 cat.json 이외의 모든 json 파일을 무시합니다.

하지만 Git 2.6 에서는 무시 된 디렉토리에있는 파일을 해제 할 수 없습니다.

 

# .gitignore
/animals
!/animals/cat.json # <-- this was still ignored (pre Git 2.7)

 

Git 2.7에서는 위에 표시된 두 번째 예도 잘 작동합니다. 지금은 무시되는 디렉토리의 파일 ! 를 ("무시한다" 의미) 적용 할 수 있습니다..

잠깐, 아직 더 있습니다!

2.7에서 구현 된 Git의 작은 장점이 몇 가지 있습니다. 그들은 Junio C Hamano의 릴리즈 노트 에서 확인 하시거나 직접 Git 저장소를 살펴보십시오.

 

$ git log v2.6.0..v2.7.0

 

* 원문 : 2016 년 1 월 5 일 게시물 " Neat new features in Git 2.7 "