如何将特定的git提交复制到临时区域?

时间:2014-06-02 22:49:55

标签: git

我想将最后一次提交从一个分支(即branch-one)复制到另一个分支的暂存区域(即branch-two)。这是可能的,如果可以的话,它是如何完成的?

5 个答案:

答案 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的状态,而不对当前签出的分支或工作树做任何事情。我们在这里使用.来表示当前目录,因此也就是整个仓库。

相关问题