我已经做了相当多的工作(“你的分支比'origin/master'领先37次提交”),这些工作实际上应该放到它自己的分支中,而不是放到master中。这些提交只存在于我的本地机器上,还没有被推送到原点,但情况有点复杂,因为其他开发人员已经推送到原点/master,而我已经提取了这些更改。

我如何追溯我的37个本地提交到一个新的分支?根据文档,git似乎是基于my-new-branch master或…origin/master应该这样做,但两者都只给我错误“致命:需要一个单一的修订”。man git-rebase没有提到提供rebase的修订,它的示例也没有这样做,所以我不知道如何解决这个错误。

(注意,这不是移动现有的,未提交的工作到一个新的Git分支或如何合并我的本地未提交的更改到另一个Git分支的副本?因为这些问题处理的是本地工作树中未提交的更改,而不是已提交的更改。)


当前回答

还有一种方法 假设 Branch1 -是已提交变更的分支 Branch2 -理想的分支

git fetch && git checkout branch1
git log

选择需要移动的提交id

git fetch && git checkout branch2
git cherry-pick commit_id_first..commit_id_last
git push

现在从初始分支恢复未推送的提交

git fetch && git checkout branch1
git reset --soft HEAD~1

其他回答

签出源代码的新副本 Git克隆........ 从所需位置制作支路 Git签出{位置} Git签出-b {branch-name} 添加远程存储库 Git远程添加共享../{原始源代码的位置}.git 获取远程资源 Git获取共享 检出所需的分支 Git签出{branch-name} 合并来源 Git从共享存储库合并共享/{原始分支}

如果你有一个很低的提交#,你不关心这些是否合并成一个超级提交,这工作得很好,不像做git rebase那么可怕:

取消文件的运行(将1替换为# of commits)

git reset --soft HEAD~1

创建一个新分支

git checkout -b NewBranchName

添加更改

git add -A

做出承诺

git commit -m "Whatever"

一个更简单的方法,我一直在使用(假设你想移动4个提交):

git format-patch HEAD~4

(在执行最后一个命令的目录中查找4个.patch文件)

git reset HEAD~4 --hard

git checkout -b tmp/my-new-branch

然后:

git apply /path/to/patch.patch

按你想要的顺序。

或者,在你提交到错误的分支之后,执行以下步骤:

git日志 Git diff{前一次提交}{最近一次提交}> your_changes.patch Git重置-hard origin/{你的当前分支} Git checkout -b{新分支} Git应用your_changes.patch

我可以想象,对于第一步和第二步,有一个更简单的方法。

还有一种方法 假设 Branch1 -是已提交变更的分支 Branch2 -理想的分支

git fetch && git checkout branch1
git log

选择需要移动的提交id

git fetch && git checkout branch2
git cherry-pick commit_id_first..commit_id_last
git push

现在从初始分支恢复未推送的提交

git fetch && git checkout branch1
git reset --soft HEAD~1