如何git rollback而不是丢失更改?

时间:2014-04-14 21:18:06

标签: git

我按时间顺序提交了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

感谢您的帮助!!

3 个答案:

答案 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;