我已经做了相当多的工作(“你的分支比'origin/master'领先37次提交”),这些工作实际上应该放到它自己的分支中,而不是放到master中。这些提交只存在于我的本地机器上,还没有被推送到原点,但情况有点复杂,因为其他开发人员已经推送到原点/master,而我已经提取了这些更改。
我如何追溯我的37个本地提交到一个新的分支?根据文档,git似乎是基于my-new-branch master或…origin/master应该这样做,但两者都只给我错误“致命:需要一个单一的修订”。man git-rebase没有提到提供rebase的修订,它的示例也没有这样做,所以我不知道如何解决这个错误。
(注意,这不是移动现有的,未提交的工作到一个新的Git分支或如何合并我的本地未提交的更改到另一个Git分支的副本?因为这些问题处理的是本地工作树中未提交的更改,而不是已提交的更改。)
这应该没问题,因为您还没有将提交推到其他任何地方,并且您可以自由地在origin/master之后重写分支的历史。首先,我将运行一个git获取origin以确保origin/master是最新的。假设你目前在master上,你应该能够做到:
git rebase origin/master
... 它会将所有不在origin/master中的提交重放到origin/master中。rebase的默认操作是忽略合并提交(例如那些你的git可能引入的),它只会尝试将你每次提交的补丁应用到origin/master上。(在此过程中,你可能需要解决一些冲突。)然后你可以根据结果创建你的新分支:
git branch new-work
... 然后重置你的master到原点/master:
# Use with care - make sure "git status" is clean and you're still on master:
git reset --hard origin/master
当使用git branch, git reset等进行这种操作时。我发现经常使用gitk—all或类似的工具查看提交图很有用,只是为了检查我是否理解了所有不同的引用指向的位置。
或者,你也可以根据master的位置创建一个主题分支(git分支new-work- include -merges),然后像上面一样重置master。然而,由于你的主题分支将包括来自origin/master的合并,而你还没有推动你的更改,我建议做一个rebase,以便历史记录更整洁。(此外,当你最终将主题分支合并回主分支时,变化将更加明显。)