Git merge / cherry-pick避免分期

时间:2018-04-24 07:35:34

标签: git merge git-merge cherry-pick git-cherry-pick

我试图通过一些更改来制作一个樱桃选择,但我不想在这个分支中提交它们,我只想在本地使用它们。

为此目的,我正在使用

git cherry-pick <hash> --no-commit

然而,这会自动将它们添加到舞台上,然后,我必须使用

手动重置它们
git reset HEAD <files>

git是否没有选项可以让樱桃选择不提交,而不是添加到索引?

类似的东西:

git cherry-pick <hash> --no-commit --no-stage

我知道这个技巧会做我想要的,但我必须指定提交中的所有文件:

修改

也试过这个,但它也被添加到索引中。

git checkout hash -- <list of files>

这些文件可能不会共享相同的公共路径。我正在尝试自动化它

3 个答案:

答案 0 :(得分:2)

另一种方法是使用 apply 而不是 cherry-pick

git show <commit> | git apply

这将应用在 <commit> 中所做的更改,但不会将它们添加到暂存或创建提交中。

答案 1 :(得分:1)

Cherry-pick在幕后进行合并操作。 Git在索引中执行合并 - 所以不,除了使用index / staging-area之外没有办法做到这一点。 (但见下文。)

如果您不想在当前分支中提交结果,只需使用其他分支(git checkout -b <newbranch>)或分离的HEAD(根本没有分支:git checkout --detach HEAD)。您还可以使用混合重置(lucas-reineke suggested in a comment)在当前分支中进行提交,然后将当前分支移回一个提交。这有副作用,即重置索引以匹配调整后的(后樱桃挑选)HEAD,从而使您处于最初要求的状态。

你可以使用git cherry-pick -n HEAD后跟git reset --mixed HEAD(没有列出路径名)来获得相同的结果:cherry-pick发生在索引中,更新工作树作为副作用,无需提交,然后重置将文件从HEAD提交复制回索引,使工作树不受干扰。请注意,--mixed是默认设置,因此git reset没有--soft--hard执行--mixed即使您没有明确--mixed (但确保你没有在命令中输入任何拼写错误是有用的。)

这些是您通常会这样做的两种方式。还有一种可能性:虽然Git有 索引 - 与存储库的主要工作树一起使用的一个显着索引 - 您可以将Git重定向到您自己的替代 index,使用GIT_INDEX_FILE变量。您可以将其设置为尚不存在的临时文件的名称,运行git reset以创建该临时索引文件并将其填入,然后运行git cherry-pick -n <commit>以更新临时索引。然后,您可以取消设置GIT_INDEX_FILE并删除临时文件。结果是一个使用临时索引而不是正常索引的cherry-pick,它将工作树文件改为副作用。 请注意,这与在普通索引中执行cherry-pick然后重置普通索引的工作量相同。但是,它可能对某些脚本化工作流有用。谨防那些失败的挑选,因此在索引中留下合并冲突!

答案 2 :(得分:0)

我能够做到这一点

  1. 樱桃选择提交到您的分支
  2. git reset --soft