为什么混帐说“拉不可能,因为你有没有文件”?
当我尝试拉入我的项目目录在terminal中,我看到以下错误:
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
首先,让我们创build存储库结构
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拒绝做这个拉动。 考虑下面的图表来更好地观察场景:
远程:A < – B < – C < – D
本地:A < – B *
(*表示您有几个已被修改但未提交的文件。)
处理这种情况有两种select。 您可以放弃文件中的更改,或保留它们。
选项一:扔掉变化
您可以使用git checkout
每个未合并的文件,也可以使用git reset --hard HEAD
将分支中的所有文件重置为HEAD。 顺便说一下,你当地分公司的HEAD是B,没有星号。 如果您select此选项,图表变成:
远程:A < – B < – C < – D
本地:A < – B
现在,当你拉动,你可以快速转发你的分支与主从变化。 拉动之后,你的分支就会像主人一样:
本地:A < – B < – C < – D
选项二:保留更改
如果要保留更改,首先要解决每个文件中的任何合并冲突。 您可以在IDE中打开每个文件并查找以下符号:
<<<<<<< HEAD
//你的代码版本
=======
//远程的代码版本
>>>>>>>
Git向你展示了两个版本的代码。 HEAD标记中包含的代码是当前本地分支的版本。 另一个版本是来自远程的。 一旦你select了一个版本的代码(并删除了其他代码以及标记),你可以通过inputgit add
将每个文件添加到你的临时区域。 最后一步是通过input适当的消息来inputgit commit -m
来提交结果。 在这一点上,我们的图是这样的:
远程:A < – B < – C < – D
本地:A < – B < – C'
在这里,我把我们刚刚提交的提交标记为C',因为它与远程提交C不同。 现在,如果你试图拉你会得到一个非快速的前进错误。 Git不能在你的分支上进行远程的修改,因为你的分支和远程分支已经从共同的祖先commit B中分离出来了。在这一点上,如果你想拉你可以做另一个git merge
,或者git rebase
你的分支遥控器。
掌握Git需要能够理解和操纵单向链表。 我希望这个解释能让你用正确的方向思考使用Git。
git fetch origin git reset --hard origin/master git pull
上面提到的命令说明:
- Fetch将从另一个存储库下载所有内容,在这种情况下,标记为“origin”的那个。
- 重置将放弃更改并恢复到存储库“origin”中提到的分支“master”。
- 拉将只是从远程存储库中获取所有内容并进行集成。
有关git
文档的更多信息,请访问http://git-scm.com/docs 。
这是一个简单的解决scheme。 但为此,您首先需要了解以下内容
vimdiff
为了消除疑惑,你可以使用
git mergetool
上面的命令基本上打开本地文件,混合文件,远程文件(共3个文件),为每个冲突的文件。 本地和远程文件仅供您参考,使用它们您可以select要在混合文件中包含(或不包含)的内容。 只要保存并退出文件。
你有一些本地的文件需要合并,然后才能拉。 你可以签出文件,然后拉来覆盖你的本地文件。
git checkout app/config/app.php app/config/database.php app/routes.php git pull origin master
如果你想拉下一个远程分支在本地运行(比如说用于审查或testing的目的),当你$ 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 reset HEAD —hard
这将重置您的本地与头,然后拉你的遥控器使用git拉!
发生合并冲突时,可以打开单个文件。 你会得到“<<<<<<<或>>>>>>>”符号。 这些指的是您的更改和远程的更改。 您可以手动编辑需要的部分。 之后,保存该文件,然后执行:git add
合并冲突将得到解决。
我也有同样的问题
就我而言,步骤如下 –
- 删除了所有以U (未合并)符号开头的文件。 如-
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)
你有没有合并的path。
(fix conflicts and run "git commit")
没有道路的path:
(使用“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
哪一回合可能会问题解决与此图像 –