我已经完成了相当多的工作(“你的分支在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 Git或How to merge my local uncommitted changes into another Git branch?的副本,因为这些问题涉及本地工作树中未提交的更改,而不是本地提交的更改。)
答案 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 branch
,git 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)
怎么样:
git reset
在您开始进行更改之前回到最后一次提交。git pull
只需重新调整您通过重置而丢弃的远程更改。或者当你试图重新合并分支时会爆炸吗?
答案 5 :(得分:6)
或者,在您提交错误的分支后,执行以下步骤:
git log
git diff {previous to last commit} {latest commit} > your_changes.patch
git reset --hard origin/{your current branch}
git checkout -b {new branch}
git apply your_changes.patch
我可以想象第一步和第二步有一个更简单的方法。
答案 6 :(得分:1)
这是一种更简单的方法:
创建新分支
在新分支上执行git merge master
-这会将您已提交(未推送)的更改合并到新分支
删除本地主分支git branch -D master
使用-D
代替-d
,因为您要强制删除分支。
只需在主分支上执行git fetch
,然后在主分支上执行git pull
,以确保您拥有团队的最新代码。
答案 7 :(得分:0)
查看新来源的副本
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}
答案 8 :(得分:0)
对我而言,这是最好的方式:
git fetch
git branch my-changes
并推送到远程git master -u upstream-branch remotes/origin/my-changes
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
以任何你想要的顺序。