“git pull”如何强制覆盖本地文件?

git pull如何强制覆盖本地文件呢?

情景如下:

  • 团队成员正在修改我们正在处理的网站的模板

  • 他们正在添加一些图像到图像目录(但忘记在源代码控制下添加它们)

  • 他们通过邮件将图像发送给我

  • 我在源代码控制下添加图像,并将其与其他更改一起推送到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从远程下载最新的,而不尝试合并或rebase任何东西。

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


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

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

在此之后,所有旧的提交都将保存在new-branch-to-save-current-commits中。然而,没有提交的更改(即使staged)将会丢失。确保存储和提交任何你需要的东西。


次佳解决方法

尝试这个:

git reset --hard HEADgit pull


第三种解决方法

警告:git clean删除所有未跟踪的文件/目录,不能撤消。


有的时候只有clean -f无效。如果你没有跟踪DIRECTORIES,-d选项也需要:

git reset --hard HEADgit clean -f -d
git pull

警告:git clean删除所有未跟踪的文件/目录,不能撤消。


第四种方法

可行的方式是通过使用"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"是选项名称,"theirs"是该选项的值。如果存在冲突,则选择使用"their"更改,而不是"your"更改。


第五种方法

这是另外的思路,不建议上文的做法:

git fetch --allgit reset --hard origin/master

而是建议这样做:

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

如果你打算重新设置原点/主分支,没有必要获取所有的遥控器和分支


第六种方法

看起来最好的办法是先做:

git clean

删除所有未跟踪的文件,然后继续使用通常的git pull ...


第七种方法

所有这些解决方案的问题是,它们都是太复杂,或者更大的问题是,他们从Web服务器中删除所有未跟踪的文件,这是我们不想要的,因为总是有需要的配置文件服务器,而不是在Git仓库。

这是我们正在使用的最干净的解决方案:

#Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • 第一个命令获取最新的数据。

  • 第二个命令检查是否有任何正在添加到存储库的文件,并从本地存储库中删除那些会导致冲突的未跟踪文件。

  • 第三个命令checks-out所有在本地修改的文件。

  • 最后,我们将更新到最新版本,但是这次没有任何冲突,因为repo中的未跟踪文件不再存在,所有本地修改的文件已经与存储库中的相同。

image.png


在博客维护netMarketing类库的时候, 经常使用第7种方法, 直接用线上的最新版覆盖本地文件.



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864