将已提交(但未推送)的更改移至新分支
我已经做了一些相当的工作(“你的分支在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 branch
, git 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