【问题标题】:Git merge/cherry-pick avoiding stagingGit 合并/cherry-pick 避免暂存
【发布时间】:2018-10-04 08:57:17
【问题描述】:

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

为此,我正在使用

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

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

git reset HEAD <files>

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

类似:

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

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

编辑

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

git checkout hash -- <list of files>

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

【问题讨论】:

  • 让 git 进行樱桃选择提交然后重置那个 git reset HEAD~ 怎么样?
  • 这在 2.5 年后仍然需要答案
  • "我正在尝试进行一些更改,但我不想在这个分支中提交它们,我只想在本地拥有它们......我正在尝试自动化它。”这是很少发生的事情。经常需要其他分支的片段以至于取消暂存是一件麻烦事,这表明该过程有问题。我相信这是XY Problem。我怀疑他们正在尝试使用 Git 作为配置管理器。

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


【解决方案1】:

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

git show <commit> | git apply

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 不会 git reset --mixed HEAD 也会从我之前暂存的索引文件中删除吗?因为我没有指定路径
    • 是的:--mixed 重置(没有路径规范)会将您的索引设置回您要重置的提交。请记住,索引/暂存区域包含提交中的所有文件; git add 当文件(不同版本)已经在索引中时,将替换复制到索引中。另请注意,普通(非-n)cherry-pick 要求索引是“干净的”,即在您开始时匹配当前提交。
    • @scaly:鉴于答案字面上 “你不能这样做”(因为合并发生在索引中),你是否真的无关紧要喜欢与否。您可以接近,但如果不创建临时索引或使用主索引,您将无法做到。
    【解决方案3】:

    我能够做到这一点

    1. Cherry-pick 提交到您的分支
    2. git reset --soft

    【讨论】:

      猜你喜欢
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2012-05-21
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多