繁体   English   中英

Git Pull 是不可能的,未合并的文件

[英]Git Pull is Not Possible, Unmerged Files

我已经阅读了所有关于此的类似问题; 似乎以下方法均无效:

Delete offending files
git reset --hard HEAD
git stash
git pull

几乎所有组合,存储更改和从存储库中提取,都会导致无法合并的文件。 我想放弃所有本地更改并只使用遥控器,但我无法再次克隆(开发人员尝试这样做的带宽和互联网使用限制)。 我该怎么做呢?

刚试过:

git stash
git pull

也没有工作。

更多信息

有一个本地提交,上游也有一个提交。 因此,我尝试了git pull --rebase但它仍然无法正常工作......这给了我错误 - “由于未解决的冲突而退出”。 如果我执行git stash, git reset --hard HEAD, git pull --rebase ,我会收到错误消息“pull is not possible, unmerged changes...”

假设遥控器是origin并且分支是master ,并且说您已经签出了master ,可以尝试以下操作:

git fetch origin
git reset --hard origin/master

这基本上只需要当前分支并将其指向远程分支的HEAD

警告 :如评论中所述, 这将丢弃您的本地更改覆盖原点上的任何内容

或者您可以使用管道命令执行基本相同的操作:

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

编辑:我想简要解释为什么这样做。

.git文件夹可以保存任意数量的存储库的提交。 由于提交哈希实际上是提交内容的验证方法,而不仅仅是随机生成的值,因此它用于匹配存储库之间的提交集。

分支只是指向给定哈希的命名指针。 这是一个示例集:

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

每个文件都包含一个指向提交的哈希:

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

这些都是内部git存储机制,独立于工作目录 通过执行以下操作:

git reset --hard origin/master

git会将当前分支指向origin / master指向的相同哈希值。 然后它强制更改工作目录以匹配该哈希处的文件结构/内容。

要在工作中看到这一点,请继续尝试以下内容:

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD

我很幸运

git checkout -f <branch>

在类似的情况下。

http://www.kernel.org/pub//software/scm/git/docs/git-checkout.html

在GIT中撤消删除

使用以下命令集解决:

git reset --hard
git pull --rebase
git rebase --skip
git pull

诀窍是重新定义更改...我们在重新设置一个简单的提交时遇到了一些麻烦,因此我们只是使用git rebase --skip(在复制文件之后)跳过它。

假设您要丢弃任何更改,请首先检查git status的输出。 对于旁边显示“未合并”的任何文件,请运行git add <unmerged file> 然后用git reset --hard跟进。 除了未跟踪的文件之外,这将消除任何本地更改。

我用git解决了本地删除未合并的文件。

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

当我之后发送git commit时:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

如果你碰巧在运行git fetch之后遇到这个问题然后git不允许你运行git pull因为合并冲突( 修改/未合并的文件 ,并且让你更加沮丧,它不会向你展示任何文件中的冲突标记,因为它尚未合并)。 如果您不想丢失工作,可以执行以下操作。

暂存文件。

$ git add filename

然后隐藏本地更改。

$ git stash

拉动并更新您的工作目录

$ git pull

恢复您的本地修改文件(如果可以,git将自动合并,否则解析它)

$ git stash pop

希望它会有所帮助。

即使您不想删除本地更改,也有一个解决方案。 只需修复未合并的文件(通过git addgit remove )。 然后做git pull

瑞安斯图尔特的回答几乎就在那里。 在你其实并不想删除你的本地修改的情况下,有你可以用它来合并工作流程:

  • 运行git status 它将为您提供未合并文件的列表。
  • 合并它们(手工等)
  • 运行git commit

Git只会将合并提交到新的提交中。 (就我而言,我在磁盘上添加了额外的文件,这些文件没有被集中到该提交中。)

然后Git认为合并成功并允许您继续前进。

尝试查找具有合并冲突的文件:

git diff --name-status --diff-filter=U 

解决文件冲突,而不是将此文件添加到提交(即使文件被删除)

git add path/to/file.name 

在此之后,如果没有合并冲突文件,请尝试提交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM