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

我已经做了一些相当的工作(“你的分支在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 branchgit 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 

关于什么:

  1. 从当前HEAD分支。
  2. 确保你是主人 ,而不是你的新分支。
  3. 在开始进行更改之前,将git reset回上次提交。
  4. git pull重新拉只是远程更改,你扔了与重置。

或者当你尝试重新合并分支时会爆炸吗?

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

  1. git日志
  2. git diff {上次提交之前} {最新提交}> your_changes.patch
  3. git reset –hard origin / {你目前的分支}
  4. git checkout -b {新分支}
  5. git apply your_changes.patch

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

  1. 签出你的来源的新鲜副本

    git clone ........

  2. 从所需的位置分支

    git checkout {position} git checkout -b {branch-name}

  3. 添加远程存储库

    git remote add shared ../{original sources location}.git

  4. 获取远程资源

    git fetch shared

  5. 结帐所需的分支

    git checkout {branch-name}

  6. 合并来源

    git merge shared/{original branch from shared repository}

对我来说这是最好的方法:

  1. 检查更改并合并冲突git fetch
  2. 创build一个新的分支git branch my-changes并推送到远程
  3. 将上游更改为新build的分支git master -u upstream-branch remotes/origin/my-changes
  4. 将您的提交推送到新的上游分支。
  5. 切换回上一个上游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