git的文件状态说明
git checkout -- files
把文件从暂存区域或历史记录中复制到工作目录,用来丢弃本地修改。git reset -- files
用来撤销最后一次git add files,你也可以用git reset 撤销所有暂存区域文件。git reset [option] commitid
用来撤销历史记录,option选项–soft,–hard,–mixed。
- –soft只影响历史记录;
- –mixed影响历史记录,暂存区;
- –hard影响历史记录,暂存区,工作目录;
实例说明
假如git项目中有三个文件a.txt,b.txt,c.txt,目前处于已提交状态
当前a.txt的内容为
a.txt is a git file
1. 回退修改的文件(未add)
编辑a文件后
a.txt is a git file, i found something is wrong
发现写错了,想撤回到未修改之前,执行命令
git checkout -- a.txt
a.txt的内容重新变成了
a.txt is a git file
2. 回退已add到暂存区的文件(未commit)
继续修改a.txt,内容最终为
a.txt is a git file, i want commit it
执行命令
git add a.txt
突然任性不想提交这个内容了,怎么办
回退执行命令
git reset --hard
a.txt的内容重新变成了
a.txt is a git file
这里有一个问题,假如同时修改了a.txt,b.txt两个文件,执行上面的命令也会把b.txt回退,如果这种情况可以:
git reset
只会清空暂存区,并不影响工作目录
git checkout -- a.txt
从历史记录把a.txt复制到工作目录,就可以单独回退a.txt了
3. 回退已commit的文件
当天小酌了一杯,不小心把a.txt
a.txt is a git file, i want commit it
提交了。
git add a.txt
git commit -m "a.txt commit"
回退执行命令
git reset --hard HEAD~1
谢天谢地,a.txt又回到了
a.txt is a git file
这里同样有一个问题,假如同时提交了a.txt,b.txt两个文件,执行上面的命令也会把b.txt回退,如果这种情况可以:
git reset HEAD~1
历史版本回退,历史版本复制一份到暂存区,并不影响工作目录
git checkout -- a.txt
从暂存区把a.txt复制到工作目录
最后把b.txt重新提交下
git add b.txt
git commit -m "回退a.txt"
如果不想回退了,回到回退之前的版本
查看回退之前的版本号commitid
git reflog
假如为如6558aa6
回到回退之前的版本
git reset --hard 6558aa6
回退中间某些提交
例如 E—F—G—H—I—J topicA,回退G的这次提交记录,可以执行
git rebase --onto F H J
4. 回退到某个时间段
git checkout `git rev-list -n 1 --before="2017-08-27 13:37" master`