我可以" git pull"并忽略特定的提交?

时间:2016-09-21 17:43:52

标签: git github git-commit

我有一个dev branch用于分段,master branch用于制作。在升级方面已经做了很多工作,现在我需要把事情转移到生产上。有一个我不想在生产时发布的功能,但它已被包含在拉取请求中以便掌握和合并。

我想要其中任何一个:

  1. 创建一个新分支并使用分段删除提交并将该分支设置为生产直到主分支准备就绪
  2. 继续git pull一切都要刺激我想要的东西,然后告诉我当地的回购"删除"一些具有该功能的提交。
  3. 我尝试了一个git revert <commit #>,但这导致了一些稳定性问题,我仍在努力进行分期。

2 个答案:

答案 0 :(得分:1)

  

我可以“git pull”并忽略特定的提交吗?

没有

  

有一项我不想在制作时发布的功能,但它已被包含在掌握和合并的拉取请求中。

这通常是为什么Git工作流程指南建议不要将内容合并到master,直到它们准备发布为止。

由于那艘船已经航行,我会考虑这些选择:

  1. 实施feature toggle以允许正在进行的功能保留在master中,但在生产中已停用,直到它准备就绪。

  2. 在合并正在进行的功能之前创建一个新分支,作为构建新版本分支的起点。假设您还希望发布自那时以来已合并的功能,您可以merge将其功能分支到新分支中,或者在特定提交中进行挑选。

  3. master创建一个新分支,并使用revert来展开属于正在进行的功能的提交。

  4. 正如您已经发现的那样,选项2和3将变得相当繁琐且容易出错,除非您在保持功能彼此隔离方面做得特别好。我不会准备单独版本的应用程序并删除正在进行的功能,而是会向您推荐选项1。

答案 1 :(得分:1)

嗯,是的,你可以,但这类似于创建一个新分支。

只需使用git fetch获取对象,然后您可以使用git log origin/master查看提交,并使用git merge <sha>git cherry-pick <sha>来仅获取您想要的提交。请注意,一旦开始这样做,您的历史记录将与origin/master不同,因此这基本上是分支。

使合并阶段更加清晰:

假设你在当地的主分支上:

A - B - C

在远程主分支上:

A - B - C - D - E - F - G - H - I

现在,如果您想要DEFH,请运行:

git fetch
git checkout -b master-production # better work on a new branch
git merge F                       # grab everything until F
git cherry-pick H                 # grab H

提交越小越原子化,它就越容易。 这最终会让你:

A - B - C - D - E - F - H'

H'H(不同的sha-1)的提交不同,但内容相似。

当然,这里的字母代表各自的sha-1总和。如前所述,您可以使用git log origin/master识别它们。

您应该注意以下几点:

  • 执行git pull确实只有git fetch origin; git merge origin/master(假设远程调用origin,而您的分支是master)。
  • 在上面的例子中,H&#39;是一个不同的提交(如果只是因为它有不同的父母,所以它的sha-1总和将是不同的。一旦你开始使用cherry-pick,你正在开发一个&#34;替代时间线&#34;。也就是说,你是支化。
  • 从上面的观点来看,您可以注意到,如果您仅使用git merge(例如,您对H不感兴趣),则不会更改历史记录,以后可以直接合并GHI而不会发生冲突(只需快速转发本地分支机构)。