我想将我已承诺掌握的最后几次提交移动到一个新分支,并在进行这些提交之前将 master 带回。不幸的是,我的 Git-fu 还不够强大,有什么帮助吗?
即我怎么能从这个
master A - B - C - D - E
到这个?
newbranch C - D - E / master A - B
如果您想将提交移动到现有分支,它将如下所示:
git checkout existingbranch git merge master git checkout master git reset --hard HEAD~3 # Go back 3 commits. You *will* lose uncommitted work. git checkout existingbranch
在执行此操作之前,您可以使用git stash. 完成后,您可以使用以下命令检索隐藏的未提交编辑git stash pop
git stash
git stash pop
警告:*此方法有效,因为您正在使用第一个命令创建一个新分支:git branch newbranch。如果要将提交移动到现有分支,则需要在执行之前将更改合并到现有分支中git reset --hard HEAD~3(请参阅上面的移动到现有分支)。*如果您不先合并更改,它们将丢失。
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 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
但是一定要确定要返回多少次提交。或者,您可以代替HEAD~3,简单地提供要在主(/当前)分支上“恢复到”的提交(或像origin/master这样的引用)的哈希值,例如:
HEAD~3
git reset --hard a1b2c3d4
1 你只会*“丢失”来自 master 分支的提交,但别担心,你会在 newbranch 中拥有这些提交!
警告:对于 Git 2.0 及更高版本,如果您稍后git rebase在原始 ( master) 分支上创建新分支,您可能需要--no-fork-point在变基期间使用显式选项以避免丢失结转提交。拥有branch.autosetuprebase always一套使这个可能性比较大。
git rebase
master
--no-fork-point
branch.autosetuprebase always
对于那些想知道它为什么起作用的人(就像我一开始一样):
你想回到 C,把 D 和 E 移动到新的分支。这是它最初的样子:
A-B-C-D-E (HEAD) ↑ master
之后git branch newBranch:
git branch newBranch
newBranch ↓ A-B-C-D-E (HEAD) ↑ master
之后git reset --hard HEAD~2:
git reset --hard HEAD~2
由于分支只是一个指针,因此master指向最后一次提交。当您创建newBranch 时,您只需创建一个指向最后一次提交的新指针。然后使用git reset您将主指针移回两次提交。但是由于您没有移动newBranch,它仍然指向它最初所做的提交。
git reset