Git:如何仅合并修改后的文件

时间:2010-06-24 13:59:50

标签: git merge branch

我有以下问题: 我们有一个大型产品,在主分公司。此外,我们还有其他只有少量文件的分支,这些文件仅限于此分支。每个分支代表主产品的插件。因此,例如,当您获得主要产品时,您会收到大量文件,安装它们等等。稍后当您决定购买插件时,您会收到一个仅包含多个文件的包,并上传这些文件(并替换原始文件)你安装了这个插件。

让我在master分支(以及许多其他文件)中有payment.php。而且我有paypal分支,它只有一个文件,即payment.php。现在我修复了master的payment.php中的一个错误,并希望将此修复程序合并到paypal分支中。但是,当我运行merge时,绝对所有文件都被添加到该分支。所以最终paypal分支拥有来自master分支的所有文件。您是否偶然知道如何解决这个问题?我希望GIT仅合并此分支中存在的文件,因此在上面的示例中,paypal分支应该只有一个文件(payment.php)并且错误修复已合并。

5 个答案:

答案 0 :(得分:4)

这就是为什么管理你的分支很重要,特别是使用主题分支和向上合并。

您应该在主题分支上进行修复,从需要修复的所有分支的共同祖先分叉,然后将其合并到master和paypal中:

x - x - x - x ------------- X (master)
|\                          |
| x - x - x ---- X (paypal) |
 \              /           /
  x (bugfix) ---------------

如果你已经制作了你的错误修正版,并且你错误地在主人身上而不是从适当的合并基础上创建了它,并且主人的历史记录尚未发布,那么你应该将它挑选或改装到正确的位置:

# If the bugfix commit is not at the tip of master, you can rebase to get it there:
git rebase -i <commit before the bugfix> master
# rearrange the list of commits to put the bugfix at the tip, save and quit

# Now either cherry-pick or rebase the commit to the right place
# (rebase is easier if the bugfix is actually several commits)

# Cherry-pick
# make a branch and cherry-pick
git checkout -b bugfix <SHA1 of merge base>
git cherry-pick <SHA1 of bugfix>
# remove the commit from master, assuming it's still on the tip
git checkout master
git reset --hard master^

# or rebase
# make the bugfix branch (assuming it's still on the tip)
git branch bugfix master
# and remove the commit from master (assuming it's still on the tip)
git checkout master
git reset --hard master^    # or if the bugfix is composed of n commits, master~n
# rebase the bugfix branch to the right place
git rebase --onto <SHA1 of merge base> master bugfix

如果历史已经已经发布,那么您所能做的就是将错误修正程序挑选到paypal分支上,并记住在下次正确执行该操作:

git checkout paypal
git cherry-pick <SHA1 of bugfix>

答案 1 :(得分:1)

为什么您的其他分支不包含属于主分支的所有文件?你只是通过去除所有其他文件的麻烦来让自己变得更难。特别是如果您以后最终需要更改已删除的其他文件。

答案 2 :(得分:1)

你做错了。你应该拥有分支中的所有文件。

Git的工作是跟踪分支机构之间的文件不同,而不是你的。 这是使用VCS的一个要点。

如果您只想分发不同分支的文件,可以通过脚本轻松提取这些文件。

答案 3 :(得分:0)

您可以执行与此类似的操作:http://nvie.com/git-model

(我希望这有效)

master将继续成为您的主要分支。您创建了一个名为bugfix的主分支。您创建了名为plugin-foo的错误修复的第三个分支。

在plugin-foo中删除所有不需要的文件。现在,每当您对不在插件分支中的文件进行更改时,您都可以在主分支上执行更改。所有错误修正都进入bugfix分支。您定期将错误修复分支合并到主分支和插件分支中。这导致错误修正进入这两个分支。

答案 4 :(得分:0)

在自己的git repo中隔离插件允许您在父项目上独立进行演变。

但是,如果您需要将它们直接包含在您的项目中,最近的Git版本(git1.7.11,2012年6月)包括git subtree script(之前的developed on GitHub apenwarr,现在合并为主线git)

这样,您可以将一个repo(及其历史记录)合并到另一个仓库中,保留稍后提取其历史记录的选项(与子树合并相反)。 这可以看作是git子模块的替代品。

另一种选择是git slave,以保持父回购和子模块紧密同步。