2014-12-05 96 views
0

我在我们的Git仓库中有两个目录,在两个目录中的文件更新之间有大量的提交(大约400)提交,尽管没有提交包括在同一提交中的两个目录的更改。如何在合并时保护目录免受提交更改?

我们需要将我们的功能分支提交合并到主分支只有一个这些目录,保持另一个目录中的文件不变。这意味着我们不希望大约一半的提交适用于master。

什么是这样做的推荐方法?

回答

0

您无法合并单个提交,但您可以将git cherry-pick单独提交到您的主分支。使用git log来找出你想在主服务器上提交的SHA1,并使用git cherry-pick来应用它们。

这不是一个理想的解决方案,因为cherry-pick引入了一个与原始提交不同的新提交,因此您将在主分支和功能分支上提供基本上重复的提交。我尽量避免使用樱桃。它似乎可以解决您的问题,但请谨慎行事。

+0

我原计划用摘樱桃,但这种做法一对夫妇的问题是提交的数量庞大,而且不知道一个办法只能获取专门应用于功能部件的提交 – draca 2014-12-05 23:10:31

+0

您可以使用'git branch --contains '来确定提交所在的分支。但我同意,我不想在许多承诺中使用樱桃树。 – 2014-12-05 23:14:00

+0

关于只是复制目录的副本我不想更新,并在合并功能分支之后将其恢复......但我会通过执行“git reset directoryname; git checkout directoryname”来获取任何内容吗?我们真的不想添加不必要的增量,随后会取消。 – draca 2014-12-05 23:42:24

0

要合并所有dir1变更msater..featuremaster。合并只关心从合并基础到合并提示的内容差异,它并不关心你如何到达那里。因此,请提交具有正确的合并基础,只有内容的变化要合并:

git checkout -b feature-dir1-extract $(git merge-base master feature) 
git checkout feature -- dir1 
git commit -m "extracting dir1 changes from [email protected]$(git rev-parse feature)" 

你想现在你已经得到了所有的变化,您可以合并只是那些:

git checkout master 
git merge feature-dir1-extract 

这足以让git直接了解已合并的内容 - 当前内容的所有当前更改均显示在中,这正是具有正确合并基础的原因 - 但读取提交图(通过git log --graph或任何gui工具)也可以更容易地添加一经祖先合并记录,而不是仅仅不予置评事实上,同样的内容在两个分支截至目前:

git checkout feature 
git merge feature-dir1-extract # recording common content only, no changes 

无论如何,提取分支的名字和历史,现在有意思的唯一的人阅读提交历史本身,和名称和历史都记录在合并提交中。没有必要继续广告的名称大家无谓地想知道:

git branch -d feature-dir1-extract