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

时间:2011-02-21 12:39:44

标签: git

我已经完成了相当多的工作(“你的分支在37次提交之前超过'origin / master'。”)这应该进入自己的分支而不是master。这些提交仅存在于我的本地计算机上并且没有被推送到origin,但情况有点复杂,因为其他开发人员一直在推动origin/master并且我已经撤消了这些更改。

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

(请注意,Move existing, uncommited work to a new branch in GitHow to merge my local uncommitted changes into another Git branch?的副本,因为这些问题涉及本地工作树中未提交的更改,而不是本地提交的更改。)

10 个答案:

答案 0 :(得分:443)

这应该没问题,因为你还没有在其他任何地方推送你的提交,你可以在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 branchgit reset等进行此类操作分支时,我发现经常使用gitk --all或类似工具查看提交图很有用,只是为了检查我理解所有不同的引用指向的地方。

或者,您可以首先根据主人所在的位置(git branch new-work-including-merges)创建主题分支,然后重置master,如上所述。但是,由于您的主题分支将包含来自origin/master的合并,并且您尚未推送您的更改,我建议您进行改造以使历史更加整洁。 (此外,当您最终将主题分支合并回主分支时,更改将更加明显。)

答案 1 :(得分:84)

如果您的提交次数很少,并且您不在乎这些是否合并为一次大型提交,那么这种做法效果不错,并不像执行git rebase那样可怕:

取消暂存文件(用提交#替换1)

git reset --soft HEAD~1

创建一个新分支

git checkout -b NewBranchName

添加更改

git add -A

提交

git commit -m "Whatever"

答案 2 :(得分:38)

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

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

git checkout -b mybranch

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

git push origin mybranch

3)结帐回主分支。

git checkout master

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

git reset --hard origin/master

答案 3 :(得分:20)

还有一种方法 假设 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

答案 4 :(得分:6)

怎么样:

  1. 来自当前HEAD的分支。
  2. 确保您在上,而不是新分支。
  3. git reset在您开始进行更改之前回到最后一次提交。
  4. git pull只需重新调整您通过重置而丢弃的远程更改。
  5. 或者当你试图重新合并分支时会爆炸吗?

答案 5 :(得分:6)

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

  1. git log
  2. git diff {previous to last commit} {latest commit} > your_changes.patch
  3. git reset --hard origin/{your current branch}
  4. git checkout -b {new branch}
  5. git apply your_changes.patch
  6. 我可以想象第一步和第二步有一个更简单的方法。

答案 6 :(得分:1)

这是一种更简单的方法:

  1. 创建新分支

  2. 在新分支上执行git merge master-这会将您已提交(未推送)的更改合并到新分支

  3. 删除本地主分支git branch -D master使用-D代替-d,因为您要强制删除分支。

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

答案 7 :(得分:0)

  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}

答案 8 :(得分:0)

对我而言,这是最好的方式:

  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

答案 9 :(得分:0)

一种更简单的方法,我一直在使用(假设您要移动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

以任何你想要的顺序。