GIT:如何在保持大量分叉的同时避免重复提交?

时间:2009-11-08 21:26:36

标签: git format-patch

我有一个带有“基站”的基础存储库,我克隆它来创建我的客户端站点,所以我工作,进行提交,推送到客户端fork,然后我意识到在我的提交过程中有一个或者必须合并到基础存储库的更多内容。这就是我所做的:

git format-patch -1 SHA

然后我转到“基站”存储库并执行:

git am -3 patch_file

没关系。问题是当我想将更改从“基站”提取到客户端repo时,提交是重复的。

有没有办法避免这种情况?也许是一个不同的工作流程?

修改

事实上我仍然遇到问题,我的解释并不那么明确。让我再试一次:

我有一个基础存储库,其中包含'docs','layout','pub'和'sql'文件夹,'docs'和'layout'文件夹中只有一个空白的'index.html'。在'pub'文件夹中我安装了Joomla。

当我有一个新客户端时,我创建了他的目录并初始化了一个存储库,然后我添加了一个指向基本裸存储库的远程“base”,获取它,checkout base / master然后执行'checkout -b master'到从基础主分支创建主分支。然后我在我的本地服务器中创建一个'clone --bare'并在本地工作站中从中克隆。我们在需要时保存文档,设计师制作布局然后将其全部提交并推送到客户端的裸仓库。我们总是在推送之前做一个'rebase origin / master',以确保本地回购是最新的。

因此,当完成并推送布局时,我将其拉出并开始制作Joomla模板。所以我做了很多提交,然后我意识到我必须在Joomla组件中进行更改才能正常工作。好的,我更改了一个组件,提交并继续创建模板,提交,......

现在我想把所有组件的提交带到'基础回购',因为我希望我的所有客户都有相同的更改。当我尝试@jleedev解决方案时,我所有客户端的提交都转到了顶部,重写了已经在客户端裸机库中的SHA。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

是的! git-pull命令执行提取,然后执行合并。合并对你大吼大叫,因为你有相同的补丁表示为两个具有不同名称的提交。

如果您执行git-pull --rebase或两步等效的git fetch; git rebase origin/master,则会将您的本地更改重新定位到上游。

让我们说你的回购看起来像这样; master包含您在客户端中完成的工作,origin/master表示您已应用电子邮件补丁的上游基础。获取后,您会看到两个不同的分支,但您导出的提交都在两行中。

~/client-site$ git fetch origin master

GitX中看起来像这样:

After the fetch http://grab.by/m1T

当你rebase时,client上的所有提交都不在base中,将它们从提交转换为补丁,并将它们逐个应用到上游头部。当它注意到两个提交表达相同的补丁时,它们会被压缩为一个(上游提交生命,本地提交死亡)。

~/client-site$ git rebase origin/master

After the rebase http://grab.by/m1X

正如@roe所提到的,可能有更好的方法来保持您的存储库同步,例如挑选您需要的提交然后推送它。当您进行rebase时很可能遇到问题,但是您描述使用format-patch导出补丁的工作流程的方式似乎非常安全。