如何强制覆盖本地文件 git pull
?
场景如下:
- 团队成员正在修改我们正在处理的网站的模板
- 他们正在向images目录添加一些图像(但忘记在源代码管理下添加它们)
- 他们稍后通过邮件发送图像给我
- 我在源控件下添加图像并将其与其他更改一起推送到GitHub
- 他们无法从GitHub中提取更新,因为Git不想覆盖他们的文件。
这是我得到的错误:
error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge
如何强制Git覆盖它们?这个人是设计师 - 通常我会手动解决所有冲突,因此服务器具有他们只需要在他们的计算机上更新的最新版本。
重要提示:如果您有任何本地更改,它们将丢失。有还是没有 --hard
选项,任何未被推送的本地提交都将丢失。[*]
如果您有任何文件 不 通过Git跟踪(例如上传的用户内容),这些文件不会受到影响。
我认为这是正确的方法:
git fetch --all
然后,您有两个选择:
git reset --hard origin/master
或者如果你在其他分支上:
git reset --hard origin/<branch_name>
说明:
git fetch
从远程下载最新版本而不尝试合并或重组任何内容。
然后 git reset
将master分支重置为刚刚获取的内容。该 --hard
选项更改工作树中的所有文件以匹配其中的文件 origin/master
维护当前的本地提交
[*]:值得注意的是,可以通过创建分支来维护当前的本地提交 master
在重置之前:
git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master
在此之后,所有旧提交都将保留 new-branch-to-save-current-commits
。
未提交的更改
然而,未提交的更改(即使是暂存的)也将丢失。确保存储并提交您需要的任何内容。为此,您可以运行以下内容:
git stash
然后重新应用这些未提交的更改:
git stash pop
尝试这个:
git reset --hard HEAD
git pull
它应该做你想要的。
警告: git clean
删除所有未跟踪的文件/目录,无法撤消。
有时只是 clean -f
没有帮助。如果您有未跟踪的DIRECTORIES,还需要-d选项:
git reset --hard HEAD
git clean -f -d
git pull
警告: git clean
删除所有未跟踪的文件/目录,无法撤消。
像Hedgehog一样,我认为答案很糟糕。但是虽然刺猬的答案可能会更好,但我认为它并不像它那样优雅。我发现这样做的方法是使用“fetch”和“merge”与定义的策略。这应该使它保持本地更改,只要它们不是您试图强制覆盖的文件之一。
首先提交您的更改
git add *
git commit -a -m "local file server commit message"
然后获取更改并在发生冲突时覆盖
git fetch origin master
git merge -s recursive -X theirs origin/master
“-X”是选项名称,“他们的”是该选项的值。如果存在冲突,您选择使用“他们的”更改,而不是“您的”更改。
而不是做:
git fetch --all
git reset --hard origin/master
我建议做以下事情:
git fetch origin master
git reset --hard origin/master
如果要重置为origin / master分支,是否需要获取所有遥控器和分支?
看起来最好的方法是先做:
git clean
删除所有未跟踪的文件,然后继续平常 git pull
...
警告,如果您的gitignore文件中有任何目录/ *条目,执行此操作将永久删除您的文件。
一些答案似乎很糟糕。根据David Avsajanishvili的建议,对@Lauri发生的事情感到可怕。
相反(git> v1.7.6):
git stash --include-untracked
git pull
之后您可以清理藏匿历史记录。
手动,一个接一个:
$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...
$ git stash drop stash@{0}
$ git stash drop stash@{1}
蛮横,一劳永逸:
$ git stash clear
当然,如果你想回到你藏匿的东西:
$ git stash list
...
$ git stash apply stash@{5}
您可能会发现此命令有助于丢弃本地更改:
git checkout <your-branch> -f
然后进行清理(从工作树中删除未跟踪的文件):
git clean -f
如果除了未跟踪的文件之外还要删除未跟踪的目录:
git clean -fd
而不是合并 git pull
, 尝试这个:
git fetch --all
其次是:
git reset --hard origin/master
。