掌握Git撤销操作,随心所欲控制文件状态

本文主要讨论和撤销有关的 git 操作。目的是让读者在遇到关于撤销问题时能够方便迅速对照执行解决问题,而不用去翻阅参数繁多的 git 使用说明。

一开始你只需了解大致功能即可,不必记住所有命令和具体参数。事实上,如果没有经过反复多次的操作,这些没血没肉的命令是很难被全部记清楚的,就算现在记住了,也会很快遗忘(天赋异禀,过目不忘者除外)。建议读者在遇到特定问题时对照场景操作,多用几次自然就记住了。

首先,我们再看看上一篇文章中的这张图:

git 命令和文件状态转换

这张图能让你一目了然的看到各种命令产生的效果。其中箭头移动方向可以理解成文件版本的复制方向。根据箭头的指向,我们能清楚的看到每个操作所产生的影响。几乎所有的git操作也就是让文件在这三个工作区域内移动,列如:

  • git add files 工作目录下files复制 ->暂存区;
  • git checkout files 暂存区files复制 -> 工作目录;
  • git commit 暂存区内的文件作为一个版本保存 -> 版本库。

为了使本文更具实用性,让我们来结合上图,通过实际项目中可能遇到的问题,以 Q&A 的形式来逐一讨论,当你遇到相似问题时可以迅速找到解决方法。

  1. Q: git add之后如何撤销?

    TL;DR [1] 答案: 可以使用 git reset 撤销 所有 暂存区域文件。使用git reset file 来撤销特定的文件。该命令只是把暂存区内容移除,不会覆盖工作目录中已经修改过的同名文件。

    考虑这个场景,你正在为你的项目添加一个新功能,快完成时,你打算暂存起来,测试好了再 commit,于是你使用:

    git add home.js

    把涉及新功能改动的文件 home.js 暂存起来。此时你突然接到一个很紧急的 bug,需要立刻修复,你在一通 debug 之后成功 fix 了 bug,于是把涉及该 bug 的更新添加到暂存区:

    git add main.js common.js

    在准备使用 git commit 提交改动之前,你习惯性看看暂存区有哪些文件会被提交,于是你使用 git status 发现暂存区有三个文件:

    home.js main.js common.js

    很显然,你此时只想提交关于 bug 的修改部分文件,如果此时使用 git commit 会把关于其他功能的修改一起提交。那如何移走暂存区域home.js?很简单,只要执行 git reset 即可移除:

    git reset home.js

    之后执行 git commit 来提交这次 bug 修复所引起的改动。

    当然,如果你打算先提交新功能改动之后再提交 bug 修复内容,你可以先使用

    git reset main.js common.js 取消暂存区 bug 修改相关文件,再执行

    git commit

  2. Q: 如何丢弃工作目录的更改?

    答案:使用 git checkout file 。 注意 ,该操作不可逆,一旦被执行,你的改动都会消失,一般情况下只有你非常确定不需要工作目录下的最新改动内容才会这么做。 该命令会用暂存区的 file 内容覆盖掉工作目录的 file 文件内容。如果这个文件没有加入暂存区(或者说暂存区该 file 内容和Git仓库内容相同),执行该命令后,工作目录中该文件版本将和Git仓库最近一次提交版本相同。举例:

    git checkout home.js

    注意,如果你正好有个 branch 名字叫 home.js, git checkout 会checkout 一个 branch,此时你可以加上 -- 来用来表明这是个文件。

    git checkout -- home.js

    如果你想直接用最新的git仓库文件同时覆盖掉暂存区和工作目录内容可以使用(参见前文图示):

    git checout HEAD -- files

  3. Q: 如何丢弃本地仓库的 commit 内容?

    git reset --soft HEAD~1

    执行上述操作会撤销最后一次 commit 产生的效果并且保留 working directory 你所改动的内容。

    git reset --hard HEAD~1
    执行上述操作会撤销最后一次 commit 产生的效果并且 覆盖 working directory 你所改动的内容。慎用,你一天的工作可能就此付之一炬,出了问题不能懒我(无辜状)。

    如果想取消最近N次的 commit 内容,只要把上面的1换成相应的数字即可。

  4. Q: 如何获取Git服务器上最新内容?

    经常拉取新内容,可以减少 code merge。只要简单的执行 git pull 即可。注意还有一个类似的命令是 git fetch,二者的区别简单来说是:

    git pull = git fetch + git merge

最后总结关于撤销操作的要点

操作 撤销
git add file git reset
重置暂存区内容,使得暂存区版本和仓库版本一致
git reset file
重置某一个文件的暂存状态,产生效果也就是把该文件从暂存区移除
修改了工作区文件 git checkout -- files
用暂存区版本 覆盖 工作区文件
git checout HEAD -- files
用git仓库最近版本 覆盖 工作区文件
git commit git reset --soft HEAD~1
撤销最近一次 commit 且不删除工作区改动
git reset --hard HEAD~1
撤销最近一次 commit 且强制同步工作区版本到这 commit 改动之前状态

参考文献

  1. Pro Git book
  2. A Visual Git Reference 须自备梯子

来自:http://www.jianshu.com/p/4ebbff227b87

原文地址:https://www.cnblogs.com/yhaing/p/8473783.html

时间: 2024-08-29 06:31:52

掌握Git撤销操作,随心所欲控制文件状态的相关文章

git分支合并、撤销;git修改已push的commit信息; git 撤销操作;

git分支合并 1.分支代码提交 2.git branch 查询本地分支 3.git checkout 分支名1 切换分支到需要合并的分支上 4.git merge 分支名2  //选择要合并到 分支名1 的分支名2 eg: 如果develop_screen分支合并到develop分支上,这个时候切换到develop分支上, git merge develop_screen 5.合并之后可能会有冲突,可用git status 查看冲突代码 <<<<<<<  ===

git撤销操作和历史查看(git log)

git查看历史和撤销操作 撤销提交 git commit --amend可以撤销上一次提交的内容,不过并不是撤销整个提交的记录,当使用这个命令之后可以修改提交信息,同时,这个命令也会自动将暂存区中的所有文件提交.如果自上次提交以来未做任何修改,比如在上次提交之后立即执行这个命令,那么快照会保持不变,所修改的只是提交信息. 首先修改Test7.md,并提交 假如这时候突然发现上一个提交中遗漏了一个Test8.md,这时候只需要将Test8.md添加到暂存区.并使用命令git commit --am

git学习笔记03-本地git常用操作及原理-文件增删改

1.查看git状态 git status  这个可以告诉我们对git做了哪些操,比如增删改 2.既然我们修改了东西,有的时候想看看修改了什么,毕竟我们的记忆力并不如电脑 git diff 文件名 (默认和暂存区比较.啥事暂存区后面说) 3.修改了之后我提交了,我想看看提交的日志git log -- pretty = oneline  (后面这是格式化用的,可以不写) 4.突然想起来我提交的这个有错误怎么办,我想恢复到之前的版本 git reset --hard HEAD^ ( HEAD^ 是之前

git撤销操作总结

暂存区回退 git checkout -- 误删的文件名 该命令符合以下场景: 场景一 在某个分支上开发时,你不小心误删了其中一个文件,这时候你还没有add到暂存区 场景二 把某个已经add到暂存区但还没commit的文件的修改全部撤销 场景三 某文件自修改后还没有被add到暂存区,现在撤销修改就回到和版本库一模一样的状态 git reset HEAD 文件名 可以把暂存区的修改撤销掉,重新放回工作区(只是从暂存区撤出,并没有回滚修改的内容) 提交(commit)版本回退 首先git log 查

谈谈 git 撤销操作

在工作中,往往会因为一些误操作,想撤销代码,下面我简单介绍一下如何操作(如果不了解 git 的基础用法,可以点击这里:链接) 撤销本地修改 git checkout 文件 撤销所有文件 git checkout . 撤销所有文件 git clean -df 撤销所有文件也可以执行 git clean -df git reset --hard 撤销已经提交的修改 git revert 版本号 撤销已提交的修改也可以执行 git reset --hard 版本号 原文地址:https://www.c

git撤销操作

在本地更改了文件 用 git status 命令是能看到更改了哪些文件的 显示为红色修改的文件,接下来 git add <filename> 将修改的这个文件添加到暂存区 显示为绿色,通过git reset HEAD --<filename>  将通过 git add 添加的文件从缓冲区撤销 会重新变为红色 再通过 git checkout -- <filename>  撤销工作区的修改,回到你没有修改过的地方.同时这个命令可以用于你不小心改了好多你不想提交的文件,让文

git 撤销操作

从上图可以看出  我们如果要撤销 staged area 区域的东西 可以使用git  reset file  name 如果要撤销work dirctory  的可以使用 git checkout file  name 如果要撤销 work directory 的东西,我们可以使用 git  checkout HEAD  file name 如果要从work directory  提交到history  可以用  git  commit -a -m "备注说明"  or  git c

Android Studio配置Git及Git文件状态说明

Android Studio配置Git还是比较简单的,麻烦的是可能中间出现各种问题.如果你想了解或感兴趣,请往下看. 首先你得下载Git客户端,网址:http://git-scm.com/download/. 根据需要下载相应的版本,并安装.然后在Android Studio中指定git.exe,点击“Test”,成功则会弹出以下提示. 由于我用的是Android Studio 2.0 Preview,根本不存在“Enable Version Control Integration”提示,害我找

git commit 之后,撤销操作

搬运自:  git撤销操作 更多操作参见原地址. 修改最后一次提交 有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了.想要撤消刚才的提交操作,可以使用 --amend 选项重新提交: git commit --amend 此命令将使用当前的暂存区域快照提交.如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样. 启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交.