今天遇到了一个git pull 更新代码的错误,提示我更新失败,把本地更改的代码保存或者上传之后再更新。于是我就在网上搜了一下找到了两种解决办法,在这了总结一下
error: Your local changes to the following files would be overwritten by merge:复制代码
解决方法1: 如果你想保留刚才本地修改的代码,并把git服务器上的代码pull到本地(本地刚才修改的代码将会被暂时封存起来)
git stashgit pull origin mastergit stash pop复制代码
git stash 命令可以将在当前分支修改的内容放到缓存区中,并会自动建立一个缓存的list集合,方便管理。
如果想将修改的内容重新释放出来,git stash apply 和 git stash pop 都可以达到这个目的。
但是两者有什么区别呢。
刚才说过,git stash 可以形成list 集合。通过git stash list 可以看到list下的suoy
使用git stash apply @{x} ,可以将编号x的缓存释放出来,但是该缓存还存在于list中
而 git stash apply,会将当前分支的最后一次缓存的内容释放出来,但是刚才的记录还存在list中
而 git stash pop,也会将当前分支的最后一次缓存的内容释放出来,但是刚才的记录不存在list中
如此一来,服务器上的代码更新到了本地,而且你本地修改的代码也没有被覆盖,之后使用add,commit,push 命令即可更新本地代码到服务器了。
解决方法2: 如果你想完全地覆盖本地的代码,只保留服务器端代码,则直接回退到上一个版本,再进行pull
git reset --hardgit pull origin master复制代码
- 假设有2个提交记录
commit def5adef853da4cc05752bdb36577c127be71ba5Author: 132982jianan <1072772483@qq.com>Date: Thu Dec 28 16:01:36 2017 +0800 add data to 1.txtcommit f36801544670e00b2f59a28e19017d2786c4085eAuthor: 132982jianan <1072772483@qq.com>Date: Thu Dec 28 15:59:46 2017 +0800复制代码
init 1.txt复制代码
(END)
-
现在回到最开始的那一个提交 git reset --hard f36801544670e00b2f59a28e19017d2786c4085e
-
查看日志,就会发现只剩下一个提交了
git logcommit f36801544670e00b2f59a28e19017d2786c4085eAuthor: 132982jianan <1072772483@qq.com>Date: Thu Dec 28 15:59:46 2017 +0800init 1.txt复制代码
(END)
- 这个时候,发现回退版本错了,那么就用git reflog查看提交记录
git reflogf368015 HEAD@{0}: reset: moving to f36801544670e00b2f59a28e19017d2786c4085edef5ade HEAD@{1}: reset: moving to def5adef368015 HEAD@{2}: reset: moving to f36801544670e00b2f59a28e19017d2786c4085edef5ade HEAD@{3}: commit: add data to 1.txtf368015 HEAD@{4}: commit (initial): init 1.txt复制代码
-
找出想要回退的版本,进行回退
恢复 git reset --hard def5ade
-
git reset --hard 和 git reset --sort区别
git reset –-soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可;git reset -–hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉;复制代码