我有一个dev branch
用于分段,master branch
用于制作。在升级方面已经做了很多工作,现在我需要把事情转移到生产上。有一个我不想在生产时发布的功能,但它已被包含在拉取请求中以便掌握和合并。
我想要其中任何一个:
git pull
一切都要刺激我想要的东西,然后告诉我当地的回购&#34;删除&#34;一些具有该功能的提交。我尝试了一个git revert <commit #>
,但这导致了一些稳定性问题,我仍在努力进行分期。
答案 0 :(得分:1)
我可以“git pull”并忽略特定的提交吗?
没有
有一项我不想在制作时发布的功能,但它已被包含在掌握和合并的拉取请求中。
这通常是为什么Git工作流程指南建议不要将内容合并到master
,直到它们准备发布为止。
由于那艘船已经航行,我会考虑这些选择:
实施feature toggle以允许正在进行的功能保留在master
中,但在生产中已停用,直到它准备就绪。
在合并正在进行的功能之前创建一个新分支,作为构建新版本分支的起点。假设您还希望发布自那时以来已合并的功能,您可以merge
将其功能分支到新分支中,或者在特定提交中进行挑选。
从master
创建一个新分支,并使用revert
来展开属于正在进行的功能的提交。
正如您已经发现的那样,选项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
现在,如果您想要D
,E
,F
和H
,请运行:
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
)。git merge
(例如,您对H
不感兴趣),则不会更改历史记录,以后可以直接合并G
,H
,I
而不会发生冲突(只需快速转发本地分支机构)。