关于git:在pull之后将已提交(但未推送)的更改移动到新分支


moving committed (but not pushed) changes to a new branch after pull

我做了不少工作("你的分支机构比‘起源/主人’领先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上,你应该能够做到:

1
git rebase origin/master

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

1
git branch new-work

…然后将你的master重置回origin/master

1
2
# 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的合并,并且您还没有推动您的更改,所以我建议您做一个重新平衡,以使历史更加整洁。(同样,当您最终将主题分支合并回master时,更改将更加明显。)


如果你的承诺很低,而且你不在乎这些承诺是否被合并成一个巨大的承诺,那么这会很好地工作,并不像git rebase那样可怕:

取消文件的存储(将1替换为提交的)

1
git reset --soft HEAD~1

创建新分支

1
git checkout -b NewBranchName

添加更改

1
git add -A

做出承诺

1
git commit -m"Whatever"


我坚持同样的问题。我找到了最简单的解决方案,我喜欢分享。

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

1
git checkout -b mybranch

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

1
git push origin mybranch

3)退房到总分行。

1
git checkout master

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

1
git reset --hard origin/master


还有一条路假定Branch1-是具有已提交更改的分支分支2-是理想的分支

1
2
git fetch && git checkout branch1
git log

选择需要移动的提交ID

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

现在从初始分支恢复未执行的提交

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


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

  • 埃多克斯1〔25〕
  • 埃多克斯1〔26〕
  • 埃多克斯1〔27〕
  • 埃多克斯1〔28〕
  • 江户十一〔29〕号
  • 我可以想象,对于步骤1和步骤2有一个更简单的方法。


    怎么办:

  • 从当前头部分支。
  • 确保你是师父,而不是你的新分支。
  • git reset返回到开始进行更改之前的最后一次提交。
  • git pull只需重新拉你在重置时丢弃的远程更改。
  • 或者当你试图重新合并分支时会爆炸吗?


    我一直使用的一种更简单的方法(假设您希望移动4个提交):

    1
    git format-patch HEAD~4

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

    1
    2
    3
    git reset HEAD~4 --hard

    git checkout -b tmp/my-new-branch

    然后:

    1
    git apply /path/to/patch.patch

    按你想要的顺序。


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

  • 检查更改和合并冲突git fetch
  • 创建一个新的分支git branch my-changes,并将其推送到远程
  • 上游改为新建分支git master -u upstream-branch remotes/origin/my-changes
  • 把你的承诺推到新的上游分支。
  • 切换回前一个上游git branch master --set-upstream-to remotes/origin/master

  • 签出你的源的新副本

    江户十一〔16〕号

  • 从所需位置创建分支

    埃多克斯1〔17〕埃多克斯1〔18〕

  • 添加远程存储库

    埃多克斯1〔19〕

  • 获取远程源

    埃多克斯1〔20〕

  • 签出所需分支

    江户十一〔21〕号

  • 合并源

    埃多克斯1〔22〕