如何挑选文件的特定提交?

时间:2015-10-07 07:28:59

标签: git git-cherry-pick

我有2个分支:FeatureBranchReleaseBranch

我确实从c1FeatureBranch选择了提交ReleaseBranch的文件。 后来我对FeatureBranch&上的同一个文件做了一些修改。使用身份c2提交。

我再次在FeatureBranch上增强了相同的文件并使用ID c3进行了提交。

现在我不希望c2加入ReleaseBranch,我只需要c3。我尝试用c3 id直接挑选,但是Git返回了一个错误:

  

无法应用c3 ......

我知道Git中的Index是增量的,因为我不希望c2更改,我只需要c3。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

首先:您要维护两个不同版本的代码,一个在FeatureBranch上,一个在ReleaseBranch上。您开始看到拥有两个“实时”版本代码的负面影响 我不知道你的约束是什么,但“将功能集成到发布中,或者放弃功能”应该成为你眼前计划中的一个优先里程碑。

您正在针对该文件发生冲突。 git无法以直截了当的方式应用c3,因为c2引入了一些更改,这会将修补程序c2 -> c3转换为无法在Release上应用的内容。

您必须手动编辑冲突才能修复它,然后提交结果。

如果c2中的更改很容易丢弃,另一种方法是丢弃当前的挑选,获取文件的完整内容,并编辑它以删除您不想提交的更改发布时间:

# -- from ReleaseBranch

# cancel the cherry-picking :
git cherry-pick --abort

# get the content of the file stored in c3 (will contain modifs from c1+c2+c3) :
git checkout c3 -- path/to/file

# edit the file to remove unwanted code ...

# add and commit
git add path/to/file
git commit

答案 1 :(得分:1)

在功能分支上恢复c2(或从功能分支创建单独的分支并在那里恢复)使c4和樱桃选择它。 我假设Release分支可以重置为c1之前的状态。

git checkout -b RevertFeatureC2 FeatureBranch
git revert C2

OPTION1 - 干净的MasterBranch - 没有C1 C2(但即使已经有C1 C2,也许它会工作)

git checkout MasterBranch
# then cherry pick or merge from RevertFeatureC2

OPTION2 - 如果可以覆盖整个文件 - MasterBranch中没有单独的更改(请仔细检查):

git checkout ResetFeatureC2 the_file.xyz