我对git很新,所以在提出任何不可恢复的错误之前我会问... :-)
在最后几天,我对我的项目进行了一些更改,以升级到我使用的一些库的新版本,但是我失败了(也是因为libs文档的短缺...: - ()。
我只是决定放弃升级,所以现在我需要恢复到最后的稳定提交 我也推送到远程,但这应该不是问题,因为我目前是这个项目的唯一开发人员。
这是我目前的git日志:
$ git log --oneline
22c0713 Upgrading to Firebase 1.1
6d5f9f4 Porting customers to angularfire 0.8
fd9db42 Porting to Angularfire 0.8
d728b82 Working out authenticating on authenticated session problems
d511245 Testing authWithOAuthRedirect
abd9849 Porting to firebase 1.1.2
8884b88 Testing loadRemote() with relative path on public repositories
7830eea Testing loadRemote() with relative path on public repositories
f36c2f5 Finished working on I18N
...
f36c2f5 commit(我上面显示的最后一个)是最后一个稳定的,我想恢复的那个。
我还想避免丢失更新(不好)的提交,以备将来参考。
这项任务最合适的策略是什么?
更新:由于你的回答(我会在一分钟内接受......),我差不多了。还有一个小问题:我还有一个“gh-pages”分支,将我的dist子文件夹推送到github gh-pages分段站点。
现在,在
git checkout -b my_branch_for_future_reference
git checkout master
git reset --hard f36c2f5
git push -f
操作
git subtree push --prefix dist origin gh-pages
我收到此错误:
git push using: origin gh-pages
To git@github.com:MYUSER/MYREPO.git
! [rejected] 3febf7c0812441c7379710d0a1f5f1ec26adbd9e -> gh-pages (non-fast-forward)
error: failed to push some refs to 'git@github.com:MYUSER/MYREPO.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
我查了一下,但是git子树推没有'-f'标志......: - (
更新2 :我想我自己找到了上一个问题的答案:
git push origin `git subtree split --prefix dist master`:gh-pages --force
可能是解决方案,对吗? (我还没跑过......: - )。
更新3 :是的,这是强制推送子树的解决方案。
答案 0 :(得分:1)
我在这种情况下的常用策略是创建一个新分支(git branch <new_branch_name>
),然后将当前分支重置为您指定的提交(git reset --hard <commit>
,在这种情况下{{1} }})。但请注意git reset --hard f36c2f5
,因为它会消除工作树中任何未提交的更改。
您当前的分支将返回稳定提交,但您的其他提交仍然可以在新创建的分支中轻松访问。
答案 1 :(得分:1)
我会这样做:
git checkout -b upgrades
git checkout master
git reset --hard f36c2f5
git push -f
说明:
答案 2 :(得分:0)
一种可能性是创建一个指向最近“错误”提交的本地分支
git branch most-recent-bad-commit
然后将当前分支指向最后一次“稳定”提交
git reset --hard f36c2f5
请注意,后者还会删除对跟踪文件的任何未提交的更改。未经跟踪的文件不会被修改。
答案 3 :(得分:0)
假设您现在位于master
分支上,您可以创建一个名为experiment
的新分支,然后将主服务器还原为f36c2f5
。例如
确保您没有未提交的数据,然后创建新的experiment
分支
git branch experiment
将master
重置为最后一次良好提交:
git reset --hard f36c2f5
答案 4 :(得分:0)
有几种不同的方法可以解决这个问题。您可以简单地使用一系列git revert
命令来创建新的提交,以撤消您不再需要的提交中的更改。
git revert 22c0713
git revert 6d5f9f4
...
git revert 7830eea
(请注意,git revert
命令可以进行多次提交,因此您可以在一个命令中执行此操作,但我个人对此有不同的结果。)
或者,您可以在当前HEAD处创建一个新分支:
git branch for_future_reference
然后重置当前(预先存在的)分支以指向您想要的提交:
git reset --hard f36c2f5
请注意,使用后一种方法,您需要将推送(git push -f
)“强制”为远程以重写历史记录。因此,即使作为独立开发者,前一种方法也可能更为可取。