Git的后悔药了解一下

场景1:修改了工作空间的某个文件, 但是觉得这样修改不合适想还原?

首先我们对a.txt进行随意修改, 如

change1

我们使用 git status 对其进行查看

位于分支 master
您的分支与上游分支 'origin/master' 一致。

尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     a.txt

从git的提示来看此时我们有两种方案:

  1. 将文件提交到缓存区
 git add <文件>...
  1. 将文件还原
git checkout -- <文件>...

这里的第二点就是我们将要使用的命令, 他其实真是的命令是 git checkout <分支名称> – <文件名称> , 就是将仓库最新的文件代码覆盖本地的文件代码. 话不多说我们试试吧~

git checkout -- a.txt

在使用 git status 查看一下

位于分支 master
您的分支与上游分支 'origin/master' 一致。

无文件要提交,干净的工作区
  • 这里我们扩展一下对多个文件的操作
git checkout -f/--force #这里-f就是--force, 意思是强制将工作区间所有文件恢复到与仓库最新的版本一致
git checkout -- * #这里使用*也是匹配所有文件, 当然也可以使用类似于 *.txt等通配符进行匹配
git checkout -- <文件1> <文件2> #意思是恢复对应的多个文件
git reset --hard HEAD #这里是忽略工作区间和缓存区间的所有文件直接将指针指向仓库的最新版本

场景2: 将文件已经通过git add缓存到了缓存区, 如何将文件回退回来

首先我们对a.txt进行随意修改并且使用 git add 将文件添加到缓存区域在使用 git status

位于分支 master
您的分支与上游分支 'origin/master' 一致。

要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

	修改:     a.txt

大家可以看到 使用 “git reset HEAD <文件>…” 以取消暂存 这句话.

git reset HEAD a.txt

我们调用之后用git status查看一下

位于分支 master
您的分支与上游分支 'origin/master' 一致。

尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     a.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

可以看到文件恢复到工作空间并且是修改之后的版本, 我们就可以在修改的基础上继续工作了.
此时有人会问这个HEAD是什么意思呢? 我们用代码跟大家解释一下:
首先我们将此时a.txt文件的修改commit掉.

git commit --all -m "change1"

然后我们在对a.txt进行修改,我的修改内容(在change1的基础上添加change2)如下:

change1
change2

然后我们用 git add --all 将文件提交到缓存区, 这个时候我们采用

git reset HEAD~1 a.txt

HEAD~1的意思是仓库的上一个版本, 接下来我们用 git status 查看一下

要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

	修改:     a.txt

尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     a.txt

可以看到工作区间有一个, 缓存区间也有一个, 聪明的大家应该理解了, 此时文件a.txt恢复到了仓库的倒数第二个版本, 可以重新进行提交了. 那么HEAD 的意思大家就明白了. 指的就是仓库最新的一个版本.

  • 此时我们扩展一下对于多个文件的操作
git reset HEAD <文件1> <文件2> #将多个文件从缓存区恢复到工作空间
git reset --mixed HEAD #将全部文件从缓存区恢复到工作空间
git reset --hard HEAD #将当前工作空间和缓存区域清空

这里的 --mixed --hard 的详细区别我们后面会有详细的介绍;看官们可以继续往下看.

场景3: 针对已经提交git commit到本地仓库更新了版本库的, 如何将文件回退回来

  1. 针对回退到指定版本的

首先我们采用 git log --pretty=oneline 查看我们的git 日志

f25826fb439029c6913470ad9bfdb4b0691c8152 (HEAD -> master, origin/master, origin/HEAD) change1
e8c894f6f023f568ea79543a82cd1ac9e840251a initial a.txt

可以看到我有两条记录, 现在我不想要change1这条记录, 在这个场景下(针对回退到指定版本的)我们达到的目的就是回退到 initial a.txt这个版本.
首先我们copyinitial a.txt这个版本的commitId(也可以只copy前6位, 根据前6位git也可以确定某个版本), 这里我copy e8c894, 执行如下命令

git reset --mixed e8c894
git reset --hard e8c894
git reset --soft e8c894
也可以简化
git reset e8c894 #默认参数就是 --mixed

大家想要了解三个的区别, 不妨跟着我敲一遍就知道了.

git reset --mixed e8c894

使用git status查看一下

尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     a.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

可以看到这里将change1 这个版本的a.txt的修改还原到了本地工作空间
此时我们还原到change1 版本(利用 git reflog找到对应的commitId)

git reset --hard f25826f

还原到最新的版本之后执行git reset --hard e8c894且直接执行git status查看

位于分支 master
您的分支落后 'origin/master' 共 1 个提交,并且可以快进。
  (使用 "git pull" 来更新您的本地分支)

无文件要提交,干净的工作区

在这里我们可以看到无文件要提交,干净的工作区这几个字眼, 意思是说我们现在工作空间和缓存区间都是干净的, 在这里大家注意, 恢复到这个版本之后, 对于以前版本之后的修改都会丢失(假性丢失,我们还是可以通过git reset回退到相应的最新的版本即可).
此时我们在回退到最新的版本然后执行git reset --soft e8c894这个命令,采用 git status 查看一下

位于分支 master
您的分支落后 'origin/master' 共 1 个提交,并且可以快进。
  (使用 "git pull" 来更新您的本地分支)

要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

	修改:     a.txt

我们可以看到change1这个版本针对a.txt修改的文件直接进入了缓存区, 我们可以直接再次提交(*git commit --all -m “change1” *)即可, 一般这种情况用于想要重复提交某个版本的时候用.
这里做一个总结

--hard 将版本之后的文件直接丢弃
--mixed 将版本之后的文件放到本地工作空间
--soft 将版本之后的文件放到缓存区
  1. 将某个版本的代码回退回来
    意思是将某一个版本的代码回退回来, 和上一个回退到某一个版本是完全不一样的.
    比如说:
    我们还是将代码还原到最新的版本, 利用git log --pretty=oneline查看一下
* a8ef4f2 - (HEAD -> master) change1 (3 秒钟前) <pyi>
* e8c894f - initial a.txt (4 小时前) <pyi>

现在我们想将** e8c894f - initial a.txt**这个版本回退回来

git revert e8c894f
error: 不能还原 e8c894f... initial a.txt
提示:冲突解决完毕后,用 'git add <路径>''git rm <路径>'
提示:对修正后的文件做标记,然后用 'git commit' 提交

这里git直接报错, 意思是有冲突需要我们解决. 为什么会有冲突呢? 是因为我们change1 版本对a.txt文件进行了处理并提交了. 现在我们回退initial版本, 那么就会与change1版本有冲突.
这个时候我们利用git status查看一下

您在执行反转提交 e8c894f 的操作。
  (解决冲突并运行 "git revert --continue")
  (使用 "git revert --abort" 以取消反转提交操作)

未合并的路径:
  (使用 "git reset HEAD <文件>..." 以取消暂存)
  (使用 "git add <文件>..." 标记解决方案)

	双方修改:   a.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

首先我们看到文件a.txt是出现在本地的工作空间的而不是缓存区,这点需要注意一下. 然后我们看一下a.txt中内容是什么.

cat a.txt
change1
<<<<<<< HEAD
=======
change2
change3
change4
change5
change6
>>>>>>> parent of e8c894f... initial a.txt

这里change23456这些是哪来的? 是因为我** initial a.txt**这个版本之前a.txt的内容是

change2
change3
change4
change5
change6

从中可以看出, ** initial a.txt这个版本从仓库中抽离出来了, 直接从 initial a.txt**前一个版本到了最新的版本. 这里我们说一下冲突文件a.txt

cat a.txt
#这里的代码是抽离版本之后的代码
<<<<<<< HEAD
=======
#这里的代码是抽离版本的以前的代码
>>>>>>> parent of e8c894f... initial a.txt

我们把冲突解决完(保留自己想要的代码)之后将文件提交即可;

git add --all
git commit --all -m "revert initial a.txt"

最后的最后我再啰嗦一句: 大家有没有思考过这样一个问题, 我们本地的仓库被我们回退到某一个版本, 那么我们远程仓库怎么办? 这里我介绍一个命令给大家:

git push origin master --force/-f #强制更新远程仓库的代码, 将本地的代码强行推到远程服务器上.

好了,结束了, 感谢大家能看到最后, 希望大家能学到东西, Git后悔药你了解了吗?

猜你喜欢

转载自blog.csdn.net/qq844579582/article/details/85759535