Git入门指南(二):基本操作 续上文Git入门指南一从零开始掌握Git基础操作-CSDN博客一、修改文件查看状态Git比其他版本控制系统设计得优秀因为Git 跟踪并管理的是修改 而不是文件。什么是修改 比如你新增了一行这个就是一个修改 删除了一行也是一个修改 更改了某些字符 也是一个修改 删了一些又加了一些 也是一个修改 甚至创建一个新文件 也算是一个修改 。使用git status看看工作区和暂存区的状态上面的结果告诉我们 ReadMe被修改过了 但是还没有完成添加和提交。目前我们只知道文件被修改了如果能知道具体的某些地方被修改了就好了~所以,可以使用git diff [file]命令用来显示暂存区和工作区文件差异 。 显示的格式正式Unix通用的diff 格式 。 也可以使用过git diff HEAD -- [fiile]命令查看版本库和工作区文件区别。二、版本回退2.1 git resetGit最大的优点之一就是能随时回到历史版本。比如你写了几天的代码发现最近的一次改动导致了严重bug想回到几天前的稳定状态。这个时候 就需要版本回退的功能了 。执行git reset命令用于回退版本 可以指定退回某一次提交的版本 。回退本质是要将版本库中的内容进行退回 工作区或暂存区是否回退由命令参数决定# 基本格式 git reset [--soft | --mixed | --hard] [HEAD/Commit ID]--mixed默认参数可省略将暂存区的内容回退为指定版本工作区文件保持不变--soft工作区和暂存区的内容均不改变仅将版本库回退到指定版本--hard工作区、暂存区、版本库均回退到指定版本注意工作区有未提交的代码时禁止使用该参数否则未提交的代码会被彻底删除无法恢复HEAD的表示法在git reset中可以用HEAD来指代版本HEAD当前版本HEAD^上一个版本HEAD^^上上个版本或HEAD~2例如git reset --hard HEAD^回退到上一个版本步骤 1查看历史版本确定回退目标git log --prettyoneline # 输出 # d95c13f (HEAD - master) add version3 # 14c12c3 add version2 # cff9d1e add version1 # 94da695 add modify ReadMe file假设发现 version3 有问题需要回退到 version2且希望工作区内容也同步回退使用--hard参数。步骤 2执行版本回退# 方式1用commit id回退推荐精准 git reset --hard 14c12c3 # 方式2用HEAD简写回退 git reset --hard HEAD^ # 回退成功输出HEAD is now at 14c12c3 add version2步骤 3验证回退结果# 查看ReadMe文件内容已回退到version2 cat ReadMe # 输出 # hello bit # hello git # hello world # hello version1 # hello version2 # 查看历史版本HEAD已指向version2 git log --prettyoneline # 输出 # 14c12c3 (HEAD - master) add version2 # cff9d1e add version1 # 94da695 add modify ReadMe file2.2 git reflog执行git reset回退后git log中会看不到后续的新版本如上面的 version3如果后悔了想恢复到最新版本可用git reflog命令它会记录本地的每一次 Git 命令操作包括所有的 commit id。# 查看所有Git操作记录 git reflog # 输出 # 14c12c3 (HEAD - master) HEAD{0}: reset: moving to 14c12c3 # d95c13f HEAD{1}: commit: add version3 # 14c12c3 HEAD{2}: commit: add version2 # cff9d1e HEAD{3}: commit: add version1从记录中找到 version3 的 commit idd95c13f再次执行git reset即可恢复git reset --hard d95c13f # 恢复成功输出HEAD is now at d95c13f add version32.3 版本回退的底层逻辑Git 的版本回退速度极快因为其底层只是移动 HEAD 指针和 master 分支的指向版本库中保存了所有历史版本的内容回退只是让 HEAD 和 master 从最新版本指向指定的历史版本并未删除任何版本内容这也是 Git 能轻松恢复新版本的原因。三、撤销修改撤销修改是日常开发中非常常用的功能。我们分三种情况讲解。3.1 情况一只改了工作区还没有add比如我们在ReadMe中加了一行垃圾代码还没add$ cat ReadMe hello bit hello git hello world hello version1 hello version2 hello version3 This piece of code is like shit这时候我们想扔掉这行修改让文件回到最近一次add或commit的状态。可以用git restore$ git restore ReadMe 或者老版本用git checkout -- ReadMe。查看文件垃圾代码没了。3.2 情况二已经add但还没commit如果已经git add了垃圾代码进了暂存区这时想撤销怎么办先用git restore --staged把文件从暂存区移回工作区$ git restore --staged ReadMe再用git restore恢复工作区$ git restore ReadMe或者还可以使用之前学过的git reset 命令 该命令如果使用 --mixed 参数 可以将暂存区的内容退回指定的版本内容但工作区文件保持不变 。3.3 情况三已经commit了此时修改已经被提交到版本库无法用git checkout撤销需要使用版本回退功能将版本库回退到上一个稳定版本# 回退到上一个版本--hard参数工作区、暂存区、版本库同步回退 git reset --hard HEAD^关键注意该方法仅适用于修改未推送到远程仓库的情况如果已经将修改推送到远程仓库切勿随意回退否则会导致本地与远程仓库版本不一致。四、删除文件如果直接用系统命令删除工作区文件Git 会立刻通过git status检测到提示文件被删除deleted此时工作区与版本库不一致若不处理后续的版本管理会出现混乱所有文件删除操作都必须配合 Git 命令完成。4.1 误删文件怎么恢复你可能会不小心用rm删了一个文件但还没add或commit。比如$ rm file5 $ git status On branch master Changes not staged for commit: (use git add/rm file... to update what will be committed) (use git restore file... to discard changes in working directory) deleted: file5 no changes added to commit用git restore就能恢复$ git restore file5 $ ls file5 # 又回来了4.2 确定要删除文件如果确定要彻底删除文件包括版本库中的记录可以这样做$ git rm file5 $ git commit -m deleted file54.3 已经add了删除想反悔如果已经git rm或git add了删除操作但还没commit想恢复$ git restore --staged file5 # 取消暂存 $ git restore file5 # 恢复工作区4.4 已经commit了删除想找回如果已经提交了删除想找回文件可以回退到删除前的版本$ git log --oneline # 找到删除前的commit id $ git reset --hard commit-id五、总结