Git:将提交发送到另一个分支,这样我可以工作并合并回来,没有(非常慢)结账?

时间:2013-09-12 17:50:17

标签: git git-branch branching-and-merging

我有两个分支,main一个,我正在parallel发布。

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

parallel分支将始终从master合并。总是。并修改它。

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

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

但是,如果我正在处理parallel,我可以这样做而不切换分支吗? 切换的问题是需要很长时间才能来回specially on Unity 3D)!

所以说我在F,而主人仍在A。然后我想在主BC上做几次提交,然后将它们合并到G。如果不切换分支,我又该如何做呢?

3 个答案:

答案 0 :(得分:2)

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

该手册页指出:

  

一个git存储库可以支持多个工作树,使您一次签出多个分支

这意味着您无需切换分支,而只需在将活动从master切换到parallel或反之时更改目录即可。 由于没有额外的(克隆的)存储库,因此无需像推送,合并或获取操作那样管理它,也没有配置麻烦。

为分支parallel添加其他工作树:

git worktree add path/to/new-worktree parallel

答案 1 :(得分: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正常工作。如果你要从并行到高手合并,只需在切换之前推动另一种方式,它的工作方式相同。

答案 2 :(得分:0)

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

git(1) manual page中所述,通过使用环境变量,可以为给定的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名称写入stdout。
  2. 获取分支“master”指向的提交的SHA-1名称。
  3. 使用在上一步获得的提交的SHA-1名称作为父提交创建提交对象。提交对象的名称将打印到stdout。
  4. 更新分支“master”以指向新的提交对象。
  5. 这只使用管道命令在相当低的级别上运行,但不在存储库中触摸HEAD,因此允许在原始工作树中正常工作。

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