Git 如何将最近(但不是最新)提交移动到新分支

Git 如何将最近(但不是最新)提交移动到新分支,git,branch,git-branch,revision-history,Git,Branch,Git Branch,Revision History,i、 我从哪里开始 master : A-B-C-D-E-F-G 船长:A-B-C-D-E-F-G 到 船长:A-B-E-F-G \ 特征:C-D 显然,现在很清楚CD应该在一个功能分支中,因为更改现在被推迟了 这与我见过的其他问题有着微妙的不同,从master的开头开始: git branch feature D # Create new branch at D. git rebase -i B # Use interactive rebase to remove C D fro

i、 我从哪里开始

master : A-B-C-D-E-F-G 船长:A-B-C-D-E-F-G 到

船长:A-B-E-F-G \ 特征:C-D 显然,现在很清楚CD应该在一个功能分支中,因为更改现在被推迟了


这与我见过的其他问题有着微妙的不同,从
master
开头开始:

git branch feature D  # Create new branch at D.
git rebase -i B       # Use interactive rebase to remove C D from master.

母版的
头(G)开始:

git branch feature D  # Create new branch at D.
git rebase -i B       # Use interactive rebase to remove C D from master.

这个答案假设你要么没有按下master键,要么你是唯一一个在这个项目上工作的人(在这种情况下,这并不重要)。如果您推送了master,而其他人推送了您的更改,您需要与他们沟通,以确保他们适当地更新了存储库

                                  # Assuming you're on master
git branch <feature> <D>          # Create a branch named <feature> at commit <D>
git rebase --onto <B> <D> master  # Transplant branch
这将导致这样的历史

A-B-C-D-E-F-G-!D-!C
      ^           ^
   feature      master

任何签出master的人都会看到代码,好像提交C和D从未发生过一样,您的历史记录中只会有几个。这是从已推送的分支中支持更改的首选方法。

此答案假设您没有推送master,或者您是项目中唯一的工作人员(在这种情况下,这并不重要)。如果您推送了master,而其他人推送了您的更改,您需要与他们沟通,以确保他们适当地更新了存储库

                                  # Assuming you're on master
git branch <feature> <D>          # Create a branch named <feature> at commit <D>
git rebase --onto <B> <D> master  # Transplant branch
这将导致这样的历史

A-B-C-D-E-F-G-!D-!C
      ^           ^
   feature      master

任何签出master的人都会看到代码,好像提交C和D从未发生过一样,您的历史记录中只会有几个。这是从已推送的分支中支持更改的首选方法。

这是(目前)三个可行的答案。对双方都有好处吗?我非常喜欢@larsmans cherry pick解决方案,因为它不需要重新定基,但它确实需要重新定基……啊,是的。是的,不是吗。打自己的头。那么我应该先试试哪一个呢???或者它们都是等价物?现在我已经回顾了
--to
的作用,我不得不承认,我认为R0MANARMY的答案实际上只是勉强优于其他人,尽管我的选票更多。唯一真正的区别是,我的版本(使用
-i
进行交互式重基)要求您手动选择要删除的提交C和D,而
--on
版本则在一个命令行中自动执行此操作。至于被删除的第三个答案,虽然很好,但更冗长。(虽然我喜欢它提到的备份想法,我以前也用过。)这是(目前)三个可行的答案。对双方都有好处吗?我非常喜欢@larsmans cherry pick解决方案,因为它不需要重新定基,但它确实需要重新定基……啊,是的。是的,不是吗。打自己的头。那么我应该先试试哪一个呢???或者它们都是等价物?现在我已经回顾了
--to
的作用,我不得不承认,我认为R0MANARMY的答案实际上只是勉强优于其他人,尽管我的选票更多。唯一真正的区别是,我的版本(使用
-i
进行交互式重基)要求您手动选择要删除的提交C和D,而
--on
版本则在一个命令行中自动执行此操作。至于被删除的第三个答案,虽然很好,但更冗长。(虽然我喜欢上面提到的备份想法,我以前也用过。)使用还原版本-分支已经被推了,所以不重写历史是一个主要的+。答案的还原部分只是一个幸运的猜测,你在寻找什么。你应该在问题中说明你在寻找一个不涉及
重基的答案。直到你指出了我推师父的危险性,我才完全理解它的意义。这时你已经回答了:-)Thx!使用还原版本-分支已被推送,因此不重写历史是一个主要+。答案的还原部分只是对您正在寻找的内容的一个幸运猜测。你应该在问题中说明你在寻找一个不涉及
重基的答案。直到你指出了我推师父的危险性,我才完全理解它的意义。这时你已经回答了:-)Thx!