如何将特定的git提交复制到暂存区?

3
我想要将一个分支(例如branch-one)的最新提交复制到另一个分支(例如branch-two)的暂存区。这是否可行,如果可以,应该如何操作?

使用 git checkout 命令。为了防止它切换分支或分离 HEAD,可以检出特定文件,而不是整个分支:git checkout commit-ID -- files...。要检出每个文件,请在项目根目录中使用 . 作为特定文件:git checkout commit -- .。(注意:这当然也会写入工作目录。) - torek
如果你发布答案,那么Torek的回答就很有道理。 - Gil Birman
5个回答

4
检出目标分支并清理你的暂存区。然后使用


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

4
git checkout 命令将索引/暂存区的内容写入工作目录,因此检出文件就完成了这个任务(尽管它会更新工作目录,不论你是否想要这样做)。问题在于 git checkout commit 命令将切换分支或分离 HEAD。避免这种情况的方法是检出指定的文件,这可以避免切换分支:
git checkout branch-one -- path/to/file.ext

如果查看整个树形结构,您将得到所有文件。假设您在顶级目录中:

git checkout branch-one -- .

这个方法很管用。

注意:该方法不会从暂存区中移除在branch-one中不存在的任何文件。如果您也想移除这些文件,请首先删除所有内容(暂存区将通过检出另一个分支中的所有文件来重新填充):

git rm -rf .
git checkout branch-one -- .

如果您不想复制其他分支的.gitignore等文件,请根据需要进行调整;请注意,您可以使用以下命令从branch-two(即HEAD)还原特定文件:

git checkout HEAD -- path

(如有需要),

(通常情况下,在执行此操作之前,请确保工作目录的状态是干净的。)


2
如果您的意思是仅需要来自单个提交的更改(而非整个分支),那么:
git cherry-pick *commit-id*
git reset --soft HEAD^

注意:这将合并更改(而不仅仅是复制涉及的文件)。

1
如果您合并两个分支,然后执行软重置,在暂存区中您将获得在branch-two之前的branch-one提交。这不是正确的答案,但实际上这就是我最终需要的...
git checkout branch-two
git merge branch-one
git reset --soft @^

1
git reset branch-one .

git reset <commit> <paths> 告诉 git 更新每个列出的 path 的索引状态到 commit 中的状态,而不对当前检出的分支或工作树进行任何操作。在此处我们使用 . 表示当前目录,因此表示整个仓库。


@torek 确实,基本上和你的答案一样,只是使用 reset 而不是 checkout 避免了接触工作树。 OP 没有说明他实际想要哪一个,所以任何人都可以猜测哪个是正确的。 - amalloy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接