我有两个分支,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
。然后我想在主B
和C
上做几次提交,然后将它们合并到G
。如果不切换分支,我又该如何做呢?
答案 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)
此:
git write-tree
)创建一个树,并将其SHA-1名称写入stdout。这只使用管道命令在相当低的级别上运行,但不在存储库中触摸HEAD
,因此允许在原始工作树中正常工作。
这是可编写脚本但过于繁琐,所以我只是尝试使用Git的contrib
部分中提供的git-new-workdir
脚本 - 它设置了一个单独的工作树链接到原始存储库,不包括像HEAD
这样可能会破坏原始工作树中的工作的关键内容。因此,您可以创建新的工作树,在其中签出“master”,在其上记录新的提交,然后将它们安全地合并到已签入“并行”的原始工作树中。