总结Git 不同情况下撤销和如何回滚

更新日期: 2019-03-02 阅读: 3.5k 标签: git

撤销

在未进行git push前的所有操作,都是在“本地仓库”中执行的。我们暂且将“本地仓库”的代码还原操作叫做“撤销”


情况一:文件被修改了,但未执行git add操作(working tree内撤销) (modify file) <==> git checkout <filename>/.

git checkout fileName
git checkout .


情况二:同时对多个文件执行了git add操作,但本次只想提交其中一部分文件 git add <==> git reset HEAD <filename>

$ git add *
$ git status
# 取消暂存
$ git reset HEAD <filename>


情况三:文件执行了git add操作,但想撤销对其的修改(index内回滚) (modify file and add) <==> git reset HEAD <filename> && git checkout <filename>

# 取消暂存
git reset HEAD fileName
# 撤销修改
git checkout fileName


情况四:修改的文件已被git commit,但想再次修改不再产生新的Commit git commit <==> git commit --amend -m 'msg'

# 修改最后一次提交 
$ git add sample.txt
$ git commit --amend -m"说明"


情况五:已在本地进行了多次git commit操作,现在想撤销到其中某次Commit (git multiple commit) <==> git git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]

一般使用 --soft

git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]


回滚

上述场景二,已进行git push,即已推送到“远程仓库”中。我们将已被提交到“远程仓库”的代码还原操作叫做“回滚”!注意:对远程仓库做回滚操作是有风险的,需提前做好备份和通知其他团队成员!


情况一:切换到 tag 或 branch

如果你每次更新线上,都会打tag,那恭喜你,你可以很快的处理上述场景二的情况 git tag <==> git checkout <tag>

git checkout <tag>

如果你回到当前HEAD指向 (git current HEAD) <==> git checkout <branch_name>

git checkout <branch_name>


情况二:撤销指定文件到指定版本 (git file in history) <==> git checkout <commitID> <filename>

# 查看指定文件的历史版本
git log <filename>
# 回滚到指定commitID
git checkout <commitID> <filename>


情况三:删除最后一次远程提交 git revert HEAD || git reset --hard HEAD^

方式一:使用revert 会有新的 commit 记录

git revert HEAD
git push origin master

方式二:使用reset 不会产生新的 commit 记录

git reset --hard HEAD^
git push origin master -f

二者区别:

  • revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
  • reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。


情况四:回滚某次提交 (git commit in history) <==> git revert <commitID>

# 找到要回滚的commitID
git log
git revert commitID

同样的,revert 会出现一次新的 commit 提交记录,这里也可以使用 reset


删除

删除某次提交 (git commit in history) <==> git rebase -i <commitID>

git log --oneline -n5

git rebase -i <commit id>^

注意:需要注意最后的_^_号,意思是commit id的前一次提交

git rebase -i "5b3ba7a"^

在编辑框中删除相关commit,如pick 5b3ba7a test2,然后保存退出(如果遇到_冲突_需要先解决_冲突_)!

git push origin master -f

通过上述操作,如果你想对历史多个commit进行处理或者,可以选择git rebase -i,只需删除对应的记录就好。rebase还可对 commit 消息进行编辑,以及合并多个commit。

转自:https://blog.csdn.net/ligang2...


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/2176

相关推荐

git从远程仓库克隆dev分支到本地的实现

这篇文章主要介绍git从远程仓库拉取dev分支到本地的实现【gitLab】:初始化一个本地仓库、与远程仓库建立连接 、查看本地是否具有dev分支、在本地创建分支dev并切换到该分支 、dev分支上的内容都拉取到本地

解决git/github下载速度缓慢的问题总汇

官网下载Git时,速度几乎是超不过20KB,解决方法有很多,这里介绍几个简单粗暴的方法。这里使用windows系统作为演示,其他系统对号入座即可。

git强制覆盖master分支

在开发中,通常会保持两个分支master分支和develop分支,但是如果因为develop上面迭代太多而没有及时维护master,最后想丢弃master而直接将测试确认过的develop强推到master,该怎么操作呢?因此,做如下总结分享,希望对遇到同样问题的人用帮助。

Git报错:remote: HTTP Basic: Access denied的解决方法

账号密码验证不通过,密码或者权限不对,导致 Git 操作失败。输入:git config --system --unset credential.helper,再次进行 Git 操作,输入正确的用户名,密码即可。

通过git命令,上传本地文件到git服务器

把本地代码上传到git的方法:步骤一:首先进入需要上传的项目文件夹,通过命令git init初始化,步骤二:将本地文件添加到版本库中,使用命令 git add . 将文件提交到本地的暂存区,步骤三:使用命令git commit将文件提交到本地仓库...

vscode git 全局忽略文件和文件夹

windows 中先在当前用户根目录下创建一个全局要忽略的文件列表.gitignore_global,window下 只有扩展名的文件不让保存,可以在 git bash中创建文件;二、 然后在命令行下执行下面git 命令

git合并分支

假如我们现在在dev分支上,刚开发完项目,执行了下列命令:想将dev分支合并到master分支,操作如下:首先切换到master分支上,如果是多人开发的话 需要把远程master上的代码pull下来

Git忽略规则文件.gitignore_关于.gitignore配置

.gitignore 文件的作用就是告诉git, push的时候忽略指定的文件夹或者文件,例如:vue-cli脚手架创建的项目,push到github上时,不会上传node依赖文件夹,这是因为vue-cli脚手架创建的时候,自动为我们创建了 .gitignroe文件,并且为我们写好了规则。

Git 如何撤回某一次提交?

在 master 分支做了一次 commit.之前没有出过这样的错误。就算出现也是直接push了然后再 reset 回滚然后再次 push -f。重置位置的同时,只保留Working Tree工作目录的內容

.gitignore的使用手册

避免将不必要的文件添加到版本管理系统中,比如前端的node_modules目录,该目录包含大量文件,如果将其添加到版本管理系统中,会使仓库变的庞大,不利于仓库的管理。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!