使用Git将最新的提交移动到一个新的分支上

14 浏览
0 Comments

使用Git将最新的提交移动到一个新的分支上

如何将我的最近在主分支上提交的更改移动到一个新分支,并将主分支重置回在这些提交之前的状态?例如,从这个状态:

master A - B - C - D - E

到这个状态:

newbranch     C - D - E
             /
master A - B 

admin 更改状态以发布 2023年5月21日
0
0 Comments

对于那些想知道它为什么起作用(就像我一开始一样)的人:

您想回到 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,因此它仍然指向最初的提交。

0
0 Comments

移动到已有分支

如果希望移动自己的提交到一个已有分支,则需要执行如下操作:

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的回答以获取更多详细信息。

0