一尘不染

使用 Git 将最近的提交移动到新分支

git

我想将我已承诺掌握的最后几次提交移动到一个新分支,并在进行这些提交之前将 master 带回。不幸的是,我的 Git-fu 还不够强大,有什么帮助吗?

即我怎么能从这个

master A - B - C - D - E

到这个?

newbranch     C - D - E
             /
master A - B 

阅读 391

收藏
2022-01-05

共2个答案

一尘不染

转移到现有分行

如果您想将提交移动到现有分支,它将如下所示:

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 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这样的引用)的哈希值,例如:

git reset --hard a1b2c3d4

1 你只会*“丢失”来自 master 分支的提交,但别担心,你会在 newbranch 中拥有这些提交!

警告:对于 Git 2.0 及更高版本,如果您稍后git rebase在原始 ( master) 分支上创建新分支,您可能需要--no-fork-point在变基期间使用显式选项以避免丢失结转提交。拥有branch.autosetuprebase always一套使这个可能性比较大。

2022-01-05
一尘不染

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

你想回到 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

由于分支只是一个指针,因此master指向最后一次提交。当您创建newBranch 时,您只需创建一个指向最后一次提交的新指针。然后使用git reset您将指针移回两次提交。但是由于您没有移动newBranch,它仍然指向它最初所做的提交。

2022-01-05