跳至主要內容

各阶段代码修改回退撤销操作

张威大约 4 分钟gitgit

各阶段代码修改回退撤销操作

一、还没有add/commit,放弃工作区的修改

ubuntu客户端查看工作区状态,没有需要提交的文件

修改main.cpp

git status查看工作区状态,

在git add之前我们发现有错误,想要放弃刚刚做的修改,回到修改前的状态

我们可以使用如下命令:

#git checkout -- 文件名
git checkout -- main.cpp

由于还没有add以及commit,本地仓库的main.cpp仍然是修改前的main.cpp,只有工作区的main.cpp被改动了。这条命令的意思是,

二、已经add,还未commit,放弃暂存区的修改

修改main.cpp并add到暂存区

image-20240503035944714
image-20240503035944714

已经提交到暂存区,我们现在需要放弃暂存区的修改,

git reset HEAD
git checkout -- 文件名

三、add/commit都已完成,放弃本地仓库的修改

git log #查看提交日志,找commit id
git reset --hard commitId

将错误代码从工作区add到暂存区,然后commit到本地仓库

git log查看提交日志

可以看到本地仓库的提交已经领先于远程仓库

  • 其实没有删除我们刚才的提交,这仅仅只是修改的HEAD指针的指向,并且将工作区、暂存区的状态一并统一到了commit id为cf9c的状态。我们依然可以通过git reset --hard 提交的ID的方式改变HEAD指针的指向,恢复到任意的commit状态

四、add/commit/push都已完成,放弃远程仓库的修改

我们先修改本地分支的HEAD指针到未修改的状态

我们希望用本地落后的分支覆盖远程领先的分支,push试试❌❌❌

  • 我们发现

这时我们可以-f强制推送到远程分支,用落后的分支覆盖远程的分支。注意,

小结

  • git checkout -- 文件名 在git add之前,把工作区的代码用版本库中的代码覆盖掉,
  • git reset HEAD 把git add之后,暂存区的内容全部撤销
  • git reset --hard commitid 把提交到本地仓库中的代码改动进行回退
  • git push -f 强制推送本地仓库代码到远程仓库
  • git reflog 主要用于查看本地仓库的HEAD和分支的变化历史,即分支的创建、合并、删除等操作。
  • git log:关注的是提交对象,即每次的代码变更。
  • git diff HEAD -- fileName 查看工作区file文件仓库中该文件最新版本的代码有什么区别