如何强制执行 "git pull" 并覆盖本地文件?

9510

如何在执行 git pull 命令时强制覆盖本地文件?我的本地仓库中包含与服务器上相同文件名的文件。

错误:无法完成合并,未跟踪的工作树文件 'example.txt' 将被覆盖。


48
如果您正在阅读此内容并认为自己可能会丢失文件,我曾经遇到这种情况,并发现Sublime Text的缓冲区保存了我的工作 - 如果我在某个项目上工作时,意外删除了所有内容,尝试解决类似于这个问题或使用此问题的答案,并且已经在Sublime中打开这些文件(有很大的可能性),那么文件仍将存在于Sublime中,可能是在其中,也可能在撤销历史记录中。 - Toni Leigh
303
重置当前分支到与远程分支origin/branch_to_overwrite相同的状态,包括代码和提交记录。命令为:git reset --hard origin/branch_to_overwrite - Andrew Atkinson
5
基本上,在初始的checkout -b之后,只需从develop分支进行一次pull操作,然后进行你的工作,完成后再将更改push回去。 - ldgorman
5
简短回答:删除并重新创建分支。
  1. 删除分支: git branch <branch> -D
  2. 重置到冲突之前的提交: git reset <commit> --hard
  3. 重新创建分支: git branch <branch>
  4. 设置跟踪服务器: git --set-upstream-to=origin/<branch> <branch>
  5. 拉取:git pull
- Nino Filiu
6
将所有的CRLF行尾符改为LF(以干净的方式开始),请执行以下操作:git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout . - Chloe
显示剩余6条评论
53个回答

25

我遇到了同样的问题,但是即使执行git clean -f -d也无法解决。原因在于:如果你的文件被Git忽略(我猜测是通过.gitignore文件),Git仍然会在后续的pull操作中考虑覆盖这个文件,但是除非你添加-x参数,否则clean命令不会将其删除。


24

我认为导致冲突的可能有两个原因,必须分开解决。根据我所知,以上的回答都没有同时处理这两种原因:

  • 未跟踪的本地文件需要删除,可以手动删除(更安全),也可以按照其他答案建议使用 git clean -f -d 命令。

  • 不在远程分支上的本地提交也需要删除。我认为最简单的方法是使用命令:git reset --hard origin/master (将 'master' 替换为您正在工作的任何分支,并先运行 git fetch origin 命令)


23

更简单的方法是:

git checkout --theirs /path/to/file.extension
git pull origin master

这将会用git上的文件覆盖你本地的文件。


21

我遇到了一个奇怪的情况,无论是 git clean 还是 git reset 都不起作用。我必须使用以下脚本从每个未跟踪的文件中删除与冲突文件相关的 git index

git rm [file]

然后我就能够很好地拉取(代码)。


谢谢!我发现如果您对存储库中的文件进行了任何特殊调整以忽略更改,则需要这个命令。例如:git update-index --assume-unchanged <file> - skupjoe

21

我知道一种更简单、更不痛苦的方法:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

就是这样了!


我尝试按照这个答案的建议去做。从远程仓库中根本没有拉取任何文件。实际上,如果你想一想,这并不奇怪 - 毕竟根本没有提及到 origin/<branch_to_force_pull> - Henke
嗯,看起来这就是我需要尝试的东西。我的工作副本中有50多个文件和未跟踪的文件以及我的个人调试代码。所以每当我在一些文件上遇到合并冲突时,使用其他方法(如重置、隐藏等)都不太方便,在这个线程中提到的方法也同样如此。 - Keith Knauber

20

我刚刚通过以下方式解决了这个问题:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

"last" 命令会列出你的本地修改记录。继续修改 "tmp" 分支,直到满意后,使用以下命令将其合并回主分支:

git checkout master && git merge tmp

下次,你可以通过查找“git stash branch”来更加清晰地处理这个问题。不过,在前几次尝试中,stash 可能会给你带来麻烦,所以首先在一个非关键项目上进行实验。


18

做就对了

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

所以,您可以避免所有不需要的副作用,比如删除您想要保留的文件或目录等。


不错。首先使用 checkout -f 切换到我想要合并的分支,这样就可以摆脱所有有问题的未跟踪文件。然后我可以再次切换到我的目标分支,最后顺利地进行合并。 - Patrick Parker

17

需求:

  1. 跟踪本地更改,确保没有人会遗失它们。
  2. 使本地仓库与远程原始仓库匹配。

解决方案:

  1. Stash the local changes.
  2. Fetch with a clean of files and directories ignoring .gitignore and hard reset to origin.

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    

16

尽管最初的问题不同,但是顶级答案可能会给有类似问题的人带来麻烦,因为他们不想丢失本地文件。例如,请参阅Al-Punk和crizCraig的评论。

以下版本将您的本地更改提交到一个临时分支(tmp),检出原始分支(我假设是master)并合并更新。您可以使用stash来完成此操作,但我发现使用分支/合并方法通常更容易。

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch origin master
git merge -s recursive -X theirs origin master

我们假设另一个代码库origin master


16

将索引和 HEAD 重置为 origin/master,但不要重置工作树:

git reset origin/master

我个人认为这非常有用。它可以保留您的工作树,以便您可以再次检查它。对于我的问题,我删除了相同的文件,因此它被卡住了。很奇怪,我知道。 - King Friday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接