Git

解决Git error: Your local changes to the following files would be overwritten by merge

Posted by Geuni's Blog on April 28, 2022

当本地修改的代码与远程仓库的代码有冲突时pull代码会发生如下错误:

1
2
3
4
error: Your local changes to the following files would be overwritten by merge:
	README.md
Please commit your changes or stash them before you merge.
Aborting

当我们使用pull命令提取代码时,git将远程仓库的修改更新到本地仓库和工作区。当我们本地修改了一些文件,而远程仓库的这些文件也发生了变化,这时候我们想要拉取代码需要先保存这个修改。这是git的一个代码保护机制,主要是为了防止我们辛苦写的代码因执行一个命令而不翼而飞。

错误演示:

我远程仓库有个README.md文件,内容如下:

1
init

clone到本地后,我们直接修改了远程仓库的内容(等同于他人push),远程仓库现在的内容如下:

1
2
init
这是<远程>追加的内容

然后我们本地文件也追加一行,文件内容如下:

1
2
init
这是<本地>追加的内容

执行:

1
git pull origin main

会发生如下报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  test git:(main) git pull origin main
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), 1.28 KiB | 164.00 KiB/s, done.
From github.com:your_repo/test
 * branch            main       -> FETCH_HEAD
   8859462..0970015  main       -> origin/main
Updating 8859462..0970015
error: Your local changes to the following files would be overwritten by merge:
        README.md
Please commit your changes or stash them before you merge.
Aborting

解决方法:

错误信息中git已经给了我们解决方法,或提交或暂存相关文件。

第一种方法,使用commit

若代码是可提交状态,先提交 > 拉取远程代码 > 解决冲突 > 提交 & 推送。

1
2
git add README.md
git commit -m "update README.md"

再执行

1
git pull origin main

README.md内容变为:

1
2
3
4
5
6
7
8
<<<<<<< HEAD
init
这是<本地>追加的内容
=======
init  
这是<远程>追加的内容
>>>>>>> 0fa467e983cdfa2bb31450f2979570954ac9346a

剩下就是解决冲突,push到远程仓库即可。

1
2
3
git add README.md
git commit -m "Resolved conflict"
git push -u origin main

第二种方法,使用stash命令隐藏更改

stash命令的官方介绍:

当您想记录工作目录和索引的当前状态,但又想回到干净的工作目录时,请使用 git stash。

场景还是跟上面一样,远程仓库和本地都编辑了第二行内容。

1
2
init  
这是<本地>追加的内容

我们执行git stash命令后,可以发现本地追加的内容被隐藏掉了,执行git status能确认到我们工作树是干净的,再执行pull

1
git pull origin main

执行上面的命令后,远程代码已经被拉过来了。然后执行git stash pop命令,看文件内容如何变化:

1
2
3
4
5
<<<<<<< Updated upstream
这是<远程>追加的内容
=======
这是<本地>追加的内容
>>>>>>> Stashed changes

到这,解决冲突后,该做什么做什么就行。