在拉取后将已提交(但未推入)的更改移动到新分支

我已经做了相当多的工作(“你的分支比'origin/master'领先37次提交”),这些工作应该放到它自己的分支中,而不是放到master中。这些提交只存在于我的本地机器上,还没有推送到origin,但情况有点复杂,因为其他开发人员已经推送到origin/master,而我已经进行了这些更改。

我如何追溯我的37个本地提交到一个新的分支?根据文档,似乎git rebase --onto my-new-branch master...origin/master应该这样做,但两者都只是给我一个错误“致命:需要一个单一的修订”。man git-rebase没有说提供一个修订版的rebase和它的例子不这样做,所以我不知道如何解决这个错误。

(请注意,这是,是将现有的未提交的工作转移到Git中的新分支中如何将本地未提交的更改合并到另一个Git分支中?的副本,因为这些问题处理的是本地工作树中未提交的更改,而不是已提交的更改。)

236206 次浏览

这应该没问题,因为您还没有将提交推到其他任何地方,并且您可以在origin/master之后自由地重写分支的历史。首先,我将运行git fetch origin以确保origin/master是最新的。假设你目前在master上,你应该能够做到:

git rebase origin/master

…它会将所有不在origin/master中的提交重放到origin/master中。rebase的默认操作是忽略合并提交(例如,您的git pulls可能引入的那些),它只会尝试将您的每次提交引入的补丁应用到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或类似的工具查看提交图很有用,只是为了检查我是否理解了所有不同的引用指向的位置。

或者,您可以根据您的主节点的位置(git branch new-work-including-merges)创建一个主题分支,然后像上面一样重置master。然而,由于你的主题分支将包括来自origin/master的合并,而你还没有推动你的更改,我建议做一个rebase,这样历史就更整洁了。(此外,当你最终将主题分支合并回主分支时,变化将更加明显。)

  1. 签出您的源代码的新副本

    # EYZ0 < / p >

  2. 从所需位置制作分支

    < p > # EYZ0 李# EYZ0 < / p > < / >
  3. 添加远程存储库

    # EYZ0 < / p >

  4. 获取远程源

    # EYZ0 < / p >

  5. 签出所需的分支

    # EYZ0 < / p >

  6. < p >合并来源

    # EYZ0 < / p >

是什么:

  1. 来自当前HEAD的分支。
  2. 确保您在上,而不是您的新分支上。
  3. git reset返回到您开始更改之前的最后一次提交。
  4. git pull来重新拉出你在重置中扔掉的远程更改。

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

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

  1. # EYZ0
  2. # EYZ0
  3. # EYZ0
  4. # EYZ0
  5. # EYZ0

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

还有一种方法 假设 Branch1 -是已提交变更的分支 Branch2 -是理想的分支

git fetch && git checkout branch1
git log

选择需要移动的提交id

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

现在从初始分支恢复未推送的提交

git fetch && git checkout branch1
git reset --soft HEAD~1

如果你有一个低#提交,你不关心这些是否合并成一个超大提交,这工作得很好,不像做git rebase那么可怕:

取消文件的运行(将1替换为# of commits)

git reset --soft HEAD~1

创建一个新分支

git checkout -b NewBranchName

添加更改

git add -A

做出承诺

git commit -m "Whatever"

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

  1. 检查更改和合并冲突git fetch
  2. 创建一个新分支git branch my-changes并推到远程
  3. 将上游更改为新创建的分支git master -u upstream-branch remotes/origin/my-changes
  4. 将提交推到新的上游分支。
  5. 切换回之前的上游git branch master --set-upstream-to remotes/origin/master

我被同一个问题困住了。我找到了一个最简单的解决方案,我想和大家分享。

1)使用您的更改创建新的分支。

git checkout -b mybranch

2)(可选)在远程服务器上推送新的分支代码。

git push origin mybranch

3)退到主分支。

git checkout master

4)重置主分支代码与远程服务器和删除本地提交。

git reset --hard origin/master

一个更简单的方法,我一直在使用(假设你想移动4个提交):

git format-patch HEAD~4

(在您执行最后一个命令的目录中查找4 .patch文件)

git reset HEAD~4 --hard


git checkout -b tmp/my-new-branch

然后:

git apply /path/to/patch.patch

按你想要的顺序。

这里有一个更简单的方法:

  1. 创建一个新分支

  2. 在你的新分支上执行git merge master-这将合并你提交的(不是推送的)更改到你的新分支

  3. 使用-D而不是-d,因为你想强制删除分支。

  4. 在你的主分支上执行git fetch,在你的主分支上执行git pull,以确保你拥有团队的最新代码。