当本地修改的代码与远程仓库的代码有冲突时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
到这,解决冲突后,该做什么做什么就行。