如何在不连续的提交之间移动更改?

时间:2015-08-28 18:49:56

标签: git commit rebase

所以,情况是这样的:

Commit A
**Commit B**
Commit C
Commit D
**Commit E**

是否可以从提交E 中选择一个文件更改并将其移至提交B ?提交C和D没有任何与该特定文件相关的内容,因此我希望这是可行的。

2 个答案:

答案 0 :(得分:0)

您可以在COMMIT-E中签出文件 请注意,这将撤消您对当前分支中的文件所做的任何更改。 但是,您可以轻松地编辑对该文件的不需要的更改,因为它们将位于您的提交差异中。

# checkout COMMIT-B, ether check out the commit directly ( headless mode ), or checkout the relevan branch.
git checkout COMMIT-B 
git checkout COMMIT-E ./dir/myfile.ext

该文件现在位于您的工作目录中,您可以单独提交或作为其他提交的一部分提交。如果直接检出COMMIT-B(没有分支),请确保在离开之前创建分支。

请注意,如果您没有指定结帐命令的路径,那么您的HEAD将会更改,这是您不想要的。

如果您对当前分支中的特定文件进行了任何更改,并且想要保留这些更改而不必编辑文件(如上所述),则需要在commit-E中选择更改。

# checkout COMMIT-B, ether check out the commit directly ( headless mode ), or checkout the relevan branch.
git checkout COMMIT-B 
git cherry-pick -n COMMIT-E
# clean up the changes you don't want, then commit the changes you are interested in.

如果另一个分支中的文件有多处更改,分散在多次提交中,那么挑选所有这些更改可能会很棘手。您可以尝试在当前分支的顶部重新绑定分支,然后再次检出文件,如上所示。 或者您可以在当前分支中创建临时分支,合并临时分支中的其他分支,签出COMMIT-B,从临时分支签出文件,提交文件(通过删除临时分支进行清理并重置合并 - 在分支回到它来自的地方)
所有艰难的变基可能是一个更直接的选择,目标文件的最终结果应该类似。

答案 1 :(得分:0)

尝试git-rebase

git rebase -i commitA~1

这将打开您的默认编辑器,以选择您想要重做的commitA提交内容。

你会看到这样的事情:

pick SHA1 commitA
pick SHA1 commitB
pick SHA1 commitC
pick SHA1 commitD
pick SHA1 commitE

根据需要更改它。在你的情况下:

pick SHA1 commitA
pick SHA1 commitE
pick SHA1 commitC
pick SHA1 commitD
pick SHA1 commitB

这将生成具有不同SHA1的新提交历史记录,但新订单中的更改相同。根据顺序,或者如果删除某些提交,您可能会发生冲突。小心。