在拉动期间Git无法取消链接文件 - 如何摆脱存储库的不一致状态?

时间:2016-01-25 14:49:36

标签: git

在执行“git pull”时,git中止了操作,因为它无法取消链接要覆盖的文件,因为我忘了关闭锁定这些文件的应用程序。

当我关闭应用程序并尝试重新执行“git pull”并收到以下错误消息时:

"Error: Your local changes to the following files would be overwritten by merge: ..."

"Error: The following untracked working tree files would be overwritten by merge: ..."

很明显,git只是在不进行回滚的情况下中止了拉动,现在认为刚刚拉出的变化是我当地的变化。

我如何摆脱这种状态?我们正在讨论很多文件,在进行“git revert”之前,如果我方有一些本地更改,我将不得不手动检查每个文件。

注意:我们在类似客户端 - 服务器的设置中使用git,其中分布式开发人员经常“拉”并“推送和提交”到中央bitbucket存储库。

3 个答案:

答案 0 :(得分:3)

由于上述方法都不适合我,我使用的程序不是完全自动的,但减少了一些手动选择文件的工作量(在我的情况下是2而不是50)。

首先使用

隐藏所有文件(包括未跟踪和忽略)
git stash save --all             

然后使用

重做之前失败的拉力
git pull                         

现在从藏匿处结帐以简单地覆盖在第一次拉动期间更改的所有文件(不合并尝试):

git checkout stash -- .         

现在还有一个问题:现在覆盖了在失败的拉动和第二次拉动之间在服务器上进行的更改。但那些应该只是几个文件(如果两者之间的时间很短),并且在您自己制作的工作变更列表中更容易识别。只需"还原"在做最后的提交之前,他们(我使用了Tortoise GIT提交对话框)。

git commit
git stash drop

答案 1 :(得分:2)

git reset --hard

会将所有跟踪的文件重置为其已提交状态。

git clean -df

将清除所有剩余未跟踪,未经签名的文件。

然后你可以重做拉力。普通合并会做到这一点,你已经完成了获取。

我很确定这种行为是由于Windows希望文件的工作方式不同所致。在Unix-land中,一旦打开文件,就会释放目录条目。您所看到的错误根本不会发生在Unix系统上;只要对某个进程保持开放,打开的文件就会成为临时文件。 Unix的方式也有缺点,你看到了Windows方式的缺点。解决方法很容易,重置和清洁几乎是您的施工现场清理工作人员。这是光荣的工作,了解他们,他们知道他们的东西。

答案 2 :(得分:0)

尝试

git reset --merge
git fetch --all
git reset --hard origin/master

或者如果你在其他分支上

git reset --hard origin/your_branch

说明:

git fetch从远程下载最新内容,而不尝试合并或重新绑定任何内容。

然后git reset将主分支重置为您刚刚获取的内容。 --hard选项更改工作树中的所有文件以匹配origin / master

中的文件

值得注意的是,可以通过在重置前从master创建分支来维护当前的本地提交:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master