如何强制覆盖git pull
上的本地文件?
方案如下:
这是我得到的错误:
错误:未经跟踪的工作树文件'public / images / icon.gif'将被合并覆盖
如何强制Git覆盖它们?这个人是设计师 - 通常我手动解决所有冲突,因此服务器具有他们只需要在他们的计算机上更新的最新版本。
答案 0 :(得分:8578)
--hard
选项,任何未被推送的本地提交都将丢失。 [*] 如果您有任何未通过Git跟踪的文件(例如上传的用户内容),则这些文件不会受到影响。
我认为这是正确的方法:
git fetch --all
然后,您有两个选择:
git reset --hard origin/master
或者如果你在其他分支上:
git reset --hard origin/<branch_name>
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
答案 1 :(得分:838)
试试这个:
git reset --hard HEAD
git pull
它应该做你想要的。
答案 2 :(得分:428)
警告:git clean
会删除所有未跟踪的文件/目录,但无法撤消。
有时只是clean -f
无济于事。如果您有未跟踪的DIRECTORIES,还需要-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
...
答案 3 :(得分:354)
和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”是选项名称,“他们的”是该选项的值。如果存在冲突,您选择使用“他们的”更改,而不是“您的”更改。
答案 4 :(得分:258)
而不是:
git fetch --all
git reset --hard origin/master
我建议你做以下事情:
git fetch origin master
git reset --hard origin/master
如果要重置为原点/主分支,是否需要获取所有遥控器和分支?
答案 5 :(得分:128)
看起来最好的方法是先做:
git clean
要删除所有未跟踪的文件,然后继续使用通常的git pull
...
答案 6 :(得分:106)
有些答案似乎很糟糕。根据David Avsajanishvili的建议,对@Lauri发生的事情感到可怕。
相反(git&gt; 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}
答案 7 :(得分:91)
您可能会发现此命令有助于丢弃本地更改:
git checkout <your-branch> -f
然后进行清理(从工作树中删除未跟踪的文件):
git clean -f
除了未跟踪的文件外,如果要删除未跟踪的目录:
git clean -fd
答案 8 :(得分:83)
不要与git pull
合并,请尝试以下方法:
git fetch --all
接下来是:
git reset --hard origin/master
。
答案 9 :(得分:57)
答案 10 :(得分:52)
所有这些解决方案的问题在于它们都太复杂,或者更大的问题是它们从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
第一个命令获取最新数据。
第二个命令检查是否有任何文件被添加到存储库,并从本地存储库中删除那些未引起文件,这会导致冲突。
第三个命令检出所有本地修改过的文件。
最后我们做了一个更新到最新版本,但这次没有任何冲突,因为repo中的未跟踪文件不再存在,并且所有本地修改的文件已经与存储库。
答案 11 :(得分:41)
我遇到了同样的问题。没有人给我这个解决方案,但它对我有用。
我解决了它:
.git
目录。git reset --hard HEAD
git pull
git push
现在可行。
答案 12 :(得分:37)
首先,尝试标准方式:
git reset HEAD --hard # To remove all not committed changes!
git clean -fd # To remove all untracked (non-git) files and folders!
警告:只有在您没有提交数据/文件时,上述命令才会导致数据/文件丢失!如果您不确定,请先备份整个存储库文件夹。
然后再拉一次。
如果上面没有帮助,你不关心你未跟踪的文件/目录(先备份以防万一),请尝试以下简单步骤:
cd your_git_repo # where 'your_git_repo' is your git repository folder
rm -rfv * # WARNING: only run inside your git repository!
git pull # pull the sources again
这将删除所有git文件(例外情况.git/
dir,你有所有提交)并再次拉动它。
为什么git reset HEAD --hard
在某些情况下会失败?
.gitattributes file
在.gitattributes中使用eol=lf
规则可能会导致git通过在某些文本文件中将CRLF行结尾转换为LF来修改某些文件更改。
如果是这种情况,您必须提交这些CRLF / LF更改(通过在git status
中查看),或尝试:git config core.autcrlf false
暂时忽略它们。
文件系统不兼容
当您使用不支持权限属性的文件系统时。
在示例中,您有两个存储库,一个在Linux / Mac上(ext3
/ hfs+
),另一个在基于FAT32 / NTFS的文件系统上。
正如您所注意到的,有两种不同类型的文件系统,因此不支持Unix权限的文件系统基本上无法重置不支持该类权限的系统上的文件权限,因此无论如何{ {1}}你试试,git总会发现一些“变化”。
答案 13 :(得分:35)
在谈到之前答案中的拉/取/合并时,我想分享一个有趣且富有成效的技巧,
git pull --rebase
强> 以上命令是我Git生活中最有用的命令,可以节省大量时间。
在将新提交推送到服务器之前,请尝试此命令,它将自动同步最新的服务器更改(使用fetch + merge),并将您的提交放在Git日志的顶部。没有必要担心手动拉/合并。
在 What does "git pull --rebase" do? 中查找详细信息。
答案 14 :(得分:27)
我有类似的问题。我不得不这样做:
git reset --hard HEAD
git clean -f
git pull
答案 15 :(得分:27)
根据我自己的类似经历,Strahinja Kustudic提供的解决方案是迄今为止最好的解决方案。正如其他人所指出的那样,简单地进行硬重置会删除所有未跟踪的文件,这些文件可能包含许多您不想删除的内容,例如配置文件。更安全的是,仅删除即将添加的文件,并且就此而言,您可能还想要签出任何即将更新的本地修改文件。
考虑到这一点,我更新了Kustudic的脚本来做到这一点。我还修正了一个拼写错误(原文中缺少'。
#/bin/sh
# 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
echo "Deleting untracked file $file..."
rm -vf "$file"
done
# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
echo "Checking out modified file $file..."
git checkout $file
done
# Finally merge all the changes (you could use merge here as well)
git pull
答案 16 :(得分:27)
我总结了其他答案。您可以无错误地执行git pull
:
git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull
警告:此脚本非常强大,因此您可能会丢失更改。
答案 17 :(得分:23)
我认为有两种可能的冲突原因,必须单独解决,据我所知,上述答案均不涉及两者:
需要删除未跟踪的本地文件,手动(更安全)或按照其他答案的建议,git clean -f -d
还需要删除不在远程分支上的本地提交。 IMO实现这一目标的最简单方法是:git reset --hard origin/master
(用你正在处理的任何分支代替'master',然后先运行git fetch origin
)
答案 18 :(得分:20)
似乎这里的大多数答案都集中在master
分支上;然而,有时我在两个不同的地方工作同一个功能分支,我希望一个反射在另一个反射,而不需要很多跳跃。
基于RNA's answer和torek's answer to a similar question的组合,我想出了一个非常出色的作品:
git fetch
git reset --hard @{u}
从分支运行它,它只会将本地分支重置为上游版本。
这也可以很好地放入git别名(git forcepull
)中:
git config alias.forcepull "!git fetch ; git reset --hard @{u}"
或者,在.gitconfig
文件中:
[alias]
forcepull = "!git fetch ; git reset --hard @{u}"
享受!
答案 19 :(得分:20)
更简单的方法是:
git checkout --theirs /path/to/file.extension
git pull origin master
这将使用git
上的文件覆盖您的本地文件答案 20 :(得分:19)
我有同样的问题,出于某种原因,即使git clean -f -d
也不会这样做。原因如下:出于某种原因,如果您的文件被Git忽略(通过.gitignore条目,我认为),它仍然困扰用稍后的 pull 覆盖它,但是 clean 不会将其删除,除非您添加-x
。
答案 21 :(得分:18)
我刚刚通过以下方式解决了这个问题:
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
其中最后一个命令列出了您当地的更改。继续修改“tmp”分支,直到它可以接受,然后通过以下方式合并回master:
git checkout master && git merge tmp
下次,你可以通过查找“git stash branch”以更干净的方式处理这个问题,虽然stash可能会让你在前几次尝试时遇到麻烦,所以首先要对非关键项目进行实验。
答案 22 :(得分:17)
我有一种奇怪的情况:git clean
或git reset
都不起作用。我必须在每个未跟踪文件上使用以下脚本从git index
中删除冲突文件:
git rm [file]
然后我能够拉得很好。
答案 23 :(得分:17)
我知道一种更简单,更少痛苦的方法:
$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp
那就是它!
答案 24 :(得分:13)
尽管存在最初的问题,但最常见的答案可能会给遇到类似问题但又不想丢失本地文件的人带来问题。例如,请参阅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
。
答案 25 :(得分:13)
这四个命令对我有用。
git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master
执行这些命令后检查/拉动
git pull origin master
我尝试了很多,但终于用这些命令取得了成功。
答案 26 :(得分:12)
只做
git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname
因此,您可以避免所有不需要的副作用,例如删除您想要保留的文件或目录等等。
答案 27 :(得分:11)
将索引和头部重置为origin/master
,但不要重置工作树:
git reset origin/master
答案 28 :(得分:9)
这对我很有效!
git fetch --all
git reset --hard origin/master
答案 29 :(得分:9)
我仔细阅读了所有答案,但我正在寻找一个命令来执行此操作。这就是我做的。为.gitconfig添加了一个git别名
.g.cs
以
运行命令[alias]
fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"
相当于
git fp origin master
答案 30 :(得分:9)
Requirements:
Solution:
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
答案 31 :(得分:8)
请勿使用git reset --hard
。这将抹去他们可能完全不受欢迎的变化。代替:
git pull
git reset origin/master
git checkout <file1> <file2> ...
你当然可以使用git fetch
而不是git pull
,因为它显然不会合并,但如果你通常拉,那么继续拉这里是有意义的。
所以这里发生的是git pull
更新您的原始/主要参考; git reset
将您的本地分支参考更新为与origin / master相同而不更新任何文件,因此您的签出状态不会更改;然后git checkout
根据需要将文件还原为您的本地分支索引状态。如果在实时和上游主服务器上添加了完全相同的文件,则索引已经与重置后的文件匹配,因此在常见情况下,您根本不需要执行git checkout
。
如果上游分支还包含您要自动应用的提交,则可以对流程进行细微修改:
git pull
git merge <commit before problem commit>
git reset <problem commit>
git checkout <file1> <file2> ...
git pull
答案 32 :(得分:8)
你可以试试:
$ git fetch --all
$ git reset --hard origin/master
$ git pull
答案 33 :(得分:7)
这是还原更改的最佳做法:
git commit
提交您的暂存更改,以便将其保存在 reflog 中(见下文)git fetch
获取最新的上游更改git reset --hard origin/master
硬重置为原始主分支reflog 记录本地存储库中正在更新的分支和其他引用。或者简单地说 - reflog 是您的更改历史记录。
所以提交它总是很棒的做法。提交附加到reflog,确保您始终可以检索已删除的代码。
答案 34 :(得分:6)
git fetch --all
然后,如果您在master分支上
git reset --hard origin/master
其他
git reset --hard origin/master<branch_name>
答案 35 :(得分:5)
我试图在Angular2-Webpack-Starter上使用Material2分支并且有点时间。这是我可以下载和使用该分支的唯一方法。
git clone --depth 1 https://github.com/angularclass/angular2-webpack-starter.git
cd angular2-webpack-starter/
git checkout -b material2
打开项目文件夹并删除所有非隐藏文件和文件夹。留下所有隐藏的。
git add .
git commit -m "pokemon go"
git reset --hard
git pull origin material2
(当编辑器弹出时,点击':wq',然后按 Enter )
现在你准备好了。
答案 36 :(得分:5)
我使用此命令来删除阻止我进行拉/合并的本地文件。不过要小心!首先运行git merge …
以查看是否只有您真正要删除的文件。
git merge origin/master 2>&1 >/dev/null | grep ^[[:space:]] | sed s/^[[:space:]]//g | xargs -L1 rm
git merge
列出所有这些文件。它们以一些白色空间为前提。2>&1 >/dev/null
将错误输出重定向到标准输出,以便grep
选择它。grep ^[[:space:]]
仅过滤包含文件名的行。sed s/^[[:space:]]//g
从头开始修剪空白区域。xargs -L1 rm
在每个文件上调用rm
,删除它们。谨慎处理:无论git merge
输出是什么,rm
都会被调用每个行以空格开头。
答案 37 :(得分:3)
在Windows上,执行以下命令:
git fetch --all & git reset --hard origin/master
答案 38 :(得分:3)
您可以忽略项目基础文件夹中包含文件的文件:
的.gitignore
public/images/*
然后拉出更改,然后从gitignore文件中删除该行。
答案 39 :(得分:2)
尽管这个问题已经有很多答案,但最初的问题是解决这个问题
错误:未跟踪的工作树文件“ public / images / icon.gif”将被合并覆盖
由于二进制文件无法合并,一个简单的答案就是
git checkout public/images/icon.gif
文件将恢复该分支中的先前状态。
如果我不想丢失更改,通常会做git stash
,如果我不在乎本地修改的文件,我通常会做git checkout .
之类的事情。 IMO比reset --hard
,clean
...简单得多,所有这些东西都更适合使分支保持远程状态,包括提交,未跟踪的文件,而不仅仅是解决本地修改的文件。>
答案 40 :(得分:1)
解决此问题的另一种方法是首先使用 git stash
隐藏任何未提交的更改,然后运行
git pull --rebase=interactive -s recursive -X theirs
在交互式 rebase 中,您可以将所有本地不需要的提交更改为 drop
,这将删除它们并使您处于远程分支的头部,而不会引入合并提交。
现在您可以运行 git stash apply
,如果您有想要恢复的本地隐藏更改。
答案 41 :(得分:1)
执行git pull后,将获得不匹配的文件列表。 如果文件数量不是很大,则可以检出这些文件,此操作将覆盖这些文件。
git checkout-<文件名>
如果要进行快速检查以修改服务器上的本地文件(不建议这样做,并且可能是您出现此问题的可能原因:D),然后在找到解决方案后签出更改的文件,我通常会这样做。
答案 42 :(得分:1)
我这样做是为了使其正常工作:
在创建新分支的计算机上:
git fetch --all
在我希望新分支显示的计算机上:
Codeigniter
答案 43 :(得分:1)
您可以尝试
git pull --force
如果要覆盖所有本地文件
答案 44 :(得分:1)
git fetch --all && git reset --hard origin/master && git pull
答案 45 :(得分:0)
只需设置您的遥控器
git remote set-url origin https://youruser:yourpass@github.com/youraccount/something.git
答案 46 :(得分:0)
由于我经常需要通过命令提示符在Windows上重置当前分支的快速方法,因此这是一种快速方法:
for /f "tokens=1* delims= " %a in ('git branch^|findstr /b "*"') do @git reset --hard origin/%b
答案 47 :(得分:0)
我已经尽力在这里找到了大部分内容,但在我的情况下没有任何作用。
有效的是 git merge -X theirs
答案 48 :(得分:0)
第1步。从本地存储库的根目录,保存备份并清空 当前文件夹:
mkdir -p ../<branch_name>-bkp && mv --backup=t * ../<branch_name>-bkp
第2步。导航到您要强制拉动的分支:
git checkout <branch_to_overwrite>
第3步。从远程存储库中提取最新版本:
git reset --hard origin/<branch_to_overwrite> && git pull
您应在其中用分支名称替换
您 必须 在git pull
之后执行git reset --hard origin/<branch_name>
。
否则,您可能无法从远程仓库获取最新版本!
更多评论:
git reset --hard
将“重置登台区域和工作区域
目录以匹配最近的提交。”再次,从到我的
自己的经验,这是 不正确 !git reset --hard origin/<branch_to_overwrite>
必须始终
后面紧跟git pull
,以确保您从
远程存储库。(!)参考文献:
https://gitforwindows.org/
https://www.atlassian.com/git/tutorials/undoing-changes/git-reset
https://www.atlassian.com/git/tutorials/rewriting-history/git-reflog
答案 49 :(得分:0)
1:重置为上一次提交
git reset --hard HEAD
2:删除未跟踪的文件
git clean -f
3:拉出提交
git pull
来源:
答案 50 :(得分:0)
如果要以通用方式重置为远程跟踪分支,请使用:
git fetch
git reset --keep origin/$(git rev-parse --abbrev-ref HEAD)
如果您想重置本地更改:
git fetch
git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)
答案 51 :(得分:-4)
我认为您也可以按Number of rows: 107
Cell at 0,0: <table:table-cell xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" table:style-name="ce1" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" office:value-type="string" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" calcext:value-type="string"><text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">Carpeta</text:p></table:table-cell>
java.lang.NullPointerException
/ git push -f