重新启动单个Git提交

Kev*_*yer 103 git rebase

有没有办法将一个提交从一个分支重新绑定到另一个分支?

我有这个分支结构:

-- -- -- -- -- (Master)
            \
              -- -- -- -- -- XX (Feature-branch)
Run Code Online (Sandbox Code Playgroud)

我想要做的就是将最后一次提交改为Feature-branchmaster并回滚Feature-branch一次提交.

-- -- -- -- -- XX (Master)
            \
              -- -- -- -- -- (Feature-branch)
Run Code Online (Sandbox Code Playgroud)

我怎么做?

tew*_*ewe 103

你可以樱桃挑XX来掌握.

git checkout master
git cherry-pick <commit ID of XX>
Run Code Online (Sandbox Code Playgroud)

并使用git reset从功能分支中删除最后一次提交.

git checkout Feature-branch
git reset --hard HEAD^
Run Code Online (Sandbox Code Playgroud)

  • 一个专门称为'git rebase ...'的问题怎么能有一个被接受的答案,而不是包含一个樱桃选择,这是一个完全不同的概念,有时本身被认为是不洁净的? (51认同)
  • @Bondax:因为无论如何它们都不是完全不同的概念。它们之间的关系非常密切,如果您了解 rebase,但从未听说过“cherry-picking”这个术语,那么很自然地就会提出“cherry-picking”的想法并将其描述为“rebase a single commit”。 (3认同)
  • 此解决方案与 [CharlesB 的解决方案](/sf/answers/1024501831/) 之间的实际区别是什么? (2认同)

Cha*_*esB 85

git rebase --onto master branch~1 branch 
Run Code Online (Sandbox Code Playgroud)

这说"在主分支的尖端上重新设置分支前的分支和分支(即XX提交)之间的提交范围"

在此操作之后,branch提示会移动提示XX,因此您需要将其设置为

git checkout branch
git reset --hard branch@{1}^
Run Code Online (Sandbox Code Playgroud)

其中说"在之前的状态之前将分支提示重置为提交"

所以樱桃选择是一个更简单的解决方案......

  • 这对我来说似乎不起作用,我在XX之前丢失了提交,并且分支通过一次提交被重新命名为master,但我之前从未使用过`--onto`,所以我可能做错了.顺便说一句,OP表示反对,但似乎他想做一个挑选. (5认同)

hrd*_*rbl 38

实际上这很简单.解决方案是进行交互式rebase并"删除"您不希望包含在rebase中的所有提交.

git rebase -i <target_branch>target_branch你想要转移到的分支在哪里

然后,您将编辑打开的文件和pick您想要的提交,以及drop(或d简称)您不想带来的所有提交.

  • IMO是一个更好的解决方案,它实际上解决了这个问题. (4认同)
  • 考虑到它的通用性、直观性和简短性,这应该是公认的解决方案。 (4认同)
  • 请注意,您未选择的提交将“丢失”,除非它们位于不同的分支上。或者像 git 所说的“落后”。 (2认同)