将已提交(但未推送)的更改移至新分支

我已经做了一些相当的工作(“你的分支在37次提交之前就是'起源/主'之前的事情了。”)真的应该进入它自己的分支而不是master分支。 这些提交只存在于我的本地机器上,并没有被推送到origin ,但情况有点复杂,其他开发人员一直在推动origin/master并且我已经将这些更改拉回。

我如何追溯地将我的37个本地提交移动到一个新的分支上? 根据这些文档,看起来git rebase --onto my-new-branch master...origin/master应该这样做,但都给我错误“致命的:需要单个修订”。 man git-rebase没有提供任何关于提供rebase的修订版,它的例子不这样做,所以我不知道如何解决这个错误。

(请注意,这并不是将现有的,未完成的工作移动到Git中的新分支或如何将本地未提交的更改合并到另一个Git分支中?这些问题涉及本地工作树中未提交的更改,在当地承诺。)


这应该没问题,因为你还没有在其他任何地方推送提交,并且你可以在origin/master后重写分支的历史。 首先我会运行一个git fetch origin来确保origin/master是最新的。 假设你目前在master身边,你应该可以做到:

git rebase origin/master

...将重放所有不在origin/master上的提交到origin/master 。 rebase的默认动作是忽略合并提交(例如你的git pull可能引入的那些提交),它只会尝试将你的每个提交引入的补丁应用到origin/master 。 (您可能需要解决一些冲突。)然后,您可以根据结果创建新的分支:

git branch new-work

...然后将您的master重置为origin/master

# Use with care - make sure "git status" is clean and you're still on master:
git reset --hard origin/master

在做这种使用git branchgit reset等操作的分支时,我发现经常使用gitk --all或类似的工具来查看提交图很有用,只是为了检查我了解所有不同的refs指向哪里。

或者,您可以根据主人所在的位置( git branch new-work-including-merges )创建主题分支,然后重新设置master ,如上所述。 但是,由于您的主题分支将包含来自origin/master合并,并且您尚未推送您的更改,因此我建议您进行重设以便历史记录更加整洁。 (另外,当您最终将主题分支合并回主人时,更改将更加明显。)


如果您的提交数量很少,而且您不关心这些提交是否合并为一个超级提交,那么这很有效:

将文件取消(用#个提交替换1)

git reset --soft HEAD~1

创建一个新的分支

git checkout -b NewBranchName

添加更改

git add -A

做一个提交

git commit -m "Whatever"

还有一种方法假设branch1 - 是具有提交更改的分支branch2 - 是可取的分支

git fetch && git checkout branch1
git log

选择您需要移动的提交标识

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

现在恢复从最初的分支unpushed提交

git fetch && git checkout branch1
git reset --soft HEAD~1
链接地址: http://www.djcxy.com/p/23587.html

上一篇: moving committed (but not pushed) changes to a new branch

下一篇: Git: Create a branch from unstaged/uncommitted changes on master