我检查了master
的一些提交,这些提交应该已经检入develop
。我用什么git命令从master分支中删除那些提交并包含在develop分支中?
答案 0 :(得分:40)
如果我没弄错的话,你有两个同步的分支,
master
和dev
,只是忘了切换分支,
在你提交之前。
如果是这种情况,我们有:
----------------
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
会导致数据丢失。
答案 1 :(得分:7)
为了应对另一个分支,你可以使用樱桃采摘:
git cherry-pick <commit>
删除并不容易。您可以使用rebase和squash或编辑提交:
git rebase -i <commit>~1
但是我不确定在rebase期间选择编辑是否可以编辑文件而不是仅提交消息。
答案 2 :(得分:6)
您可以cherry-pick
将您的提交转到develop
,然后以rebase
master
分行git checkout develop
:
git cherry-pick aabbcc
git cherry-pick ddeeff
git checkout master
git rebase 123456 -i
123456
其中{{1}}是您犯错之前的提交。这将打开一个编辑器,显示将受到rebase影响的每个提交。删除与要放弃的提交相对应的行,然后退出编辑器。
答案 3 :(得分:0)
通常有几种方法可以用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到最后一次良好提交的所有审核,您所要做的就是删除提交行以转移到分支开发