关于java:接上篇Git-Worktree-高级使用这样清爽多了

10次阅读

共计 4502 个字符,预计需要花费 12 分钟才能阅读完成。

前言

上一篇文章 Git Worktree 大法真香 带大家理解了 git worktree 是如何帮忙我同时在多个分支工作,并且互不影响的。然而创立 worktree 的目录地位不是在以后我的项目下,总感觉创立好的这些 worktree 不属于以后我的项目,这对于磁盘治理强迫症的我来说是非常好受的,明天就带大家理解一种高级用法来解决这个痛点

筹备常识

在应用高级用法之前,你须要晓得一点 bare repo 常识,咱们先从你相熟的命令开始

git init
git clone https://github.com/FraserYu/amend-crash-demo.git

这两个命令就会生成一个 non-bare repo,咱们通常都在这样的 repo 中进行日常工作, 你能够在这外面 add/commit/pull/push

要想生成一个 bare repo 也很简略, 只需在下面两个命令的根底上加上 --bare 参数即可

git init --bare
git clone --bare https://github.com/FraserYu/amend-crash-demo.git

来执行这两个 clone 命令,并查看文件内容你就会看出差异了

  1. bare repo 仅仅蕴含 Git 相干信息,并不蕴含咱们的理论我的项目文件(.java/.js/.py), 而 non-bare repo 却蕴含咱们的全副信息
  2. bare repo 名称默认是带有 .git 后缀的,这也恰好证实了第一点
  3. bare repo 中是不存在 .git 文件夹的,这也就导致它不能像 non-bare repo 那样 add/commit/pull/push

看到这,你可能感觉 bare repo 就是一个 Git 空壳文件夹,一无是处。其实不然,正因为 bare repo 的这些个性(不能对它进行更改),也就防止 repo 外面的内容被弄的一团糟,所以能够被用来做公有的中心化 repo,一张图解释,其实就是这样的:

如果你有趣味,能够依照上面的命令在本地试验一下整个过程:

user@server:$~  git init --bare name_to_repo.git

user@machine1:$~ git clone user@server:/path/to/repo/name_to_repo.git .
user@machine1:$~ cd name_to_repo
user@machine1:$~ touch README
user@machine1:$~ echo "Hello world" >> README
user@machine1:$~ git add README
user@machine1:$~ git commit -m "Adding a README"
user@machine1:$~ git push origin master

user@server:$~ ls /path/to/repo/name_to_repo.git/
branches/ config description HEAD hooks/ info/ objects/ refs/

user@machine2:$~ git clone user@server:/path/to/repo/name_to_repo.git .
user@machine2:$~ ls name_to_repo.git/
README
user@machine2:$~ cat README
Hello world

试验后果就是:无论在 machine1 下怎么 push 文件,bare repo 中都不会存在你 push 的文件,只有 Git 相干信息。然而 machine2 clone 最新的 repo 时,却能看到 machine1 push 的文件,这正是 Git 的魔法所在

到这里,bare repo 就解释完了。接下来,接上一篇 Git Worktree 大法真香 内容,借助 bare repo 的个性,来优化同时在多个分支工作的做法吧

Git Worktree 高级用法

首先,在你选定的目录下为你的我的项目(比方这里叫 amend-crash-demo)独自创立一个文件夹, 并 cd 进去

mkdir amend-crash-demo
cd amend-crash-demo

接下来以 bare 的模式 clone 我的项目代码, 并将内容 clone 到 .bare 文件夹内:

git clone --bare git@github.com:FraserYu/amend-crash-demo.git .bare

咱们还要在当前目录下创立一个 .git 文件 ,文件内容是以 gitdir 的模式指向咱们的 .bare 文件夹(如果不了解 gitdir 的含意,请回看 Git Worktree 大法真香)

echo "gitdir: ./.bare" > .git

而后咱们要编辑 .bare/config 文件,并批改 [remote "origin"]内容,和上面内容保持一致(也就是增加第 6 行内容),这确保咱们创立 worktree 切换分支,能够显示正确的分支名称

vim .bare/config

# -----------------------------------------------
 [remote "origin"]
       url = git@github.com:FraserYu/amend-crash-demo.git
       fetch = +refs/heads/*:refs/remotes/origin/*

接下来咱们就能够创立 worktree 了,首先咱们要为 main 分支创立 worktree,因为 main 分支 HEAD 的指向的 commit-ish 就是你创立其余 worktree 的 commit-ish

git worktree add main

# --------------------------------
Preparing worktree (checking out 'main')
HEAD is now at 82b8711 add main file

通常咱们不会间接在 main 分支上间接工作,而是创立其它类型的分支,持续创立名为 feature/JIRA234-feature3 的 worktree

git worktree add -b "feature/JIRA234-feature3" feature3

# ------------------------------------------------
Preparing worktree (new branch 'feature/JIRA234-feature3')
HEAD is now at 82b8711 add main file

查看以后文件夹的内容,你会发现只有 mainfeature3 两个文件夹(因为 .bare.git 是暗藏文件夹 / 文件),这样是不是相当清新呢?

ls -l

# -------------------------------------------
total 0
drwxr-xr-x  10  rgyb  staff  320 Nov 23 21:44 feature3
drwxr-xr-x  10  rgyb  staff  320 Nov 23 21:36 main


ls -al
# -------------------------------------------
total 8
drwxr-xr-x   6  rgyb  staff  192 Nov 23 21:44  .
drwxr-xr-x   3  rgyb  staff   96 Nov 23 21:14   ..
drwxr-xr-x  12  rgyb  staff  384 Nov 23 21:36  .bare
-rw-r--r--   1  rgyb  staff   16 Nov 23 21:29   .git
drwxr-xr-x  10  rgyb  staff  320 Nov 23 21:44  feature3
drwxr-xr-x  10  rgyb  staff  320 Nov 23 21:36  main

接下来就能够纵情的在咱们的各种分支上,彼此互不影响的进行 add/commit/pull/push 操作了

echo "feature3 development" > feature3.yaml
git add feature3.yaml

git commit -m "feat: [JIRA234-feature3] feature3 development"
# ------------------------------------------------------------------
[feature/JIRA234-feature3 aeaac94] feat: [JIRA234-feature3] feature3 development
 1 file changed, 1 insertion(+)
 create mode 100644 feature3.yaml

git push --set-upstream origin feature/JIRA234-feature3

通过上一篇文章 worktree 的四个命令,多分支协同开发不再是问题:

git worktree add
git worktree list
# ------------------------------------------------------------------------------------------------
/Users/rgyb/Documents/projects/amend-crash-demo/.bare        (bare)
/Users/rgyb/Documents/projects/amend-crash-demo/feature3   aeaac94 [feature/JIRA234-feature3]
/Users/rgyb/Documents/projects/amend-crash-demo/main        82b8711 [main]

git worktree remove
git worktree prune

总结

通过借助 bare repo 的个性,咱们能够十分整洁的将所有 worktree 只治理在以后我的项目目录下,多分支协同开发,就像这样:

.
└── amend-crash-demo
    ├── feature3
    │   ├── README.md
    │   ├── config.yaml
    │   ├── feat1.txt
    │   ├── feature3.yaml
    │   ├── file1.yaml
    │   ├── hotfix.yaml
    │   ├── main.properties
    │   └── main.yaml
    └── main
        ├── README.md
        ├── config.yaml
        ├── feat1.txt
        ├── file1.yaml
        ├── hotfix.yaml
        ├── main.properties
        └── main.yaml

3 directories, 15 files

如果你有磁盘治理强迫症,这相对是个好方法。

如果你想更好的了解整个过程,你须要在操作本文命令的同时,查看 Git 相干的文件信息

有什么问题,留言区交换

参考

  1. https://www.blopig.com/blog/2…
  2. https://lists.mcs.anl.gov/pip…
  3. https://www.saintsjd.com/2011…
  4. https://infrequently.org/2021…
  5. https://morgan.cugerone.com/b…

日拱一兵 | 原创

正文完
 0