Git合并/樱桃挑选避免分期

May*_*day 8 git merge git-merge cherry-pick git-cherry-pick

我正在尝试进行一些更改,但我不想在这个分支中提交它们,我只想在本地拥有它们。

为此,我正在使用

git cherry-pick <hash> --no-commit
Run Code Online (Sandbox Code Playgroud)

但是,这会自动将它们添加到舞台,然后,我必须使用手动重置它们

git reset HEAD <files>
Run Code Online (Sandbox Code Playgroud)

git 没有选项可以让cherry pick 不提交,也不添加到索引中吗?

就像是:

git cherry-pick <hash> --no-commit --no-stage
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

git checkout hash -- <list of files>
Run Code Online (Sandbox Code Playgroud)

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

ada*_*mgy 8

另一种选择是使用apply而不是cherry-pick

git show <commit> | git apply
Run Code Online (Sandbox Code Playgroud)

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


tor*_*rek 6

Cherry-pick 在幕后是一个合并操作。Git 在索引\xe2\x80\x94 中执行合并,所以不,除了使用索引/暂存区之外没有其他方法可以执行此操作。(但见下文。)

\n\n

如果您不想在当前分支中提交结果,只需使用其他分支 ( git checkout -b <newbranch>) 或分离的 HEAD (根本没有分支: git checkout --detach HEAD)。您还可以使用混合重置,如卢卡斯·雷内克在评论中建议的那样那样,在当前分支中进行提交,然后将当前分支移回一次提交。这具有重置索引以匹配调整后的(挑选后)HEAD 的副作用,使您保持最初要求的状态。

\n\n

您可以使用git cherry-pick -n HEAD后跟git reset --mixed HEAD(没有列出路径名)来获得相同的结果:在索引中进行樱桃选择,作为副作用更新工作树,而不提交,然后重置从索引复制文件HEAD提交回索引,使工作树不受干扰。请注意,这--mixed是默认设置,因此git reset没有--soft--hard即使--mixed您不包含显式--mixed(不过,确保您没有在命令中输入任何拼写错误很有用)。

\n\n

这是您通常执行此操作的两种方法。不过,还有另一种可能性:虽然 Git 具有索引\xe2\x80\x94(与存储库\xe2\x80\x94 的主工作树一起使用的唯一索引),但您可以使用以下命令将 Git 重定向到您自己的替代索引:GIT_INDEX_FILE多变的。您可以将其设置为尚不存在的临时文件的名称,运行git reset以创建该临时索引文件并填充它,然后运行git cherry-pick -n <commit>以更新临时索引。然后您可以取消设置GIT_INDEX_FILE并删除临时文件。结果是使用临时索引而不是普通索引的樱桃选择,这会改变工作树文件作为副作用。请注意,这与在正常索引中进行挑选然后重置正常索引的工作量相同。然而,它对于某种脚本化工作流程可能很有用。小心挑选失败并因此在索引中留下合并冲突!

\n