如何将git提交从master转移到另一个现有分支

How to move git commits from master to a different existing branch

本问题已经有最佳答案,请猛点这里访问。

我向master提交了几份应签入develop的承诺书。我应该使用什么git命令从主分支中删除这些提交并将其包含在开发分支中?


如果我没弄错的话,你有两个同步分支,masterdev都忘了切换分支,在你的承诺之前。

如果是这样,我们有:

1
2
3
4
5
6
7
----------------
git log in dev

xxx
yyy
...
----------------

还有:

1
2
3
4
5
6
7
8
9
10
11
----------------
git log in master

ccc
bbb
aaa
        <---- here you forgot to switch branch
xxx
yyy
...
----------------

解决方案是:

首先,确保:

1
git status -s

返回空结果。

接下来,从masterdev的所有新承诺:

1
2
git checkout dev
git merge master

现在回到你身边,1号[3号]:

1
git checkout master

删除不必要的提交:

1
git reset --hard HEAD~3

~3号是要删除的提交数。

记住:git status -s必须返回空结果。否则,git reset --hard会导致数据丢失。


为了适应另一个分支,您可以使用樱桃采摘:

1
git cherry-pick <commit>

删除并不是那么容易。您可以使用rebase和squash或编辑提交:

1
git rebase -i <commit>~1

但是,我不确定在重新设置期间选择"编辑"时,是否也可以编辑文件,而不是只编辑提交消息。


你可以在developrebase之后交互地向master分支机构承诺:

  • 江户十一〔四〕号
  • 埃多克斯1〔5〕
  • 埃多克斯1〔6〕
  • 江户十一〔七〕号
  • 埃多克斯1〔8〕
  • 在你犯错误之前,你犯了一个错误。这将打开一个编辑器,显示将受钢筋影响的每个提交。删除与要放弃的提交对应的行,然后退出编辑器。


    通常有几种方法可以在Git中执行相同的操作—一种可能的方法:

    1
    2
    3
    4
    git checkout develop
    git cherry-pick XXX // XXX being the sha1 of the commit you want to grab
    git checkout master
    git rebase --interactive HEAD~IDX // IDX being the position of the last"good" commit compared to HEAD

    最后一个命令将显示从头部到最后一个良好提交的所有评审,您所要做的就是删除要移动到分支开发的提交行。