2

我有 2 个分支,main一个和一个我正在parallel发布的分支。

A --> B --> C (master)
  \
   -> E --> F (parallel)

分支将parallel始终从master. 总是。并对其进行修改。

A --> B --> C --> D --> H  (master)
  \           \ *merge*
   -> E --> F --> G --> J  (parallel)

如果我切换分支,这很容易做到。

但是,如果我正在工作,我可以在不切换分支parallel的情况下做到这一点吗?切换的问题是来回需要很长时间特别是在 Unity 3D 上)!

所以说我在F,而主人还在A。然后我想在 master 上做一些提交BC然后将它们合并到G. 在不切换分支的情况下,我将如何再次做到这一点?

4

3 回答 3

2

(现在)有一个更容易使用的解决方案git worktree:您将获得共享相同存储库数据的其他工作树(即结帐)。

手册页指出:

一个 git 存储库可以支持多个工作树,允许您一次检出多个分支

这意味着您不需要切换分支,而只需在“切换”活动时更改目录,master反之亦然parallel。由于没有额外的(克隆的)存储库,因此在管理它时没有像推送、合并或获取操作这样的开销,也没有配置麻烦。

为分支添加额外的工作树parallel

git worktree add path/to/new-worktree parallel
于 2018-12-20T23:43:35.367 回答
1

要同时在两个分支上工作,请在并行克隆之间推送。

# one-time setup: 
new=parallel-master
git clone . ../$new -b master
git remote add $new ../$new

切换到主:

cd ../parallel-master
# work work commit commit lalala

切换回来:

git push origin master
cd ../main

这就是它所需要的,git merge正常工作。如果您要从并行合并到主,只需在切换之前推动另一种方式,两种方式都一样。

于 2013-09-13T19:04:19.507 回答
0

使用低级(管道)Git 命令和单独的工作树和索引可能会实现您想要的。

git(1)手册页中所述,通过使用环境变量,可以为给定的 Git 存储库创建单独的工作树,基本上:

$ mkdir foo && cd $_
$ export GIT_DIR=/path/to/the/repo/.git
$ export GIT_INDEX_FILE="$(pwd)/.index"
$ git read-tree master
$ git checkout-index -a -u

现在更新工作树中的文件并暂存更改(git add等),然后

$ editor /tmp/COMMIT_MSG
$ git update-ref refs/heads/master $(git commit-tree $(git write-tree) -p $(git rev-parse master) </tmp/COMMIT_MSG)

这:

  1. 从索引 ( git write-tree) 创建一棵树并将其 SHA-1 名称写入标准输出。
  2. 获取分支“master”指向的提交的 SHA-1 名称。
  3. 使用在上一步中获得的提交的 SHA-1 名称作为父提交创建一个提交对象。提交对象的名称打印到标准输出。
  4. 更新分支“master”以指向新的提交对象。

这仅使用管道命令在相当低的级别上运行,但不涉及HEAD存储库,因此允许在原始工作树中正常工作。

这是可编写脚本的,但太麻烦了,所以我只是尝试使用Git 部分中git-new-workdir可用的脚本——它设置了一个单独的工作树,链接到原始存储库,不包括可能破坏工作的关键内容原始工作树。因此,您可以创建新的工作树,将“master”签入其中,在其上记录新提交,然后将它们安全地合并到已签入“并行”的原始工作树中。contribHEAD

于 2013-09-13T14:58:37.333 回答