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 文件夹(如更改配置)并将其提交到我的 master 分支,我也可以切换到我的 vanilla 分支以获取更新。我的问题是当我尝试将分支合并在一起时

git checkout vanilla
git pull
git checkout master
git merge --squash -s subtree --no-commit vanilla
git commit -a -m "update commit"

问题是“更新提交”在我的提交之上并“覆盖”了我的更改。我宁愿在更新的基础上重播我的提交。有没有一种简单的方法可以做到这一点?我不太擅长 git,所以也许这是错误的方法。此外,我真的不想将我的历史与香草历史混为一谈。

4

4 回答 4

3

如果您希望使用子树,您可能想要使用git subtree. 它为这类事情提供了一个更加用户友好的界面,包括合并/拉取命令以合并到子树中(压缩是可选的)和拆分/推送命令将更改拆分回子树并将它们发送回自己的回购。

于 2011-06-25T18:51:06.007 回答
3

我完成了这个方案:

  1. 在我的开发分支上工作,触摸子树中的文件。

  2. 使用压缩的开发提交更新子树分支:

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

  3. 使用其远程存储库更新子树分支。

  4. 使用压缩的子树提交 更新开发:

    git merge --squash -s 子树 --no-commit子树

于 2013-01-15T02:42:56.353 回答
1

使用

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

不会“覆盖”您的更改。我希望“更新提交”是指您在子树合并后所做的提交,因为它已经--no-commit并且不会自行提交。

于 2011-06-25T04:45:49.363 回答
0

我也不是 git 大师(看看我在那里做了什么 ;-) )......但是,我想你可能想看看 rebase 命令:

http://book.git-scm.com/4_rebasing.html

于 2011-06-25T00:48:09.560 回答