如何将当前分支上的一些最新Git提交移动到另一个分支上?

14

我有一个代码库,在master分支上工作,最近添加了大约10次提交。现在我希望这些提交位于另一个分支上,因为它们描述的是我认为是实验性的工作(我仍在学习良好的Git实践)。

考虑到这一点,我现在想让这些最后的10个提交形成自己的分支,这样我就可以将master保持干净,并保留给“发布”/“稳定”的提交。

为了说明,我现在所拥有的是:

        b--b (feature B)
       /       
X--X--X--Z--Z--Z--Z--Z--Z (master)
    \
     a--a--a (feature A)
你可以看到标记为 XZ 的提交都在 master 分支上,而我想要的是标记为 Z 的提交(现在被视为实验性的“功能Z”工作)位于它们自己的分支上,并且让 master 以最右侧的 X 结尾。为了说明,这是期望的图形:
        b--b (feature B)
       /       
X--X--X (master)
    \  \
     \  Z--Z--Z--Z--Z--Z (feature Z - the new branch I want)
      \
       a--a--a (feature A)

这样我就可以将master用于发布和其他稳定的提交,同时根据需要合并A、B和Z功能。

那么我如何将“Z”提交移到它们自己的分支上?


4个回答

14
git checkout master
git branch feature-Z
git reset <commit_id>

其中,commit_id是指在b分支分离前的最后X次提交的标识符。


7
你可能需要使用 git reset --hard 命令。如果有任何未提交的修改,先使用 git stash 存储,然后在执行完 git reset --hard 后再使用 git stash pop 恢复。 - Aristotle Pagaltzis
同意,基本上。由于他没有提到/请求开始/希望工作树状态的任何内容,我提供了最小化输入的解决方案,以满足他的要求。他似乎知道足够的git来自己想出细节。我点赞了你的评论,以帮助其他人保持可见性。 - JB.
这让我留下了一个旧的主分支检出,其中所有关于Z的更改都没有提交或跟踪。我不得不手动清理它们,以便能够执行 git checkout feature-Z - Calimo
@Calimo:如果混合重置结果让你感到不安,那么你可以考虑使用亚里士多德的变体。 - JB.

6

为了完整起见,答案在这里 - http://git-scm.com/docs/git-reset - 搜索文本“撤消提交,使其成为主题分支”- 例子表明将最后3个提交作为一个分支,并将主干重置为这些3个提交之前的提交:

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 3 commits.
#
nothing to commit (working directory clean)
$ git branch topic/wip
$ git reset --hard HEAD~3
$ git checkout topic/wip
Switched to branch topic/wip

kernel.org的链接已经失效了,但是man git-rebase会给出你所使用的git版本的最新信息。 - Thunder Rabbit

2

只需将主分支重命名,并在最后的X处开始一个新的主分支:

git checkout master; git branch -m feature; git checkout -b master HEAD~6

(注:此处的X指的是从当前主分支HEAD向上数的第X个提交记录)

你提议的一个缺点是现在功能正在跟踪 origin/master。 - Spike Gronim

0
创建并检出所需的新分支
将主分支强制回退N个提交(在您的情况下为10)
git checkout -b feature-z
git branch -f master HEAD~10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接