목차
我们面对的场景
git-worktree
git worktree add
우리가 직면한 시나리오
git worktree list
git worktree remove
git worktree prune
总结
灵魂追问
개발 도구 자식 Git 브랜치를 전환하지 않고 동시에 여러 브랜치에서 작업하는 방법을 알려줍니다(상세 예시).

Git 브랜치를 전환하지 않고 동시에 여러 브랜치에서 작업하는 방법을 알려줍니다(상세 예시).

Feb 22, 2022 pm 05:13 PM
git

이 글은 Git 브랜치에 대한 관련 지식을 주로 소개하며, 브랜치를 전환하지 않고 여러 브랜치에서 작업하는 방법에 대해 소개합니다.

Git 브랜치를 전환하지 않고 동시에 여러 브랜치에서 작업하는 방법을 알려줍니다(상세 예시).

특정 기능을 개발하다 갑자기 사장님이 튀어나오셔서 제작을 위한 핫픽스를 만들어 달라고 하십니다. 이런 상황에 직면한 우리 Git을 사용하는 사람들은 대개 두 가지 해결책을 가지고 있습니다.

  1. 급하게 제출하세요. 완료되지 않은 기능인 경우 브랜치를 hotfix

  2. git stash | git stash pop으로 전환하여 작업 내용을 임시로 저장한 다음 hotfixgit stash | git stash pop 暂存工作内容,然后再切换到 hotfix

第二种方式较第一种还好很多,可是面对下面这些场景,stash 依旧不是很好的解决方案

我们面对的场景

  1. 正在 main 分支上跑长时间的测试,切换到 hotfix 或 feature, 测试就会中断

  2. 项目非常大,频繁的切换索引,成本非常高

  3. 有几年前 release 的旧版本,设置和当前不一样,IDE restructure 适配切换也会带来很大的开销

  4. 切换分支,需要重新设置相应的环境变量,比如 dev/qa/prod

  5. 需要切换到同事的代码,帮助调试代码复现问题

有的同学想到,git clone 多个 repo 不就可以了吗?这是解决上述问题的一个方法,但背后同样隐藏很多问题:

  1. 多个 repo 的状态是不好同步的,比如没办法快速 cherry-pick, 一个 repo checkout 的分支,另外一个 repo 需要重新 checkout

  2. git history/log 是重复的,当项目历史非常长,.git 文件夹下的内容是非常占用磁盘空间的

  3. 同一个项目,多个 repo,不易管理

那如何做才能满足这些特殊场景,又不出现这些上述这些问题呢?

git-worktree

其实,这是 Git 2015 年就开始支持的功能,却很少有人知道它,git-worktree 的使用非常方便,在终端输入:

git worktree --help
로그인 후 복사

就可以快速看到帮助文档说明:

Git 브랜치를 전환하지 않고 동시에 여러 브랜치에서 작업하는 방법을 알려줍니다(상세 예시).

用简单的话来解释 git-worktree 的作用就是:

仅需维护一个 repo,又可以同时在多个 branch 上工作,互不影响

上面红色框线命令有很多,我们常用的其实只有下面这四个:

git worktree add [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<commit-ish>]
 git worktree list [--porcelain]
 git worktree remove [-f] <worktree>
 git worktree prune [-n] [-v] [--expire <expire>]
로그인 후 복사

在展开说明之前,需要和大家普及两个你可能忽视的 Git 知识点:

  1. 默认情况下, git initgit clone 初始化的 repo,只有一个 worktree,叫做 main worktree

  2. 在某一个目录下使用 Git 命令,当前目录下要么有 .git 文件夹;要么有 .git 文件,如果只有 .git 文件,里面的内容必须是指向 .git 文件夹的

第二句话感觉挺绕的,下面用例子说明,就很容易明白了

如果您正在学习Spring Cloud,推荐一个连载多年还在继续更新的免费教程:https://blog.didispace.com/spring-cloud-learning/

git worktree add

当前项目目录结构是这样的(amend-crash-demo 是 repo 的 root):

.
└── amend-crash-demo

1 directory
cd amend-crash-demo` 运行命令 `git worktree add ../feature/feature2
➜  amend-crash-demo git:(main) git worktree add ../feature/feature2
Preparing worktree (new branch &#39;feature2&#39;)
HEAD is now at 82b8711 add main file
로그인 후 복사

重新看目录结构

.
├── amend-crash-demo
└── feature
    └── feature2

3 directories
로그인 후 복사

该命令默认会根据 HEAD 所在的 commit-ish (当然也可以指定 git log 中的任意一个 commit-ish) 创建一个名为 feature2 的分支,分支磁盘位置如上面结构所示

cd ../feature/feature2/ 会发现,这个分支下并不存在 .git 文件夹,却存在一个 .git

로 전환하세요. 첫 번째가 훨씬 낫지만 다음 시나리오에 직면했을 때 stash는 여전히 좋은 솔루션이 아닙니다

우리가 직면한 시나리오

는 메인브랜치 핫픽스나 기능으로 장기간 전환하면 테스트가 중단됩니다🎜🎜🎜🎜프로젝트 규모가 매우 크고 잦은 인덱스 전환으로 인해 비용이 많이 듭니다🎜🎜🎜🎜몇 년 전에 이전 버전이 출시되었으나, IDE 재구성 적응 전환도 오버헤드가 많이 발생합니다.브랜치를 전환할 때 dev/qa/prod와 같은 해당 환경 변수를 재설정해야 합니다. 질문🎜🎜🎜일부 학생들은 여러 저장소를 git clone하는 것만으로는 충분하지 않다고 생각했습니다. 이는 위의 문제를 해결하는 방법이지만 그 뒤에는 많은 문제도 숨겨져 있습니다. 🎜🎜🎜🎜여러 저장소의 상태는 동기화하기가 쉽지 않습니다. 예를 들어 하나의 저장소를 빠르게 선별할 수 있는 방법이 없습니다. checkout 브랜치, 또 다른 repo를 다시 checkout해야 합니다.🎜🎜🎜🎜git 히스토리/로그가 반복되면 프로젝트 히스토리가 너무 길어지면 .git 폴더의 내용이 많이 차지하게 됩니다. 디스크 공간🎜🎜🎜🎜동일한 프로젝트, 여러 개의 저장소, 관리하기 어려움🎜🎜🎜그러면 위의 문제를 일으키지 않고 이러한 특별한 시나리오를 충족하려면 어떻게 해야 할까요? 🎜

git-worktree

🎜사실 Git이 2015년부터 지원해온 기능이지만, git-worktree가 사용하기 매우 편리하다는 사실을 아는 사람은 거의 없습니다. 터미널에 입력하세요:🎜
gitdir: /Users/rgyb/Documents/projects/amend-crash-demo/.git/worktrees/feature2
로그인 후 복사
🎜도움말 문서를 빠르게 볼 수 있습니다:🎜🎜f4ef3ce459f013a4c3b5c6e710 9297a9 .png🎜🎜git-worktree의 기능을 간단한 단어로 설명하세요: 🎜🎜🎜하나의 저장소만 유지하면 되며 서로 영향을 주지 않고 동시에 여러 분기에서 작업할 수 있습니다🎜
🎜위의 빨간색 상자 줄 명령은 많지만 일반적으로 사용되는 네 가지 명령만 사용합니다. 🎜
git worktree add ../hotfix/hotfix/JIRA234-fix-naming
로그인 후 복사
로그인 후 복사
🎜설명을 시작하기 전에 간과했을 수 있는 두 가지 Git 지식 포인트를 대중화해야 합니다. 🎜🎜 🎜🎜기본적으로 git init 또는 git clone 초기화 저장소에는 main worktree라는 worktree가 하나만 있습니다. 🎜🎜🎜🎜특정 디렉터리 명령에서 Git을 사용하면 현재 디렉터리에 .git 폴더가 있거나 .git 파일만 있는 경우입니다. >.git 파일, 그 안의 내용은 🎜🎜🎜 .git 폴더를 가리킵니다. 두 번째 문장은 약간 혼란스러운 것 같지만 예를 들어 설명하겠습니다. 이해하기 쉬울 거예요🎜🎜🎜Spring Cloud를 배우고 있다면 추천합니다. 수년간 연재되어 계속 업데이트되는 무료 튜토리얼: https://blog.didispace.com/spring-cloud-learning/🎜

git worktree add

🎜 현재 프로젝트 디렉터리 구조는 다음과 같습니다(amend-crash-demo는 저장소의 루트입니다) : 🎜
.
├── amend-crash-demo
├── feature
│   └── feature2
└── hotfix
    └── hotfix
        └── JIRA234-fix-naming

6 directories
로그인 후 복사
로그인 후 복사
🎜디렉토리 구조를 검토하세요🎜
git worktree add -b "hotfix/JIRA234-fix-naming" ../hotfix/JIRA234-fix-naming
로그인 후 복사
로그인 후 복사
🎜이 명령은 HEAD가 있는 commit-ish를 기본값으로 지정합니다(물론 git 로그에서 모든 커밋을 지정할 수도 있음). 브랜치 디스크 위치는 feature2입니다. 🎜🎜cd ../feature/feature2/ 이 브랜치는 .git 폴더는 없지만 < code>.git 파일을 열어보면 내용은 다음과 같습니다. 🎜
.
├── amend-crash-demo
├── feature
│   └── feature2
└── hotfix
    ├── JIRA234-fix-naming
    └── hotfix
        └── JIRA234-fix-naming

7 directories
로그인 후 복사
로그인 후 복사
🎜이쯤 되면 위의 내용을 이해할 수 있습니다. 2. 훨씬 명확해졌나요? 🎜🎜🎜다음으로, 메인 작업 트리를 방해하지 않고 feature2 브랜치(추가/커밋/풀/푸시)에서 원하는 모든 작업을 수행할 수 있습니다🎜

一般情况下,项目组都有一定的分支命名规范,比如 feature/JIRAID-Title, hotfix/JIRAID-Title, 如果仅仅按照上面命令新建 worktree,分支名称中的 / 会被当成文件目录来处理

git worktree add ../hotfix/hotfix/JIRA234-fix-naming
로그인 후 복사
로그인 후 복사

运行完该命令,文件目录结构是这样的

.
├── amend-crash-demo
├── feature
│   └── feature2
└── hotfix
    └── hotfix
        └── JIRA234-fix-naming

6 directories
로그인 후 복사
로그인 후 복사

很显然这不是我们想要的,这时我们就需要 -b 参数的支持了,就像 git checkout -b 一样

执行命令:

git worktree add -b "hotfix/JIRA234-fix-naming" ../hotfix/JIRA234-fix-naming
로그인 후 복사
로그인 후 복사

再来看一下目录结构

.
├── amend-crash-demo
├── feature
│   └── feature2
└── hotfix
    ├── JIRA234-fix-naming
    └── hotfix
        └── JIRA234-fix-naming

7 directories
로그인 후 복사
로그인 후 복사

进入 JIRA234-fix-naming 目录,默认是在 hotfix/JIRA234-fix-naming 分支上

Git 브랜치를 전환하지 않고 동시에 여러 브랜치에서 작업하는 방법을 알려줍니다(상세 예시).

worktree 建立起来很容易,不加管理,项目目录结构肯定乱糟糟,这是我们不想看到的,所以我们需要清晰的知道某个 repo 都建立了哪些 worktree

git worktree list

所有的worktree 都在共用一个 repo,所以在任意一个 worktree 目录下,都可以执行如下命令来查看 worktree 列表

git worktree list
로그인 후 복사

执行完命令后,可以查看到我们上面创建的所有 worktree 信息, main worktree 也会显示在此处

/Users/rgyb/Documents/projects/amend-crash-demo                        82b8711 [main]
/Users/rgyb/Documents/projects/chore/chore                                   8782898 (detached HEAD)
/Users/rgyb/Documents/projects/feature/feature2                             82b8711 [feature2]
/Users/rgyb/Documents/projects/hotfix/hotfix/JIRA234-fix-naming     82b8711 [JIRA234-fix-naming]
/Users/rgyb/Documents/projects/hotfix/JIRA234-fix-naming              82b8711 [hotfix/JIRA234-fix-naming]
로그인 후 복사

worktree 的工作做完了,也是要及时删除的,否则也会浪费很多磁盘空间

另外,如果您正在学习Spring Cloud,推荐一个连载多年还在继续更新的免费教程:https://blog.didispace.com/spring-cloud-learning/

git worktree remove

这个命令很简单了,worktree 的名字叫什么,直接就 remove 什么就好了

git worktree remove hotfix/hotfix/JIRA234-fix-naming
로그인 후 복사

此时,分支名弄错的那个 hotfix 就被删掉了

/Users/rgyb/Documents/projects/amend-crash-demo                        82b8711 [main]
/Users/rgyb/Documents/projects/chore/chore                                   8782898 (detached HEAD)
/Users/rgyb/Documents/projects/feature/feature2                             82b8711 [feature2]
/Users/rgyb/Documents/projects/hotfix/JIRA234-fix-naming              82b8711 [hotfix/JIRA234-fix-naming]
로그인 후 복사

假设你创建一个 worktree,并在里面有改动,突然间这个worktree 又不需要了,此刻你按照上述命令是不能删掉了,此时就需要 -f 参数来帮忙了

git worktree remove -f hotfix/JIRA234-fix-naming
로그인 후 복사

删除了 worktree,其实在 Git 的文件中,还有很多 administrative 文件是没有用的,为了保持清洁,我们还需要进一步清理

git worktree prune

这个命令就是清洁的兜底操作,可以让我们的工作始终保持整洁

总结

到这里,你应该理解,整个 git-worktree 的使用流程就是下面这四个命令:

git worktree add
git worktree list
git worktree remove
git worktree prune
로그인 후 복사

你也应该明白 git worktree 和 git clone 多个 repo 的区别了。只维护一个 repo,创建多个 worktree,操作间行云流水

我的实践:通常使用 git worktree,我会统一目录结构,比如 feature 目录下存放所有 feature 的worktree,hotfix 目录下存放所有 hotfix 的 worktree,这样整个磁盘目录结构不至于因为创建多个 worktree 而变得混乱

在磁盘管理上我有些强迫症,理想情况下,某个 repo 的 worktree 最好放在这个 repo 的文件目录里面,但这就会导致 Git track 新创建的 worktree 下的所有文件,为了避免 Git track worktree 的内容,来来回回修改 gitignore 文件肯定是不合适的!

那么如何解决呢?点击下方卡片,关注“日拱一兵”,正在连载Git的高级技巧!

灵魂追问

  1. 可以删除 main worktree 吗?为什么

  2. 反复创建和删除worktree, repo/.git/wortree 目录的变化你能理解吗?

推荐学习:《Git教程

위 내용은 Git 브랜치를 전환하지 않고 동시에 여러 브랜치에서 작업하는 방법을 알려줍니다(상세 예시).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

DeepSeek을 설치하는 방법 DeepSeek을 설치하는 방법 Feb 19, 2025 pm 05:48 PM

Docker 컨테이너를 사용하여 사전 컴파일 된 패키지 (Windows 사용자의 경우)를 사용하여 소스 (숙련 된 개발자)를 컴파일하는 것을 포함하여 DeepSeek를 설치하는 방법에는 여러 가지가 있습니다. 공식 문서는 신중하게 문서를 작성하고 불필요한 문제를 피하기 위해 완전히 준비합니다.

깊은 사용을위한 FAQ 요약 깊은 사용을위한 FAQ 요약 Feb 19, 2025 pm 03:45 PM

Deepseekai 도구 가이드 및 FAQ Deepseek은 강력한 AI 지능형 도구입니다. FAQ : 다른 액세스 방법의 차이 : 웹 버전, 앱 버전 및 API 통화간에 기능에는 차이가 없으며 앱은 웹 버전의 래퍼 일뿐입니다. 로컬 배치는 증류 모델을 사용하는데,이 모델은 DeepSeek-R1의 정식 버전보다 약간 열등하지만 32 비트 모델은 이론적으로 90% 정식 버전 기능을 갖습니다. 선술집이란 무엇입니까? Sillytavern은 API 또는 Ollama를 통해 AI 모델을 호출 해야하는 프론트 엔드 인터페이스입니다. 중단 한도는 무엇입니까?

L뱅크 거래소에 등록하는 방법은 무엇입니까? L뱅크 거래소에 등록하는 방법은 무엇입니까? Aug 21, 2024 pm 02:20 PM

LBank에 등록하려면 공식 웹사이트를 방문하여 "등록"을 클릭하세요. 이메일과 비밀번호를 입력하고 이메일을 확인하세요. LBank 앱 iOS를 다운로드하세요. AppStore에서 "LBank"를 검색하세요. "LBank-DigitalAssetExchange" 애플리케이션을 다운로드하여 설치하세요. Android: Google Play 스토어에서 "LBank"를 검색하세요. "LBank-DigitalAssetExchange" 애플리케이션을 다운로드하여 설치하세요.

AI 도구는 무엇입니까? AI 도구는 무엇입니까? Nov 29, 2024 am 11:11 AM

AI 도구에는 Doubao, ChatGPT, Gemini, BlenderBot 등이 포함됩니다.

Grayscale 암호화 신탁 기금은 무엇입니까? Grayscale 암호화 신탁 기금은 무엇입니까? Mar 05, 2025 pm 12:33 PM

Grayscale Investment : Grayscale Investment Company는 기관 및 투자자에게 디지털 통화 투자 서비스를 제공합니다. 이 회사는 몇 가지 암호화 신탁을 출시했으며, 이는 시장의 광범위한 시장의 관심을 끌었지만, 이러한 자금이 토큰 가격에 미치는 영향은 크게 다릅니다. 이 기사는 Grayscale의 주요 Crypto Trust Funds 중 일부를 자세히 소개합니다. Grayscale Major Crypto Trust Fund는 Glance Grayscale Investment (2013 년 DigitalCurrencygroup이 설립 한)에서 제공되는 다양한 암호화 자산 신탁 기금을 관리하여 기관 투자자와 고격한 개인에게 준수 투자 채널을 제공합니다. 주요 자금에는 다음이 포함됩니다 : Zcash (Zec), Sol,

최고의 시장 제조업체가 암호화 시장에 진출함에 따라 Castle Securities는 업계에 어떤 영향을 미칩니 까? 최고의 시장 제조업체가 암호화 시장에 진출함에 따라 Castle Securities는 업계에 어떤 영향을 미칩니 까? Mar 04, 2025 pm 08:03 PM

최고 시장 제조업체 인 Castle Securities의 Bitcoin Market Maker에 진입하는 것은 Bitcoin 시장의 성숙도의 상징이며, 전통적인 금융 세력이 미래의 자산 가격 권력을 위해 경쟁하는 핵심 단계입니다. Bloomberg에 따르면 Citadel Securities는 2 월 25 일에 Cryptocurrencies의 유동성 제공 업체가 되고자합니다. 이 회사는 Coinbaseglobal, Binanceholdings 및 Crypto.com이 운영하는 거래소를 포함하여 다양한 거래소에서 시장 제조업체 목록에 가입하는 것을 목표로하고 있다고이 문제에 익숙한 사람들은 말했다. Exchange에 의해 승인되면이 회사는 처음에 미국 이외의 시장 제조업체 팀을 설립 할 계획이었습니다. 이 움직임은 징후 일뿐입니다

Delphi Digital : 새로운 Elizaos V2 아키텍처를 구문 분석하여 새로운 AI 경제를 바꾸는 방법은 무엇입니까? Delphi Digital : 새로운 Elizaos V2 아키텍처를 구문 분석하여 새로운 AI 경제를 바꾸는 방법은 무엇입니까? Mar 04, 2025 pm 07:00 PM

ELIZAOSV2 : AI의 새로운 경제를 이끌고 AI는 보조 도구에서 독립적 인 엔티티로 진화하여 AI가 자금을 관리하고 Web3 비즈니스를 운영 할 수 있습니다. 이 기사는 Elizaosv2의 주요 혁신과 그것이 AI 중심의 미래 경제를 형성하는 방법으로 뛰어들 것입니다. AI Automation : 독립적으로 Elizaos를 운영하는 것은 원래 Web3 자동화에 중점을 둔 AI 프레임 워크였습니다. V1 버전을 사용하면 AI가 스마트 계약 및 블록 체인 데이터와 상호 작용할 수있는 반면 V2 버전은 상당한 성능 향상을 달성합니다. AI는 간단한 지침을 실행하는 대신 워크 플로를 독립적으로 관리하고 비즈니스를 운영하며 재무 전략을 개발할 수 있습니다. 아키텍처 업그레이드 : 향상 a

SFT를 상당히 능가하는 O1/DeepSeek-R1의 비밀은 멀티 모달 대형 모델에서도 사용할 수 있습니다. SFT를 상당히 능가하는 O1/DeepSeek-R1의 비밀은 멀티 모달 대형 모델에서도 사용할 수 있습니다. Mar 12, 2025 pm 01:03 PM

상하이 Jiaotong University, Shanghai Ailab 및 Chinese University of Hong Kong의 연구원들은 Visual-RFT (Visual Enhancement Fine Tuning) 오픈 소스 프로젝트를 시작했으며, 이는 LVLM (Language Big Model)의 성능을 크게 향상시키기 위해 소량의 데이터 만 필요합니다. Visual-Rft는 영리하게 DeepSeek-R1의 규칙 기반 강화 학습 접근 방식을 OpenAI의 RFT (Rencement Fine Tuning) 패러다임과 결합 하여이 접근법을 텍스트 필드에서 시야로 성공적으로 확장합니다. Visual-RFT는 시각적 하위 분류 및 객체 감지와 같은 작업에 대한 해당 규칙 보상을 설계함으로써 텍스트, 수학적 추론 및 기타 필드로 제한되는 DeepSeek-R1 메소드의 한계를 극복하여 LVLM 교육을위한 새로운 방법을 제공합니다. Vis

See all articles