将已提交(但未推送)的更改移至新分支
我已经做了一些相当的工作(“你的分支在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
提交到origin/master
origin/master
origin/master
。 rebase的默认行为是忽略合并提交(例如你的git pull
可能引入的那些提交),它只会尝试将你的每个提交引入的补丁应用到origin/master
。 (您可能需要解决一些冲突。)然后,您可以根据结果创build新的分支:
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
或者类似的工具来查看提交图是很有用的,只是为了检查我知道所有不同的ref都指向哪里。
另外,你也可以根据主人的位置( git branch new-work-including-merges
)创build一个主题分支,然后重新设置master
。 但是,由于你的主题分支将包括来自origin/master
从合并,你还没有推动你的改变,所以我build议做一个rebase,以便历史更整洁。 (另外,当你最终将你的主题分支合并回主人时,变化将更加明显。)
如果你有一个低的提交数量,你不在乎这些是否合并成一个巨型提交,这个效果很好:
取消文件(用提交数量replace1)
git reset --soft HEAD~1
创build一个新的分支
git checkout -b NewBranchName
添加更改
git add -A
做一个提交
git commit -m "Whatever"
还有一种方法是假定branch1 – 是已经提交的更改branch2 – 是可取的分支
git fetch && git checkout branch1 git log
select您需要移动的提交ID
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
关于什么:
- 从当前HEAD分支。
- 确保你是主人 ,而不是你的新分支。
- 在开始进行更改之前,将
git reset
回上次提交。 -
git pull
重新拉只是远程更改,你扔了与重置。
或者当你尝试重新合并分支时会爆炸吗?
或者,在您提交错误的分支后,执行以下步骤:
- git日志
- git diff {上次提交之前} {最新提交}> your_changes.patch
- git reset –hard origin / {你目前的分支}
- git checkout -b {新分支}
- git apply your_changes.patch
我可以想象,第一步和第二步有一个更简单的方法。
-
签出你的来源的新鲜副本
git clone ........
-
从所需的位置分支
git checkout {position}
git checkout -b {branch-name}
-
添加远程存储库
git remote add shared ../{original sources location}.git
-
获取远程资源
git fetch shared
-
结帐所需的分支
git checkout {branch-name}
-
合并来源
git merge shared/{original branch from shared repository}
对我来说这是最好的方法:
- 检查更改并合并冲突
git fetch
- 创build一个新的分支
git branch my-changes
并推送到远程 - 将上游更改为新build的分支
git master -u upstream-branch remotes/origin/my-changes
- 将您的提交推送到新的上游分支。
- 切换回上一个上游
git branch master --set-upstream-to remotes/origin/master
我坚持同样的问题。 我find了我喜欢分享的最简单的解决scheme。
1)用你的改变创build新的分支。
git checkout -b mybranch
2)在远程服务器上推送新的分支代码。
git push origin mybranch
3)结账返回主分支。
git checkout master
4)重置主分支代码与远程服务器,并删除本地提交。
git reset --hard origin/master