我有一个rails应用程序,我在20个提交之前进行了一些迁移,然后最终不需要创建的表。我将更改推送到github,因此架构和迁移都在我的git历史记录中,但没有人克隆或使用我的分支。我想知道是否有一种方法可以将git恢复为该提交并刚刚删除了提交的迁移方面?
答案 0 :(得分:3)
您首先必须“还原”您不想要的提交,然后再次推送到GitHub以从您的在线历史记录中删除。
让我们看看如何:
第1步
要恢复某些提交,您可以通过以下任何方式运行git rebase
。
a)如果您知道要恢复的提交的SHA1(请注意末尾的“^”):
git rebase -i SHA1^
,或者
b)如果你知道它是20次提交之前:
git rebase -i HEAD~21
这样做,Git将打开vim。
<强> STEP2 强>
现在,您将看到提交的列表short SHA-1
并提交消息。
删除所有不需要的内容(空白行和注释 - 以“#”开头 - 被忽略),每行dd
,或d20d
如果要从一行删除20行你是在。保存并退出(使用:wq
)。 Git将删除您刚刚删除的所有提交。
重要:如果保存的文件为空或只有空行和/或注释,Git将中止操作。
第3步
使用这些更改更新您的GitHub存储库。要做到这一点,你必须强制推动:
git push --force origin/master
我假设您跟踪GitHub存储库作为源,并且您正在处理主分支。 否则请用您的配置替换它们。
<强> END 强> 您从本地和GitHub中删除了这些不需要的提交。
答案 1 :(得分:0)
我会运行一个rebase
git rebase -i <commit>^
然后将pick
更改为edit
答案 2 :(得分:0)
这是一个解决方案: 就像史蒂文所说的那样,交互式变基是一件好事。
$ git rebase -i [the_commit_preceding_your_problematic_commit]
启动此命令后,系统会提示您进入编辑器,其中包含一个菜单,您可以在该菜单中查看从有问题的提交开始的所有提交(在顶部)。 每个提交都以pick关键字开头。
要编辑提交,您必须通过修改或 e 替换选择。 保存并离开编辑器,您将在使用edit标记的提交中处于分离的HEAD状态。 (好像你的时间一直走到那个提交的那一天) 现在你必须重置提交。
$ git reset HEAD^
即你落后一步。您将在交错区域中查看提交的所有文件,但尚未在索引中查看。
$ git status
现在您可以删除所需的文件,添加另一个文件并提交。 你的提交现在就像你想要的那样。
请记住,你还处于独立的HEAD状态。要告诉git一切正常,你必须输入:
$ git rebase --continue
然后git会带你回到你最后做出的最后一次承诺。 但是,你重写了git分支的所有历史记录。
为了推动您的修改,您必须指定push命令的--force选项。
注意:在重新定位时,如果出现问题,请执行以下操作:
$ git rebase --abort