Git 워크 트리 : 들어 본 적이없는 최고의 Git 기능

나무가 있기 전에

처음으로 git을 전문적으로 사용하기 시작했을 때 제가 가지고 있었던 한 가지 습관은 자주 코드를 숨기는 것이 었습니다. 나는 특정 기능을 작업 중이며 프로덕션에서 발생하는 오류에 대한 Hipchat 경고 (예, Slack 이전에 있음)를 보게됩니다. Sentry의 스택 트레이스를 살펴보고 문제가되는 코드 섹션을 찾습니다. 거기에서 터미널로 돌아가서 변경 사항을 숨기고 마스터에서 새 버그 수정 분기를 열고 로컬에서 오류를 재현하려고 시도했습니다.

일반적으로이 과정은 너무 많은 고통없이 발생합니다. 작업 트리에 추적되지 않은 파일이있는 경우 파일을 추가하고 모든 것을 숨길 것입니다. 버그 수정 브랜치를 Github로 푸시 한 후 변경 사항을 풀고 추가 한 추적되지 않은 원본 파일의 스테이징을 해제했습니다. 가끔 실수로 추적되지 않은 파일이나 커밋되지 않은 변경 사항을 실수로 삭제하는 것과 같은 끔찍한 일을합니다.

다른 경우에는 기능을 작업 중일 때 동료 중 한 사람의 PR 검토 요청을 보게됩니다. 나는 일반적으로 가능한 한 빨리 코드를 검토하려고 노력하고 변경이 얼마나 긴급한지에 따라 변경 검토를 위해 작업중인 작업을 중단합니다. 다시 말하지만 이것은 변경 사항을 숨기고 코드를 로컬로 가져와 새로운 변경 사항을 시도하고 엣지 케이스 동작을 확인하는 것을 의미했습니다.

결국 나는 은닉과 은닉의 고통에 좌절했고, 저장소를 다른 디렉토리에 복제해야한다고 결정했고, 버그 수정과 코드 검토를 위해 저장소 사본을 사용할 것입니다. 그리고 이것은 대부분 효과가있었습니다. 그러나 단점이없는 것은 아닙니다.

서로 다른 디렉토리에 여러 개의 저장소 사본이있는 경우의 한 가지 큰 문제는 브랜치가 그들간에 공유되지 않는다는 것입니다. 물론 한 디렉터리를 다른 디렉터리의 원격으로 설정할 수 있지만 지속적으로 분기를 동기화하는 것은 여전히 ​​고통 스럽습니다. 실제로 모든 코드가 Github와 같은 중앙 리포지토리로 푸시되는 개발 모델을 사용하는 경우 이는 그리 고통스럽지 않습니다. 마찬가지로, 내가했던 것처럼 숨김을 많이 사용한다면 내 디렉토리의 숨김을 패치로 다른 디렉토리에 적용하는 데 약간의 작업이 필요합니다.

또 다른 문제는 각 디렉토리에 자체 .git디렉토리 가 있다는 것 입니다. 이는 모든 종류의 구성을 복제해야 함을 의미합니다. 나는 상당한 수의 git pre-commit 후크를 사용하므로 이제 두 디렉토리에 모두 존재해야합니다. 다시 말하지만, 심볼릭 링크를 사용하거나 홈 폴더의이 구성 중 일부를 중앙 집중화하는 등이 문제를 해결하는 방법이 .gitconfig있지만 이상적이지는 않습니다.

마지막으로이 프로세스는 2 개의 동시 저장소 케이스 이상으로 쉽게 확장되지 않았습니다. 기존 작업을 중단하고 버그 수정을 작성하고 동료 코드를 동시에 검토해야한다는 사실을 알게되었을 때 다른 저장소 사본을 복제 할 가능성에 직면했습니다. 리포지토리 복제가 빠르지 않았고 다시 기존 두 리포지토리에 대한 모든 구성을 복사하고 동기화해야하는 부담에 직면했습니다.

Git 워크 트리 입력

Git Worktrees는 동시에 여러 개의 체크 아웃 된 작업 브랜치가있는 단일 리포지토리를 가질 수있는 기능입니다. 이제 그다지 멋지지 않을 수도 있지만 예를 들어 보겠습니다.

에있는 ApertureScience저장소 사본이 있습니다 /home/James/Aperture. 새로운 기능인 cake. 이 작업을 시작하기 전에 먼저 git worktree add cake. 이렇게하면에있는 작업을 수행 할 새 디렉토리가 생성됩니다 /home/James/Aperture/cake. cake기능 작업에 몇 시간을 보냅니다 .

프로덕션 앱에 와일드 오류가 나타납니다. 아마도 문제를 일으키는 악성 테스트 대상 일 것입니다.

cake기능 작업을 중단하고 디렉토리 git worktree add bugfix내에서 명령을 실행합니다 /home/James/Aperture. 이것은 거의 즉시 /home/James/Aperture/bugfix라는 새 브랜치에 저장소의 새 작업 복사본을 만듭니다 bugfix. 나는 cd내가 응용 프로그램을 부팅해야 할 명령을 어떤 디렉토리 및 실행에. 버그를 발견하고 수정하기 위해 어떤 변경이 필요한지 파악한 후에는 변경 사항을 커밋하고 검토를 위해 분기를 푸시 한 다음 작업중인 기능 작업으로 돌아갑니다 /home/James/Aperture/cake. 은닉하는 번거 로움이 없으며 가장 최근의 사전 커밋 후크가 실행되지 않을까 걱정할 필요가 없습니다.

효과적으로, 원하는만큼 병렬로 작업 할 수 있으며 작업을 일시 중지하고 나중에 다시 돌아올 수 있습니다.

왜 더 많은 사람들이 Git Worktrees에 대해 이야기하지 않습니까 ?? 정말 대단해요!

정말 당신의 케이크와 버그 픽스 브랜치를 가질 수 있습니까?

물론 git 작업 트리를 사용할 때주의해야 할 몇 가지 단점이 있습니다.

코드를 숨기지 않거나 강제로 커밋하지 않으면 코드를 작동 상태로 남겨 둘 가능성이 더 큽니다. 일반적으로 이것은 괜찮지 만 무언가 잘못되면 reflog에 ref가 없을 수도 있고 디스크 오류가 발생하면 어딘가에 코드의 커밋 된 복사본을 가질 가능성이 적다는 것을 의미합니다.

한 번에 더 많은 작업을 수행 할 수있는 것도 생산성에 해로울 수 있습니다. 초점을 쪼개고 너무 많은 일을 동시에하려고 할 수 있습니다.

마지막으로 일부 도구는 작업 트리를 제대로 지원하지 않을 수 있습니다. 워크 트리는 git .git이 실제 디렉토리 대신 디렉토리를 가리키는 파일이 될 수 있다는 사실에 의존합니다 . 일부 도구 .git는 디렉토리 여야 한다고 잘못 가정 하고 작업 트리에 문제가 발생합니다.

권장 설정

나는 일을 깔끔하게 유지하는 경향이 있기 때문에 작업 트리를 특정 방식으로 설정하여 쉽게 작업 할 수 있습니다. 내 작업 트리 폴더는 다음과 같습니다.

내 작업 트리 설정의 거의 정확한 표현

/home/James/worktrees/.bare— 이것은 베어 인스턴스 인 실제 git 저장소입니다. 이것은 repo 메타 데이터 만 저장하고 실제 작업 트리는 없습니다. 이 폴더에서 새 작업 트리를 만들 수 있도록 별도의 숨겨진 디렉토리에 보관하지만 worktrees작업 트리에서만 수행 할 수있는 작업 인 디렉토리 의 분기를 실수로 체크 아웃하지 마십시오 .

/home/James/worktree/.git—이 파일은 .bare디렉토리를 가리 킵니다 .

/home/James/worktree/master — 저는 항상 master의 사본을 보관합니다. 대부분 무언가가 나오면 프로덕션에서 실행중인 모든 항목의 로컬 사본을 스핀 업할 수 있습니다.

/home/James/worktree/hotfix—이 분기는 내가 핫픽스를 수행하는 장소로 유지됩니다. 충분한 빈도로 발생하여 전용 작업 트리를 유지합니다.

/home/James/worktree/<feature> — 코드베이스의 특정 기능 영역으로 구분 된 여러 기능 워크 트리가 있습니다.

나는 이러한 브랜치를 구성하는 방법에 대해 몇 가지 다른 계획을 시도했지만 여전히 개선의 여지가 있다고 생각하지만 master, 마스터에 라이브중인 것을 쉽게 회전시킬 수 있는 워크 트리 와 여러 기능을 갖는 것에 상당히 만족 합니다. 여러 가지 작업을 병렬로 수행 할 수있는 분기입니다. 또한 dependencies드롭 다운, 종속성 문제를 해결하고 새로운 버전의 종속성과 함께 작동하도록 코드베이스를 만드는 작업에 몇 분을 할애 할 수있는 작업 트리 를 유지하는 것을 좋아합니다 .

추가로 Docker-Compose 또는 디렉터리 경로로 격리 된 다른 도구를 사용하는 경우 애플리케이션의 여러 복사본을 동시에 실행할 수 있습니다. Docker-Compose는 생성 된 컨테이너의 이름으로 포함 된 폴더를 사용하고 실행중인 컨테이너를 관리하는 데 의존합니다. 물론이 작업을 수행하려면 응용 프로그램이 동적 포트 할당 등으로 자신을 적절하게 격리 할 수 ​​있는지 확인해야합니다.

대체로 이러한 스타일의 작업은 필요할 때 컨텍스트 전환을 훨씬 쉽게 만들었으며, 1 시간 이내에 완료 할 수있는 작은 작업 덩어리를 제공합니다.

나는 git worktrees가 내 도구 상자의 비밀 무기 중 하나라고 생각하며 그것들 없이는 다시 개발하는 것을 상상할 수 없었습니다.

Suggested posts

Git 분기 전략 및 풀 요청

좋은 자식 분기 전략과 풀 리퀘스트 사용

Git 분기 전략 및 풀 요청

분기 전략이 중요한 이유 Git에서 분기는 일상적인 개발 프로세스의 일부입니다. Git 브랜치는 사실상 변경 사항의 스냅 샷에 대한 포인터입니다.

Kickass GitHub 프로필 페이지를 만드는 방법

새로운 특수 리포지토리 및 GitHub 작업으로 놀라운 GitHub 프로필을 만듭니다.

Kickass GitHub 프로필 페이지를 만드는 방법

이 자습서는 비디오로도 제공됩니다.이 링크를 클릭하십시오. 이 기사에서는 눈에 잘 띄고보기 좋은 Github 프로필 페이지를 만드는 방법을 볼 수 있습니다.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.