현재에는 (버전 2.11.0 기준으로) 기존에 이미 존재하고 있던 worktree 를 이동시키는 git 내장 기능은 제공되고 있지 않으며, 이는 공식적인 bug 로 기술되어 있다 (참고: https://git-scm.com/docs/git-worktree#_bugs).
역주: 해당 페이지를 번역 시점에 방문시 관련 내용이 기술되어 있지 않으며, 대신에 git worktree move <worktree> <new-path> 와 같은 명령어 설명이 있는 것으로 보아 현재에는 정식 지원하는 것으로 보입니다.
이러한 제약사항을 극복하기 위해서, .git reference 파일들에 대한 직접적인 수정을 통해 해결을 시도해 볼 수 있다.
이 예제에서는, repo 의 주 사본이 (main copy) /home/user/project-main 에 존재하고 있으며 보조적인 worktree 는 /home/user/project-1 에 위치해 있는 상태에서 /home/user/project-2 로 이동을 하고자 하는 상황을 가정하고 있다.
아래에 소개된 단계를 진행함에 있어서 중간에 다른 git 명령어를 수행하지 않도록 한다. git 의 garbage collector 가 동작하여 보조적인 tree 에 대한 reference 가 유실될 수 있다. 첫 단계부터 마지막 단계까지를 중단 없이 연속적으로 수행하도록 한다:
worktree 의 .git 파일이 주 사본 tree 내의 새로운 위치를 가리키도록 변경한다. /home/user/project-1/.git 파일이 아래와 같은 내용을 갖게 될 것이다:
새로운 기능을 한창 구현하던 도중에, 긴급히 문제점 하나에 대한 수정 요청을 받은 상황을 가정해 보자. 보통은 이러한 상황에서 git stash 명령어를 사용하여 작업중이던 변경사항을 저장할 수 있겠으나, 작업 디렉토리의 변경 내역이 과도하여 (파일들이 새로이 생성되고, 이동되고, 삭제되었으며 수정사항들이 이곳저곳에 산재해 있는 등) 현재 진행상태에서 방해를 받고 싶지 않을 수 있다.
이러한 경우 임시로 연결된 (linked) worktree 를 추가하고, 긴급 수정 사항을 작성한 후, 작업 완료 후 해당 worktree 를 삭제함으로써 이전에 수행중이던 작업 내용을 방해받지 않고 이어나갈 수 있다:
기본적으로, add 명령어를 다른 worktree 에 의해 checkout 되어있는 <branch> 에 대해 수행하는 경우, 이러한 새로운 work tree 를 생성하고자 하는 요청이 거부되게 되어 있다. 이 옵션을 사용하면 이와 같은 안전 장치를 무효화 시킬 수 있다.
-b <new-branch> -B <new-branch>
add 명령어와 사용하는 경우, (-b 나 -B 옵션과 상관없이 주어진 파라미터인) <branch> 로부터 <new-branch> 라는 이름의 새로운 브랜치를 생성하게 되며, 이렇게 새롭게 생성된 <new-branch> 를 새로운 working tree 로 checkout 하게 된다. 만약 <branch> 가 따로 주어지지 않았다면, HEAD 가 기본값으로 사용될 것이다. 기본적으로, -b 옵션 사용시 요청된 브랜치 이름이 이미 존재하는 경우 처리가 실패하게 되며, -B 옵션은 이러한 안전장치를 무효화 시켜 <new-branch> 의 내용을 <branch> 으로 재설정 하게 된다.
--detach
add 명령어와 사용하는 경우 , 새로운 working tree 의 HEAD 를 detach 상태로 만든다.
--[no-] checkout
기본적으로, add 명령어는 주어진 <branch> 를 checkout 하게 되나, --no-checkout 을 사용하여 checkout 작업의 수행을 막아 sparse-checkout 구성과 같은 특별 설정을 수행할 수 있도록 한다.
-n --dry-run
prune 명령어와 함께 사용 시, 실제 삭제 작업을 수행하지 않고 삭제 대상 목록을 표시만 하도록 한다.
--porcelain
list 명령어와 함께 사용 시, 스크립트 등에서 읽어들이기 용이한 형태의 형식으로 출력하도록 한다. 이 형식은 Git 버전이나 사용자 환경 설정에 영향을 받지 않도록 유지되는 포맷이다.
-v --verbose
prune 명령어와 사용 시, 실제 삭제가 이루어진 항목들을 출력해준다.
--expire <time>
prune 명령어와 사용 시, <time> 으로 주어진 시간값보다 오래된 working tree 들만 정리하도록 한다.
Section 43.9: 검색식에 부합하는 가장 최근 커밋 찾기: <rev>^{/<text>},:/<text>
$ git show HEAD^{/fix nasty bug} # HEAD 로부터 검색을 시작한다
$ git show ':/fix nasty bug'# 모든 브랜치로부터 검색을 시작한다
콜론 (':') 다음에 슬래시 ('/'), 그리고 문자열이 따르는 경우에는, 문자열로 주어진 정규표현식에 부합하는 커밋 메시지를 갖는 커밋을 지칭하게 된다. 이렇게 지칭된 커밋은 모든 ref 로부터 접근 가능한 커밋 중 가장 최근의 커밋을 반환할 것이다.
주어진 정규표현식은 커밋 메시지 내에서 위치에 상관없이 일치 여부를 검사하게 될 것이다. 특정 문자열로 시작하는 메시지를 검색하기 위해서는, 다음과 같은 검색식을 활용할 수 있다. 예) :/^foo. 특수 검색식인 :/! 은 일치 판별을 위한 변경자 (modifier) 들을 위하여 예약되어 있다. :/!-foo 와 같은 검색식은 부정 일치 기준 표현을 위해 사용되며, :/!!foo 은 문자 ! 및 뒤따르는 문자열 foo 와의 일치 여부를 검사한다.
Revision 을 나타내는 문자열 뒤에 붙는 ^ 문자가 슬래시로 시작하는 문자열을 감싼 중괄호 앞에 위치한 경우, 이는 :/<text> 문법과 동일한 효과를 가지게 되어, ^ 문자 앞에 주어진 <rev> 로부터 접근 가능한 커밋들 중 조건에 부합하는 가장 최근 커밋을 반환하게 된다.