我是git的新手,不知道如何处理这个问题。
我想撤消一系列特定提交(与单个文件有关),我们认为这些提交不是解决问题的好方法,但我想保留自此以后引入的所有其他提交。
我不想只是编辑文件来删除那段代码,因为我觉得这里的回复更明确,并且更好地宣传。
它是这样的:
X - > Y - > X - > -X - > Y - > X - > X
Y 指的是与该特定功能相关的提交,X是我们希望保持完整的所有提交,最后是:
X - > X - > -X - > X - > X
我不确定rebase如何在这里工作,因为我不想仅仅包括从某一点开始的所有提交。
选择樱桃是一种更好的方法吗?
编辑:可能值得一提的是所有这些提交都被推送了。
答案 0 :(得分:2)
您可以使用交互式rebase 来修复您的错误如果您的提交尚未共享(仍然是您的存储库中的本地提交)
语法是:git rebase --interactive commit的hash(或者只是git rebase -i commit的哈希)
在你的情况下,让我们说你的第一个x提交的哈希是x1(使用git log来git这个提交的哈希码),然后你可以使用:git rebase -i x1
对于您要删除的每个提交,请删除
替换选择然后退出编辑模式(使用ESC键)和:wq
答案 1 :(得分:1)
您可以按照此处的说明使用git rebase --onto
:https://blog.pivotal.io/labs/labs/git-rebase-onto
在您的特定情况下:
X1 -> Y1 -> X2 -> X3 -> Y2 -> X4 -> X5
命令是:
git rebase --onto X3 Y2 # strips Y2
git rebase --onto X1 Y1 # strips Y1
答案 2 :(得分:0)
您可以将特定文件还原为以前的提交:
git reset <commit hash> <filename>
最好先查看对文件所做的更改:
git diff <commit hash> <file name>
您可以使用git log
获取提交哈希值。
或者,您可以从版本控制中签出以前版本的文件:
git checkout -- <file name>
修改:更多信息here。
答案 3 :(得分:0)
我个人更喜欢git rebase -i HEAD~10(最近10次提交的交互式rebase),我会通过评论他们的行来删除糟糕的提交。
请注意,这需要一个push -force,这总是要非常小心。