0


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

问题描述:

如何强制覆盖 git pull 上的本地文件?我的本地存储库包含一个文件名与服务器上相同的文件。

错误:未跟踪的工作树文件“example.txt”将被合并覆盖

解决方案1:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

⚠ 重要提示:如果您有任何本地更改,它们将会丢失(如果它们被跟踪)。此外,无论是否使用 --hard 选项,任何未推送的本地提交都将丢失。[*]

如果您有任何 Git 未跟踪的文件(例如上传的用户内容),这些文件不会受到影响。

首先,运行 fetch 以将所有 origin/ 引用更新为最新:

git fetch --all

备份当前分支:

git branch backup-master

然后,您有两个选择:

git reset --hard origin/master

或者,如果您在其他分支上:

git reset --hard origin/

解释:

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

在此之后,所有旧的提交都将保存在 new-branch-to-save-current-commits 中。

未提交的更改

然而,未提交的更改(即使是分阶段的)将会丢失。确保存储并提交您需要的任何内容。为此,您可以运行以下命令:

git stash

然后重新应用这些未提交的更改:

git stash pop
小心!如果您有本地未推送的提交,这会将它们从您的分支中删除!此解决方案使存储库中未跟踪的文件保持完整,但会覆盖其他所有内容。
这是一个受欢迎的问题,所以我想澄清一下这里的顶级评论。我只是按照这个答案中的描述执行了命令,并没有删除所有本地文件。只有远程跟踪的文件被覆盖,而这里的每个本地文件都保持不变。
如果您从远程分支名称不同于“master”的 repo 中提取,请使用 git reset --hard origin/branch-name
鉴于对这个问题和答案的赞成票数量,我认为 git 应该包含像 git pull -f 这样的命令
可以使用 git reflog 恢复在硬重置之前未推送的提交,其中列出了所有提交,也包括那些没有基础的提交。在您使用 git gc 清理本地副本之前,一切都会丢失

解决方案2:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

尝试这个:

git reset --hard HEAD
git pull

它应该做你想做的事。

我已经这样做了,并且一些不再在 repo 中的本地文件留在了磁盘上。
我不认为这是正确的。以上将执行合并,而不是覆盖问题中要求的:“如何强制 git 覆盖它们?”我没有答案,我目前正在寻找它.. 目前我使用要保留的代码切换到分支“git checkout BranchWithCodeToKeep”,然后执行“git branch -D BranchToOverwrite”,最后“git checkout -b BranchToOverwrite”。您现在将在分支 BranchToOverwrite 上获得来自 BranchWithCodeToKeep 的确切代码,而无需执行合并。
而不是使用 'git pull' 合并,尝试 git fetch --all 后跟 'git reset --hard origin/master'
是的,@lloydmoore 解决方案对我有用。可以做一个答案,而不仅仅是一个评论。
这会将当前更改重置为最后一个分支提交。然后 git pull 合并来自最新分支的更改。这正是我想要它做的......谢谢!

解决方案3:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

警告:git clean 会删除您所有未跟踪的文件/目录且无法撤消。

有时只是 clean -f 无济于事。如果您有未跟踪的目录,还需要 -d 选项:

# WARNING:this can't be undone!

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

警告:git clean 会删除您所有未跟踪的文件/目录且无法撤消。

考虑首先使用 -n (–dry-run) 标志。这将向您显示将被删除的内容而不实际删除任何内容:

git clean -n -f -d

示例输出:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...
您可以为 git clean 提供更具体的路径参数,并避免删除不冲突的未跟踪文件。
我认为场景描述清楚地表明他并不想丢弃内容。相反,他想要的是停止 git 在覆盖文件时犹豫不决。 @Lauri,这不应该发生在你身上。不幸的是,人们似乎误读了场景描述的本质——请参阅我的建议。
最后。当 make clean 无法清理所有内容时, git clean -f -d 很方便。
@crizCraig 除非它们被添加到 .gitignore
@earthmeLon,为此您可能需要 git clean -dfx。 -x 忽略 .gitignore。通常,您的构建产品将位于 .gitignore 中。

解决方案4:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

像刺猬一样,我认为答案很糟糕。但是尽管刺猬的回答可能会更好,但我认为它并没有它可以的那么优雅。我发现这样做的方法是使用带有定义策略的 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 更改(另一个选项是 ours 更改)。

这是迄今为止我看到的最好的答案。我没有尝试过,但与其他答案不同,这不会尝试对所有未跟踪的文件进行核对,这很危险,原因很明显。
同上 - 这对我进行非常大的合并(GitHub 拉取请求)时对我有用,我只是想在我所拥有的基础上接受它。好答案!在我的例子中,最后两个命令是:1) get fetch other-repo; 2) git merge -s recursive -X theirs other-repo/master
这将覆盖与存储库文件而不是本地文件的任何冲突,对吗?
最佳答案。在我的案例中,接受度最高的答案让我心不在焉。我切换回本地主分支并运行 git merge -X theirs origin/master
我只是想让该死的 git 覆盖所有内容并闭嘴。毕竟我只是在我的工作电脑和一些树莓派系统之间使用它。渴望强制覆盖选项,至少对于项目负责人

解决方案5:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

而不是这样做:

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

我建议执行以下操作:

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

如果您要重置到原始/主分支,则无需获取所有遥控器和分支,对吗?

您的答案正是您的代表所需要的。我必须问,这是否也会删除所有未跟踪的文件?
是的,我的大部分代表都来自这里 :) 这也将删除所有未跟踪的文件。就在两天前,我忘记并痛苦地想起了一些事情……
请参阅对此其他答案的评论:stackoverflow.com/a/8888015/2151700
这并没有删除我未跟踪的文件;这实际上是我所期望的。是否有理由对某些人而不是对其他人?
这正是我所需要的:覆盖远程中存在的未跟踪文件,并使其他所有内容保持不变。

解决方案6:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

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

git clean

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

我尝试使用“git clean”来解决同样的问题,但没有解决。 git status 说“你的分支和'origin/master'已经分道扬镳,分别有 2 和 9 个不同的提交。”和 git pull 说的话类似于你上面所说的。
git clean 是一个相当生硬的工具,可能会丢弃很多你可能想要保留的东西。最好删除或重命名 git 抱怨的文件,直到拉取成功。
我认为这在一般情况下是行不通的。有没有办法通过强制 git pull 基本上完成 git clone 远程操作?
@mathick:git fetch origin && git reset --hard origin/master
git clean 是最佳答案吗?似乎删除文件不一定是 OP 想要的。他们要求“覆盖本地文件”而不是删除。

解决方案7:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

Warning, doing this will permanently delete your files if you have any directory/* entries in your gitignore file.

有些答案似乎很糟糕。通过遵循 David Avsajanishvili 的建议,@Lauri 发生的事情很糟糕。

而是(git > v1.7.6):

git stash --include-untracked
git pull

稍后您可以清理存储历史记录。

手动,一个一个:

$ git stash list
stash@{0}:WIP on :...
stash@{1}:WIP on :...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

残酷地,一次性:

$ git stash clear

当然,如果你想回到你隐藏的东西:

$ git stash list
...
$ git stash apply stash@{5}
不,我不这么认为。存储只是将未提交的文件移开。上面还移动(隐藏)git 不跟踪的文件。这可以防止已添加到远程的文件被拉下,这些文件还没有拉到你的机器上——但是你已经创建了(!)——被拉下。所有这些都不会破坏未提交的工作。希望这有意义吗?
如果您没有 1.7.6,您可以通过临时 git add-ing 整个存储库来模仿 --include-untracked,然后立即隐藏它。
我同意刺猬的观点。如果你在这里做流行的答案,你很可能会发现你无意中杀死了很多你不想失去的东西。
我还有其他未跟踪的文件——除了合并/拉取想要覆盖的文件,所以这个解决方案效果最好。 git stash apply 带回了我所有未跟踪的文件,但(正确地)合并已创建的文件除外:“已经存在,不签出。”工作完美。
这是最干净的答案,应该是公认的答案。要节省一些输入,您可以使用缩写形式:git stash -u。

解决方案8:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

您可能会发现此命令有助于丢弃本地更改:

git checkout  -f

然后进行清理(从工作树中删除未跟踪的文件):

git clean -f

如果要删除除未跟踪文件之外的未跟踪目录:

git clean -fd
我认为场景描述清楚地表明他并不想丢弃内容。相反,他想要的是停止 git 在覆盖文件时犹豫不决。看我的建议。
尽管该答案可能不完全符合描述,但它仍然使我免于 git 玩弄回车的挫败感(autocrlf 为 false 的事件)。当 git reset --hard HEAD 不会给您留下“没有”修改过的文件时,这些“-f”标志非常有用。谢谢一堆。

解决方案9:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

不要与 git pull 合并,试试这个:

git fetch --all

其次是:

git reset --hard origin/master。

这在脚本中不起作用,因为您必须知道分支名称。以通用方式查看我的解决方案

解决方案10:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

唯一对我有用的是:

git reset --hard HEAD~5

这将使您返回五个提交,然后

git pull

我通过查找 how to undo a Git merge 发现了这一点。

这最终对我有用,因为我强制将我的分支推送到原始存储库,并在尝试将其拉到我的远程存储库时不断遇到合并冲突。
嗨,实际上这是 work around 的一个技巧,但非常有效。因为一些冲突可能只发生在几次提交中,所以恢复 5 次提交将确保与远程代码没有冲突。

解决方案11:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

所有这些解决方案的问题是它们要么太复杂,要么更大的问题是它们从网络服务器中删除了所有未跟踪的文件,这是我们不想要的,因为服务器上总是需要配置文件而不是在 Git 存储库中。

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

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts withuntracked 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

第一个命令获取最新数据。

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

第三个命令检出所有在本地修改的文件。

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

使用“git merge origin/master”作为最后一行(就像你在笔记中所说的那样)而不是“git pull”会更快,因为你已经从 git repo 中删除了任何更改。
是的,当然,git merge origin/master 会更快,甚至可能更安全。因为如果有人在删除此脚本的文件期间推送了新的更改(这不太可能发生,但可能发生),整个拉取可能会失败。我把 pull 放在那里的唯一原因是因为有人可能不在 master 分支上工作,而是在其他一些分支上工作,我希望脚本是通用的。
如果您有本地创建的文件(如选项文件),请将它们放在 .gitignore 中。
原文链接:https://www.huntsbot.com/qa/JAEY/how-do-i-force-git-pull-to-overwrite-local-files?lang=zh_CN

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

标签: git github 运维

本文转载自: https://blog.csdn.net/kalman2019/article/details/128214835
版权归原作者 HuntsBot 所有, 如有侵权,请联系我们删除。

“如何强制“git pull”覆盖本地文件?”的评论:

还没有评论