我想将最后一次提交从一个分支(即branch-one
)复制到另一个分支的暂存区域(即branch-two
)。这是可能的,如果可以的话,它是如何完成的?
答案 0 :(得分:2)
git checkout
命令通过index / staging-area写入工作目录,因此签出文件可以完成工作(尽管它会更新工作目录,无论你是否想要)。
问题当然是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
如果需要)。
(像往常一样,在执行此操作之前,请确保工作目录的状态是干净的。)
答案 1 :(得分:2)
如果您的意思是您只想要从单个提交(而不是整个分支)进行更改,那么
git cherry-pick *commit-id*
git reset --soft HEAD^
注意:这将合并更改(而不是仅复制所涉及的文件)
答案 2 :(得分:2)
签出目的地分支并清除您的临时区域。 然后使用
git cherry-pick --no-commit <commit hash>
答案 3 :(得分:1)
如果合并两个分支然后执行软重置,则在暂存区域中,branch-one
中的提交将超过branch-two
。这不是问题的正确答案,但它实际上是我最终需要的......
git checkout branch-two
git merge branch-one
git reset --soft @^
答案 4 :(得分:1)
git reset branch-one .
git reset <commit> <paths>
告诉git将列出的每个path
的索引更新为它在commit
的状态,而不对当前签出的分支或工作树做任何事情。我们在这里使用.
来表示当前目录,因此也就是整个仓库。