以提问中修改了两个文件a、b为例,假设需要撤销文件a的修改,则修改后的两个文件:1、如果没有被git add到索引区git checkout a 便可撤销对文件a的修改2、如果被git add到索引区,但没有做git commit提交1)使用git reset将a从索引区移除(但会保留在工作区)git reset HEAD a2)撤销工作区中文件a的修改git checkout a 3、如果已被提交,则需要先回退当前提交到工作区,然后撤销文件a的修改1)回退当前提交到工作区git reset HEAD^2)撤销工作区中文件a的修改git checkout a 补充:灵活使用以上操作的关键在于理解git中工作区、索引区的概念和git reset命令hard、mixed(default)、soft三种模式的区别,网上有很多这方面的文章,不再赘述。
for index – Unstaging a Staged File / undo a added file
$ git reset HEAD benchmarks.rb
for Working directory – Unmodifying a Modified File
git checkout – benchmarks.rb
Or revert deleted folders
git checkout – /root/vdi/vdia/third_party/ClientPlatform/src/
Git常用的撤销操作 之前的总结 希望可以帮到你
基本状态标识
- A- = untracked 未跟踪
- A = tracked 已跟踪未修改
- A+ = modified - 已修改未暂存
- B = staged - 已暂存未提交
- C = committed - 已提交未PUSH
各状态之间变化
- A- -> B : git add <FILE>
- B -> A- : git rm --cached <FILE>
- B -> 删除不保留文件 : git rm -f <FILE>
- A -> A- : git rm --cached <FILE>
- A -> A+ : 修改文件
- A+ -> A : git checkout -- <FILE>
- A+ -> B : git add <FILE>
- B -> A+ : git reset HEAD <FILE>
- B -> C : git commit
- C -> B : git reset --soft HEAD^
- 修改最后一次提交:git commit --amend
对于日常开发中,代码版本管理是必不可少,如何管理各种状态,下面的几个点介绍下
1.首页了解下git所处的4种区 (工作区, 暂存取,本地仓库, 远程仓库)
- git add . (git add <file>) :加入到暂存区
- git commit -m "add: xxx" : 加入到本地仓库
- git push origin master : 加入到远程仓库
2. git的5种状态
- Origin(未修改)
- Modified(已修改)
- Staged(已暂存)
- Committed(已提交)
- Pushed(已推送)
3. git diff 对比修改
- 已修改,未暂存:git diff
- 已暂存,未提交: git diff --cached
- 已提交,未推送: git diff master origin/master
4. 撤销修改(观看上面的图)
- 已修改,未暂存:git checkout . (git checkout <file>)
- 已暂存,未提交: git reset (git reset --hard 会覆盖)
- 已提交,未推送: git reset --hard origin/master (远程仓库覆盖本地仓库)
- 已推送: git reset --hard <commitID> (如果要覆盖远程必须强制推 git push -f)
#怎么修改远程的commit message? :《修改Git message》
来源:秒懂Git的区和状态
转自:https://www.zhihu.com/question/20039839