[英]Why does git say "Pull is not possible because you have unmerged files"?
当我尝试在终端中拉入我的项目目录时,我看到以下错误:
harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master
U app/config/app.php
U app/config/database.php
U app/routes.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.
为什么 git 会说"Pull is not possible because you have unmerged files"
,我该如何解决?
当前发生的情况是,您有一组文件,您之前尝试过合并这些文件,但它们引发了合并冲突。 理想情况下,如果遇到合并冲突,他们应该手动解决它们,并使用git add file.name && git commit -m "removed merge conflicts"
提交更改。 现在,另一个用户已经更新了他们存储库中的相关文件,并将他们的更改推送到了公共上游存储库。
碰巧的是,您(可能)最后一次提交的合并冲突没有解决,因此您的文件没有正确合并,因此文件的U
(未unmerged
)标志。 所以现在,当你执行git pull
时,git 会抛出错误,因为你有一些版本的文件,它没有被正确解析。
要解决此问题,您必须先解决有问题的合并冲突,然后添加并提交更改,然后才能执行git pull
。
# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test
首先,让我们创建存储库结构
test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone
现在我们在 repo_clone 中,如果你执行git pull
,它会引发冲突
repo_clone $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
* branch master -> FETCH_HEAD
24d5b2e..1a1aa70 master -> origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.
如果我们忽略克隆中的冲突,现在在原始仓库中进行更多提交,
repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone
然后我们做一个git pull
,我们得到
repo_clone $ git pull
U file
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.
请注意,该file
现在处于未合并状态,如果我们执行git status
,我们可以清楚地看到相同的情况:
repo_clone $ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
(use "git pull" to merge the remote branch into yours)
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: file
所以,要解决这个问题,我们首先需要解决我们之前忽略的合并冲突
repo_clone $ vi file
并将其内容设置为
text2
text1
text1
然后添加它并提交更改
repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts
如果您不想合并更改并且仍想更新本地,请运行:
git reset --hard HEAD
这将使用 HEAD 重置您的本地,然后使用 git pull 拉动您的远程。
如果您已经在本地提交了合并(但还没有推送到远程),并且还想恢复它:
git reset --hard HEAD~1
当您的工作目录不干净时,您正尝试向本地分支添加一个新的提交。 结果,Git 拒绝执行拉取操作。 考虑下图以更好地可视化场景:
远程:A <- B <- C <- D
本地:A <- B*
(*表示您有多个文件已修改但未提交。)
处理这种情况有两种选择。 您可以放弃文件中的更改,也可以保留它们。
选项一:丢弃更改
您可以对每个未合并的文件使用git checkout
,也可以使用git reset --hard HEAD
将分支中的所有文件重置为 HEAD。 顺便说一句,您当地分支机构的 HEAD 是 B,没有星号。 如果选择此选项,图表将变为:
远程:A <- B <- C <- D
本地:A <- B
现在,当您拉动时,您可以使用 master 的更改快进您的分支。 拉动后,您的分支看起来像 master:
本地:A <- B <- C <- D
选项二:保留更改
如果要保留更改,首先要解决每个文件中的任何合并冲突。 您可以在 IDE 中打开每个文件并查找以下符号:
<<<<<<< 头
// 你的代码版本
=======
// 遥控器的代码版本
>>>>>>>
Git 向您展示了两个版本的代码。 HEAD 标记中包含的代码是您当前本地分支的版本。 另一个版本是来自遥控器的。 一旦您选择了代码的一个版本(并删除了其他代码以及标记),您可以通过键入git add
将每个文件添加到暂存区域。 最后一步是通过键入带有适当消息的git commit -m
来提交您的结果。 此时,我们的图表如下所示:
远程:A <- B <- C <- D
本地:A <- B <- C'
在这里,我将我们刚刚进行的提交标记为 C',因为它与远程上的提交 C 不同。 现在,如果您尝试拉动,您将得到一个非快进错误。 Git 无法在您的分支上播放远程中的更改,因为您的分支和远程都偏离了共同的祖先提交 B。此时,如果您想拉,您可以执行另一个git merge
或git rebase
您的分支遥控器。
掌握 Git 需要能够理解和操作单向链表。 我希望这个解释能让你在正确的方向上思考如何使用 Git。
有一个简单的解决方案。 但为此,您首先需要学习以下内容
vimdiff
要删除冲突,您可以使用
git mergetool
上述命令基本上为每个冲突文件打开本地文件、混合文件、远程文件(共 3 个文件)。 本地和远程文件仅供您参考,使用它们您可以选择在混合文件中包含(或不包含)什么。 只需保存并退出文件。
如果您想拉下远程分支以在本地运行(例如出于审查或测试目的),并且当您使用$ git pull
时,您会遇到本地合并冲突:
$ git checkout REMOTE-BRANCH
$ git pull (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)
如果您不想要任何本地分支更改,我认为这是最好的方法
git clean -df
git reset --hard
git checkout REMOTE_BRANCH_NAME
git pull origin REMOTE_BRANCH_NAME
您在本地有一些文件需要合并才能拉取。 您可以签出文件,然后拉取以覆盖您的本地文件。
git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master
我也有同样的问题
就我而言,步骤如下 -
U project/app/pages/file1/file.ts
U project/www/assets/file1/file-name.html
$ git pull origin master
$ git status
这是它出现的信息——
并分别有 2 个和 1 个不同的提交。
(use "git pull" to merge the remote branch into yours)
您有未合并的路径。
(fix conflicts and run "git commit")
未合并路径:
(使用“git add ...”来标记分辨率)
both modified: project/app/pages/file1/file.ts
both modified: project/www/assets/file1/file-name.html
$ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
$ git commit -am "resolved conflict of the app."
$ git push origin master
要遵循的步骤:
step-1 : git reset --hard HEAD (if you want to reset it to head)
step-2 : git checkout Master
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull)
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)
谢谢,萨巴什
当发生合并冲突时,您可以打开单个文件。 您将获得“<<<<<<< 或 >>>>>>>”符号。 这些是指您的更改以及远程上存在的更改。 您可以手动编辑所需的部分。 之后保存文件,然后执行: git add
合并冲突将得到解决。
只需运行以下命令:
git reset --hard
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.