繁体   English   中英

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

[英]How to move changes between not-consecutive commits?

因此,情况如下:

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

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

您可以像在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(不带分支),请确保在导航之前创建分支。

请注意,如果您未指定checkout命令的路径,则您的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,从该临时分支签出该文件,提交该文件(通过删除该临时分支进行清理,然后重置合并的-在分支回到它来自哪里)
所有艰难的重新部署可能是一个更直接的选择,最终结果应与目标文件相似。

尝试使用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但在新顺序中具有相同更改的新提交历史记录。 根据顺序,或者如果您删除一些提交,则可能会发生冲突。 小心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM