使用Git将最新的提交移动到一个新的分支上
使用Git将最新的提交移动到一个新的分支上
如何将我的最近在主分支上提交的更改移动到一个新分支,并将主分支重置回在这些提交之前的状态?例如,从这个状态:
master A - B - C - D - E
到这个状态:
newbranch C - D - E / master A - B
。
对于那些想知道它为什么起作用(就像我一开始一样)的人:
您想回到 C,并将 D 和 E 移动到新分支。 首先看一下它的样子:
A-B-C-D-E (HEAD) ↑ master
在运行 git branch newBranch
之后:
newBranch ↓ A-B-C-D-E (HEAD) ↑ master
在运行 git reset --hard HEAD~2
之后:
newBranch ↓ A-B-C-D-E (HEAD) ↑ master
由于分支只是一个指针,因此主分支指向最后提交。 当您创建 newBranch 时,您只是建立了一个指向最后提交的新指针。然后使用 git reset
,将主分支指针向后移动两个提交。但是,由于您没有移动 newBranch,因此它仍然指向最初的提交。
移动到已有分支
如果希望移动自己的提交到一个已有分支,则需要执行如下操作:
git checkout existingbranch git merge branchToMoveCommitFrom git checkout branchToMoveCommitFrom git reset --hard HEAD~3 # Go back 3 commits. You *will* lose uncommitted work. git checkout existingbranch
在此之前,您可以使用git stash
将未提交的修改保存到存储区。完成后,可以使用git stash pop
检索存储的未提交修改。
移动到新分支
警告:此方法可行是因为您用第一条命令创建了一个新分支:git branch newbranch
。如果您要将提交移动到一个已有分支中,则需要在执行git reset --hard HEAD~3
之前将您的更改合并到现有分支中(参见上面的移动到已有分支)。如果您没有先合并您的更改,它们将会丢失。
除非涉及其他情况,否则可以通过分支和回滚轻松实现。
# Note: Any changes not committed will be lost. git branch newbranch # Create a new branch, saving the desired commits git checkout master # checkout master, this is the place you want to go back git reset --hard HEAD~3 # Move master back by 3 commits (Make sure you know how many commits you need to go back) git checkout newbranch # Go to the new branch that still has the desired commits
但是,请确保了解要回滚多少个提交。或者,可以直接提供要“还原到”的提交的哈希值(或引用,如origin/master),而非使用HEAD~3
,例如:
git reset --hard a1b2c3d4
*1 您将仅会从主分支上“丢失”提交,但不用担心,它们仍然存在于新的分支上!
最后,您可能需要强制推送最新更改到主要存储库:
git push origin master --force
警告:在Git版本2.0及更高版本中,如果之后您对新分支进行git rebase
(变基)操作时,将新分支变基于原始分支(master
),您可能需要在变基过程中显式使用--no-fork-point
选项,以避免丢失已保留的提交。如果branch.autosetuprebase always
被设置,这种情况更有可能发生。请参阅John Mellor的回答以获取更多详细信息。