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

我想将我承诺的最后几次提交移交给一个新的分支,并在提交之前将主数据移回原处。 不幸的是,我的Git-fu还不够强大,有什么帮助?

也就是说,我该如何去做

master A - B - C - D - E

对此?

newbranch     C - D - E
             /
master A - B 

搬到新的分支

除非涉及其他情况,否则可以通过分支和回滚轻松完成。

# 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 (GONE from master)
git checkout newbranch    # Go to the new branch that still has the desired commits

但要确保有多少次提交才能返回。 或者,你可以不用HEAD~3 ,只需要在主(/当前)分支上提供你想要“还原回去”的提交(或起源/主引用)的散列,例如:

git reset --hard a1b2c3d4

* 1你只会 “失去”主分支的提交,但不用担心,你会在newbranch提交这些提交!

警告:使用Git 2.0及更高版本,如果您稍后在原始( master )分支上重新git rebase新分支,则可能需要在重新--no-fork-point期间显式指定--no-fork-point选项以避免遗失提交。 拥有branch.autosetuprebase always会使得这更可能。 详情请参阅John Mellor的回答。

转移到现有分支

警告:上面的方法工作,因为你正在创建一个新的分支与第一个命令: git branch newbranch 。 如果你想使用现有的分支,你需要在执行git reset --hard HEAD~3之前将你的修改合并到现有的分支中 。 如果您不先合并您的更改,他们将会丢失。 所以,如果您正在使用现有分支,它将如下所示:

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

对于那些想知道为什么它起作用的人(正如我刚开始时那样):

你想回到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,它仍然指向它原来的提交。


一般来说...

sykora暴露的方法在这种情况下是最好的选择。 但有时并不是最简单的方法,也不是一种通用的方法。 对于一般的方法,使用git cherry-pick:

为了达到OP的目的,它有两个步骤:

第1步 - 注意你在newbranch你想要的newbranch

执行

git checkout master
git log

注意(例如3)的散列提交你想在newbranch 。 我将在这里使用:
C提交: 9aa1233
D提交: 453ac3d
E提交: 612ecb3

注意:您可以使用前七个字符或整个提交哈希

第2步 - 把它们放在新newbranch

git checkout newbranch
git cherry-pick 612ecb3
git cherry-pick 453ac3d
git cherry-pick 9aa1233

OR(在Git 1.7.2+上,使用范围)

git checkout newbranch
git cherry-pick 612ecb3~1..9aa1233

git cherry-pick将这三个提交应用于newbranch。

链接地址: http://www.djcxy.com/p/69.html

上一篇: Move the most recent commit(s) to a new branch with Git

下一篇: How do I force "git pull" to overwrite local files?