我按时间顺序提交了c1,c2,...,c499,c500。我想回滚到c300而不是丢失c301到c409。我希望输入一个创建新的大提交c501的命令。
我不关心git的状态。我只想让文件的状态正常。
我试过了:
1)git reset --hard c3
然后git push -f
。这抹去了一切,我不得不问一个同事不要做git pull并给我一个他所拥有的拉链
2)git revert HEAD~2
。这看起来很有希望,但它在中途失败了:
error: could not revert 39714f4... blablabla commit message
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
3)git checkout c300
我现在在一个没有名字的新分支上。我试图重命名它并将其与master合并,但是master意识到我正在与前面的东西合并并且不会合并任何东西
4)在网上花了2个小时和SO
感谢您的帮助!!
答案 0 :(得分:2)
如果您只想将提交保留在某处以供参考,只需创建一个分支以引用它。
git checkout master # Assuming, master is the branch you want to rollback
git branch backup # This is your backup, it points to the same state as master right now.
git reset --hard c300 # Revert your branch to the target commit
git push --force # overwrite the repository HEAD on your server
然后,只要您想要访问已移除的提交,只需git checkout backup
。
这里要理解的重点是,在git中,分支只是一个指向提交的标签。
顺便说一下,下次丢失提交时,请检查git reflog
以查找之前提交的ID。
答案 1 :(得分:1)
如我的评论中所述,如果要重置为c409 git checkout c409 . && git commit -a -m "Reverted to c409"
checkout命令中的点很重要,应该从存储库根目录执行命令。还创建了一个很好的返回提交,而不是由git revert
创建的100~reversion提交。 这将破坏c409 - c500
答案 2 :(得分:0)
这是我个人所做的事。
1)创建并签出一个名为&#39; current_project&#39;的新分支。 (这将是你的备份)
git checkout -b current_project
2)将所有工作交给它
git add --all
git commit -m 'my latest commit'
3)现在创建另一个名为&#39; past_commits&#39;
的新分支git checkout -b past_commits
4)确保您使用past_commits
命令
git branch
分支
git branch
您所在的分支机构旁边应该有一个*
并以绿色着色。 (可能不是,取决于您的终端)
5)查看past_commits
分支
git log
您应该看到所有提交的大量列表,格式如下:
commit [commit id]
Author: [your username] <[your email]>
Date: [commit time]
[commit message]
我的一个项目的一个例子:
commit e271b3db885b55c2a2f665c018b97d3f
Author: Starkers <starkers@notmyemail.com>
Date: Sat Apr 11 13:33:30 2014 +0100
fix the production environment
commit c22c00636eb3f7234eea3789f001e66f
Author: Starkers <starkers@notmyemail.com>
Date: Fri Apr 10 14:37:12 2014 +0100
configure railgun correctly
6)现在你可以通过签出一个特定的提交来跳回任何提交,包括301到409范围内的任何提交(或者实际上任何提交):
git checkout [commit id]
例如,如果我想检查我的项目是什么样的皮秒,我正确配置了轨道炮宝石,我就跑了:
git checkout c22c00636eb3f7234eea3789f001e66f
因此您需要在301 - 401范围内找到提交,并通过粘贴其提交ID来检查它。
一旦你查看了所有内容,请运行
返回到现在git checkout past_commits
这将自动将您移回分支机构中的最新提交,这应该是您最近的提交内容。提交。
如果你想在过去进行更改并以新方向分支你的项目,我会使用硬重置来重置回特定的提交。小心,因为硬重置具有破坏性。它将删除所有未经跟踪的更改,并且当前分支中的所有提交都比重置提交更早!
reset --hard [commit id]
现在在这个分支中聆听你心中的内容,正常地承诺它(参见步骤2)。如果要返回原始项目的最新提交,请运行
git checkout current_project
一切都将是我最近提交的时间&#39;