Git子树工作流程

3

在我的当前项目中,我正在使用一个开源论坛(https://github.com/vanillaforums/Garden)。我计划像这样做:

git remote add vanilla_remote https://github.com/vanillaforums/Garden.git
git checkout -b vanilla vanilla_remote/master
git checkout master
git read-tree --prefix=vanilla -u vanilla

这样,我可以对vanilla文件夹进行更改(比如更改配置),并将其提交到我的主分支。我还可以切换到我的vanilla分支以获取更新。但当我尝试合并这两个分支时遇到了问题。
git checkout vanilla
git pull
git checkout master
git merge --squash -s subtree --no-commit vanilla
git commit -a -m "update commit"

问题在于“更新提交”覆盖了我的提交并“覆盖”了我的更改。我更喜欢我的提交在更新之上重放。有没有简单的方法可以做到这一点?我不太擅长 git,所以也许这是错误的方法。此外,我真的不想将我的历史记录与原始历史记录混在一起。

1
我有同样的问题,我只想做这个(来自http://git-scm.com/book/en/Git-Tools-Subtree-Merging):“您的Rack项目中的所有更改都已合并并准备好在本地提交。您还可以执行相反的操作-在主分支的rack子目录中进行更改,然后稍后将它们合并到rack_branch分支中以提交给维护者或将其推送到上游。” 然后执行合并命令。他们提到了它,但没有示例命令。 - Rivera
@ernipiggy,你找到从子树推送的方法了吗? - abel
1
@abel 我尝试在下面解释一下 - Rivera
4个回答

3

如果你想使用子树进行工作,那么你可能需要使用git subtree。它提供了一种更加用户友好的界面来处理这种情况,包括合并/拉取命令来合并一个子树(压缩是可选的),以及拆分/推送命令来将对子树所做的更改拆分回来,并将其发送回到自己的存储库。


3
我完成了这个方案:
1. 在我的开发分支上处理子树中的文件。 2. 使用压缩的开发提交更新子树分支:
``` git merge -s subtree --squash --no-commit development ```
3. 从远程仓库更新子树分支。 4. 使用压缩的子树提交更新开发分支:
``` git merge --squash -s subtree --no-commit subtree ```

1

使用

git merge --squash -s subtree --no-commit vanilla

不会“覆盖”您的更改。我希望您所说的“更新提交”是指子树合并后执行的提交,因为它具有--no-commit选项,不会自动提交。


是的,完全正确。然而,从那个点开始,我能够获得正确的行为方式的唯一方法是进行交互式变基,并将该提交推回我的更改下,我并不是很喜欢这样做。 - Cedric

0

2
谢谢,但我不明白rebase命令如何有助于解决问题,因为这两个分支没有共同的“基础”。 - Cedric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接