[译]git reset
git reset
如果说git revert是一个安全的撤销方式, 那么git reset就是一个非常危险的方法了. 当你使用git reset撤销的时候, 你没有可能在回到最初了-他是一个永久的不可撤销的undo. git reset时Git命令中唯一一个有可能丢失你工作的命令.
git reset可以用来删除已经commit了的快照, 但是他更多的是用来撤销在stage区和工作目录下的修改. git reset应该只用来撤销本地的修改-不应该使用reset撤销和其他开发者一起共享的commit.
用法
git reset <file>
从stage区删除指定的文件, 工作目录下不变. 这个unstage状态中的文件不会覆盖任何修改.
git reset
撤销整个stage区, 回到最近一个commit的状态, 工作目录下不变. unstage状态中所有文件不会覆盖任何修改, 给你一个从头开始re-build stage区的机会.
git reset --hard
撤销整个stage区和工作目录, 回到最近一次commit的状态. --hard标记告诉Git在工作目录下也要覆盖所有的修改. 他会撤销所有没有commit的修改, 而且是不可逆的, 因此使用他之前你要十分谨慎.
git reset <commit>
回到你指定的<commit>, 工作目录不变. 从<commit>开始所有的修改依然在你的工作目录当中, <commit>后的所有commit快照都被删除了, 这给了我每一个重新commit项目的机会.

git reset --hard <commit>
类似于git reset <commit>但是你的工作目录下面的文件也回到<commit>时的状态.
讨论
上面的命令都用来从仓储中撤销修改. 如果没有--hard标记, git reset是一个通过撤销stage区和commit快照来重新构建他们的一个好的方法. 当你正在项目中做的实验失败了你需要完全撤销的他们(包括本地工作目录), 这个时候你可以使用--hard标记.
revert被设计用来安全的撤销公共的commit, git reset被设计用来撤销本地的修改. 因为他们的目的不同, 他们的实现也不同: reset完整的删除一个changeset. revert会保留最初的changeset, 通过新建一个commit来撤销.
不要reset一个公共的项目历史
如果<commit>后面的快照已经被push到公共仓储了, 那么你应该使用git reset <commit>. 当你发布了一个commit的时候, 你应该假设其他的开发者已经依赖, 使用了你这个commit里面的内容. 下面将演示如果你reset了一个公共commit将发生什么.


当你在reset之后创建了一个commit, Git会认为你本地的历史从origin/master中分离了.
要确保你的git reset <commit>只运用于你本地--而不是已经push了的公共修改. 如果你需要fix一个公共的commit, 你应该使用revert.
例子
从缓存区删除一个文件
git reset经常被用来从缓存区删除一个文件. 下面的例子假设你有两个文件hello.py和main.py, 这两个文件已经被添加到了仓储.
# Edit both hello.py and main.py # Stage everything in the current directory
git add . # Realize that the changes in hello.py and main.py
# should be committed in different snapshots # Unstage main.py
git reset main.py # Commit only hello.py
git commit -m "Make some changes to hello.py" # Commit main.py in a separate snapshot
git add main.py
git commit -m "Edit main.py"
如你所见git reset让你的commit更加具有原子性, 把你下面commit不相关的修改先从缓存删除掉, 然后从缓存区把剩下的都是相关的修改commit掉.
删除本地commmit
下面的假设你正在本地做一些实验(都还是没有push的), 但是你决定放弃实验中做的所有修改, 完全的删除掉某个commit之后的快照.
# Create a new file called `foo.py` and add some code to it # Commit it to the project history
git add foo.py
git commit -m "Start developing a crazy feature" # Edit `foo.py` again and change some other tracked files, too # Commit another snapshot
git commit -a -m "Continue my crazy feature" # Decide to scrap the feature and remove the associated commits
git reset --hard HEAD~2
git reset HEAD~2移除掉从当前branch往后数的第二个commit的所有快照. 再次强调, reset <commit>只应该作用于没有push的commit.
[译]git reset的更多相关文章
- [译]git的那些flag
git add -p console有一个交互式的界面(如下图),让你一个一个文件的选择是add还是不add.注意这些文件必须是tracked过的, 也就是说如果你的新的文件从来没有add过,那么他不 ...
- git revert和git reset的区别
git revert 是撤销某次操作,此次操作之前的commit都会被保留 git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区 具体一个例子,假设有三个commit, git s ...
- 代码回滚:git reset、git checkout和git revert区别和联系
git reset.git checkout和git revert是你的Git工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件. 因为 ...
- 撤销git reset soft head操作
一不小心在eclipse的git库中执行了Reset Soft(HEAD ONLY)操作,不料界面中竟然没有找到撤销方法(于是心中五味俱全,经过一番折腾,无果还是回归Git本身),最终通过命令行,很快 ...
- [转]恢复 git reset -hard 的误操作
转帖:http://hi.baidu.com/configuration/item/97fddeea252818d0eb34c964 有时候使用Git工作得小心翼翼,特别是涉及到一些高级操作,例如 r ...
- git reset revert 回退回滚取消提交返回上一版本
git reset revert 回退回滚取消提交返回上一版本 总有一天你会遇到下面的问题. (1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚. (2)改完代码测试也没有问题,但是上线发现你 ...
- 每天一命令 git reset
在使用git的时候不免遇到commit的时候commit了错误的代码的时候,这时候就需要用到git的常用命令之一 reset了. reset顾名思义为重置.重置的是HEAD指针,可以使HEAD指针移 ...
- [译]git reflog
用法 git reflog 显示整个本地仓储的commit, 包括所有branch的commit, 甚至包括已经撤销的commit, 只要HEAD发生了变化, 就会在reflog里面看得到. git ...
- [译]git clean
git clean命令用来从你的工作目录中删除所有没有tracked过的文件. git clean经常和git reset --hard一起结合使用. 记住reset只影响被track过的文件, 所以 ...
随机推荐
- Hibernate学习-Hibernate查询语言HQL
HQL(Hibernate Query Language)Hibernate查询语言,语法类似于SQL,可以直接使用实体类及属性. 使用HQL 可以避免使用JDBC 查询的一些弊端 不需要再编写繁复的 ...
- Codeforces Round #389 Div.2 E. Santa Claus and Tangerines
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- 第一个有点作用的PHP扩展
C/C++去开发PHP扩展 我觉的对于PHP开发人员来说,学的东西非常杂,也非常多,当然了开发PHP扩展也是一个必须要掌握的技能,这里膜拜下大神鸟哥(Laruence)~ 今天要开发的第一个有点功能的 ...
- 根据html容器大小和显示文字多少调节字体大小
在做html相关的东西的时候经常会遇到这样的问题,容器大小(长x宽)固定,容器包含内容(特指文字)多少不固定,这个时候就让人很苦恼了,将字体大小设置成多少才合适呢?下面看看我的解决思路: 首先要知道网 ...
- Linux上性能异常定位以及性能监控
引言:大多数的服务都是跑在Linux上的,Linux现在也已经到了一个很广泛的应用,但是仍然会有很多问题出现,我们就来讨论下我们性能监控的指标,性能监控无非就是从I/O,内存,CPU,TCP连接数,网 ...
- JavaScript 的错误(Error)与异常(Exception)处理
PHP很少用到错误处理,因为框架帮了大忙,所以基本上没有主动接手过PHP的错误.PHP是偏后端的动态处理语言,和用户的关系不大,所以用户不会关心是否出现了报错.但是JavaScript就非常不同了,j ...
- yum出现“No module named yum”错误解决方法
安装了一个Python2.7,隔天发现yum无法使用,报错信息如下,应该是系统是使用的默认的python2.6的版本 解决办法修改yum文件#vi /usr/bin/yum将 #!/usr/bin/p ...
- kailli添加桌面快捷方式
kailli添加桌面快捷方式 /usr/share/applications/xxx.desktop 注意大小写要与Name对应 [Desktop Entry] Version=1.0 Name=Tu ...
- electron-Node.js Error: Module version mismatch. Expected
本来以为是nodejs的版本问题,后来才发现是electron用本地包的问题 Installing modules and rebuilding for Electron You can also c ...
- e_msg_c_gs_enter_gs_req
e_msg_c_gs_enter_gs_req 就是到GS上验证客户端发送的token是否存在,如果存在返回成功,并把该token删除