我想要将一个分支(例如
branch-one
)的最新提交复制到另一个分支(例如branch-two
)的暂存区。这是否可行,如果可以,应该如何操作?branch-one
)的最新提交复制到另一个分支(例如branch-two
)的暂存区。这是否可行,如果可以,应该如何操作?git cherry-pick --no-commit <commit hash>
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
(如有需要),
(通常情况下,在执行此操作之前,请确保工作目录的状态是干净的。)
git cherry-pick *commit-id*
git reset --soft HEAD^
branch-two
之前的branch-one
提交。这不是正确的答案,但实际上这就是我最终需要的...git checkout branch-two
git merge branch-one
git reset --soft @^
git reset branch-one .
git reset <commit> <paths>
告诉 git 更新每个列出的 path
的索引状态到 commit
中的状态,而不对当前检出的分支或工作树进行任何操作。在此处我们使用 .
表示当前目录,因此表示整个仓库。
reset
而不是 checkout
避免了接触工作树。 OP 没有说明他实际想要哪一个,所以任何人都可以猜测哪个是正确的。 - amalloy
git checkout
命令。为了防止它切换分支或分离 HEAD,可以检出特定文件,而不是整个分支:git checkout commit-ID -- files...
。要检出每个文件,请在项目根目录中使用.
作为特定文件:git checkout commit -- .
。(注意:这当然也会写入工作目录。) - torek