38

master我签入了一些应该签入的提交develop。我使用什么 git 命令从主分支中删除这些提交并包含在开发分支中?

4

4 回答 4

53

如果我没记错的话,你有两个同步的分支, masterdev,只是在你提交之前忘记切换分支。

如果是这样,我们有:

----------------
git log in dev

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

和:

----------------
git log in master

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

解决方案是:

首先,请确保:

git status -s

返回空结果。

接下来,获取所有新的master提交dev

git checkout dev
git merge master

现在返回给你master

git checkout master

删除不必要的提交:

git reset --hard HEAD~3

该数字~3是您要删除的提交数。

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

于 2013-03-06T17:07:46.557 回答
16

您可以cherry-pick将您的提交提交到您的分支develop,然后以交互方式提交:rebasemaster

  1. git checkout develop
  2. git cherry-pick aabbcc
  3. git cherry-pick ddeeff
  4. ……
  5. git checkout master
  6. git rebase 123456 -i

123456犯错之前的提交在哪里。这将打开一个编辑器,显示每个受变基影响的提交。删除与您要丢弃的提交相对应的行并退出编辑器。

于 2013-03-05T22:30:35.743 回答
8

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

git cherry-pick <commit>

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

git rebase -i <commit>~1

但是我不确定在变基期间选择编辑时是否也可以编辑文件而不是只编辑提交消息。

于 2013-03-05T22:30:50.173 回答
1

通常有几种方法可以在 git 中做同样的事情一种可能的方式:

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

最后一条命令将显示从 HEAD 到最后一次良好提交的所有评论,您所要做的就是删除提交的行以移动到分支开发

于 2013-03-05T22:33:30.180 回答