Jak*_*zok 6654 git version-control overwrite git-pull git-fetch
如何强制覆盖本地文件git pull
?
方案如下:
这是我得到的错误:
错误:未经跟踪的工作树文件'public/images/icon.gif'将被合并覆盖
如何强制Git覆盖它们?这个人是设计师 - 通常我会手动解决所有冲突,因此服务器具有他们只需要在他们的计算机上更新的最新版本.
RNA*_*RNA 9259
--hard
选项,任何未被推送的本地提交都将丢失.[*]如果您有任何未被 Git跟踪的文件(例如上传的用户内容),则这些文件不会受到影响.
我认为这是正确的方法:
git fetch --all
Run Code Online (Sandbox Code Playgroud)
然后,您有两个选择:
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)
或者如果你在其他分支上:
git reset --hard origin/<branch_name>
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在此之后,所有旧提交都将被保留new-branch-to-save-current-commits
.
然而,未提交的更改(即使是暂存的)也将丢失.确保存储并提交您需要的任何内容.为此,您可以运行以下内容:
git stash
Run Code Online (Sandbox Code Playgroud)
然后重新应用这些未提交的更改:
git stash pop
Run Code Online (Sandbox Code Playgroud)
Tra*_*der 884
试试这个:
git reset --hard HEAD
git pull
Run Code Online (Sandbox Code Playgroud)
它应该做你想要的.
Dav*_*ili 441
警告:git clean
删除所有未跟踪的文件/目录,并且无法撤消.
有时候只是clean -f
没有帮助.如果您有未跟踪的DIRECTORIES,还需要-d选项:
# WARNING: this can't be undone!
git reset --hard HEAD
git clean -f -d
git pull
Run Code Online (Sandbox Code Playgroud)
警告:git clean
删除所有未跟踪的文件/目录,并且无法撤消.
首先考虑使用-n
(--dry-run
)标志.这将显示在没有实际删除任何内容的情况下将删除的内容:
git clean -n -f -d
Run Code Online (Sandbox Code Playgroud)
示例输出:
Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...
Run Code Online (Sandbox Code Playgroud)
Ric*_*ard 371
像Hedgehog一样,我认为答案很糟糕.但是虽然刺猬的答案可能会更好,但我认为它并不像它那样优雅.我发现这样做的方法是使用"fetch"和"merge"与定义的策略.这应该使它保持本地更改,只要它们不是您试图强制覆盖的文件之一.
git add *
git commit -a -m "local file server commit message"
Run Code Online (Sandbox Code Playgroud)
git fetch origin master
git merge -s recursive -X theirs origin/master
Run Code Online (Sandbox Code Playgroud)
"-X"是选项名称,"他们的"是该选项的值.如果存在冲突,您选择使用"他们的"更改,而不是"您的"更改.
Joh*_*eke 270
而不是做:
git fetch --all
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)
我建议做以下事情:
git fetch origin master
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)
如果要重置为原点/主分支,是否需要获取所有遥控器和分支?
Jak*_*zok 131
看起来最好的方法是先做:
git clean
Run Code Online (Sandbox Code Playgroud)
要删除所有未跟踪的文件,然后继续正常git pull
...
Hed*_*hog 109
警告,如果您的gitignore文件中有任何目录/*条目,执行此操作将永久删除您的文件.
一些答案似乎很糟糕.根据David Avsajanishvili的建议,对@Lauri发生的事情感到可怕.
相反(git> v1.7.6):
git stash --include-untracked
git pull
Run Code Online (Sandbox Code Playgroud)
之后您可以清理藏匿历史记录.
手动,一个接一个:
$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...
$ git stash drop stash@{0}
$ git stash drop stash@{1}
Run Code Online (Sandbox Code Playgroud)
蛮横,一劳永逸:
$ git stash clear
Run Code Online (Sandbox Code Playgroud)
当然,如果你想回到你藏匿的东西:
$ git stash list
...
$ git stash apply stash@{5}
Run Code Online (Sandbox Code Playgroud)
Vis*_*hal 92
您可能会发现此命令有助于丢弃本地更改:
git checkout <your-branch> -f
Run Code Online (Sandbox Code Playgroud)
然后进行清理(从工作树中删除未跟踪的文件):
git clean -f
Run Code Online (Sandbox Code Playgroud)
如果除了未跟踪的文件之外还要删除未跟踪的目录:
git clean -fd
Run Code Online (Sandbox Code Playgroud)
小智 60
唯一对我有用的是:
git reset --hard HEAD~5
Run Code Online (Sandbox Code Playgroud)
这将带你回五次提交然后再回来
git pull
Run Code Online (Sandbox Code Playgroud)
我发现通过查找如何撤消Git合并.
Str*_*dic 53
所有这些解决方案的问题是,他们都是要么过于复杂,或者一个更大的问题,是他们从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
Run Code Online (Sandbox Code Playgroud)
第一个命令获取最新数据.
第二个命令检查是否有正在被添加到存储库,并删除从本地资源库,这将导致冲突,这些未跟踪文件中的任何文件.
第三个命令检出所有本地修改的文件.
最后我们做了一个更新到最新版本,但这次没有任何冲突,因为repo中的未跟踪文件不再存在,并且所有本地修改的文件已经与存储库中的相同.
ken*_*orb 48
首先,尝试标准方式:
git reset HEAD --hard # To remove all not committed changes!
git clean -fd # To remove all untracked (non-git) files and folders!
Run Code Online (Sandbox Code Playgroud)
警告:只有在您没有提交数据/文件时,上述命令才会导致数据/文件丢失!如果您不确定,请先备份整个存储库文件夹.
然后再拉它.
如果上面没有帮助,你不关心你未跟踪的文件/目录(以后是先备份),请尝试以下简单步骤:
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
Run Code Online (Sandbox Code Playgroud)
这将删除所有git文件(除了.git/
dir,你有所有提交)并再次拉它.
git reset HEAD --hard
在某些情况下为什么会失败?
自定义规则 .gitattributes file
eol=lf
在.gitattributes中有规则可能会导致git通过在某些文本文件中将CRLF行结尾转换为LF来修改某些文件更改.
如果是这种情况,您必须提交这些CRLF/LF更改(通过查看它们git status
),或尝试:git config core.autcrlf false
暂时忽略它们.
文件系统不兼容
当您使用不支持权限属性的文件系统时.在示例中,您有两个存储库,一个在Linux/Mac(ext3
/ hfs+
)上,另一个在基于FAT32/NTFS的文件系统上.
正如您所注意到的,有两种不同类型的文件系统,因此不支持Unix权限的文件系统基本上无法重置不支持该类权限的系统上的文件权限,因此无论--hard
您如何尝试,git总是检测到一些"变化".
Joh*_*ler 45
我有同样的问题.没有人给我这个解决方案,但它对我有用.
我通过以下方式解决了
.git
目录.git reset --hard HEAD
git pull
git push
现在它有效.
Saz*_*han 38
在谈到之前答案中的拉/取/合并时,我想分享一个有趣且富有成效的技巧,
git pull --rebase
以上命令是我Git生活中最有用的命令,可以节省大量时间.
在将新提交推送到服务器之前,请尝试此命令,它将自动同步最新的服务器更改(使用fetch + merge),并将您的提交放在Git日志的顶部.无需担心手动拉/合并.
在"git pull --rebase"中查找详细信息?.
小智 28
我遇到了类似的问题.我不得不这样做:
git reset --hard HEAD
git clean -f
git pull
Run Code Online (Sandbox Code Playgroud)
Rob*_*oon 28
我总结了其他答案.您可以git pull
无错误地执行:
git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull
Run Code Online (Sandbox Code Playgroud)
警告:此脚本非常强大,因此您可能会丢失更改.
Rol*_*ser 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
Run Code Online (Sandbox Code Playgroud)
blu*_*ray 26
我不知道为什么还没有人谈论FETCH_HEAD
。
git fetch origin master && git reset --hard FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)
如果你想把它放在一个别名中,命令是:
git config --global alias.fpull '!git fetch origin master && git reset --hard FETCH_HEAD'
Run Code Online (Sandbox Code Playgroud)
tih*_*iho 23
我认为有两种可能的冲突原因,必须单独解决,据我所知,上述答案都不涉及两者:
需要删除未跟踪的本地文件,手动(更安全)或按照其他答案中的建议删除 git clean -f -d
还需要删除不在远程分支上的本地提交.IMO实现这一目标的最简单方法是:( git reset --hard origin/master
通过您正在处理的任何分支替换'master',然后运行git fetch origin
第一个)
max*_* 69 21
一种更简单的方法是:
git checkout --theirs /path/to/file.extension
git pull origin master
Run Code Online (Sandbox Code Playgroud)
这将使用git上的文件覆盖您的本地文件
Jac*_*lyn 20
似乎这里的大多数答案都集中在master
分支上; 然而,有时候我在两个不同的地方工作同一个功能分支,我希望一个中的rebase能够反映在另一个中而没有大量的跳跃.
基于RNA的答案和torek对类似问题的回答的组合,我提出了这个非常有效的方法:
git fetch
git reset --hard @{u}
Run Code Online (Sandbox Code Playgroud)
从分支运行它,它只会将本地分支重置为上游版本.
这可以很好地放入git alias(git forcepull
)中:
git config alias.forcepull "!git fetch ; git reset --hard @{u}"
或者,在您的.gitconfig
文件中:
[alias]
forcepull = "!git fetch ; git reset --hard @{u}"
Run Code Online (Sandbox Code Playgroud)
请享用!
Ach*_*uky 20
git fetch --all
Run Code Online (Sandbox Code Playgroud)
git reset --hard origin/develop
Run Code Online (Sandbox Code Playgroud)
小智 19
我有同样的问题,出于某种原因,即使是git clean -f -d
不会这样做.原因如下:出于某种原因,如果您的文件被Git忽略(通过.gitignore条目,我认为),它仍然困扰用稍后的拉动覆盖它,但干净不会删除它,除非你添加-x
.
Sim*_* B. 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
Run Code Online (Sandbox Code Playgroud)
最后一个命令列出了本地更改的列表.继续修改"tmp"分支,直到它可以接受,然后合并回master:
git checkout master && git merge tmp
Run Code Online (Sandbox Code Playgroud)
下次你可以通过查找"git stash branch"以更干净的方式处理这个问题,虽然stash可能会让你在前几次尝试时遇到麻烦,所以首先要对非关键项目进行实验......
ddm*_*nko 18
我知道一种更简单,更少痛苦的方法:
$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp
Run Code Online (Sandbox Code Playgroud)
而已!
小智 17
我有一个奇怪的情况,既没有git clean
或git reset
工作.我必须git index
在每个未跟踪的文件上使用以下脚本删除冲突的文件:
git rm [file]
Run Code Online (Sandbox Code Playgroud)
然后我能够拉得很好.
vis*_*dra 13
这四个命令对我有用.
git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master
Run Code Online (Sandbox Code Playgroud)
执行这些命令后检查/拉出
git pull origin master
Run Code Online (Sandbox Code Playgroud)
我尝试了很多,但最终成功完成了这些命令.
Sno*_*ash 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
Run Code Online (Sandbox Code Playgroud)
我们假设其他存储库是origin master
.
小智 13
做就是了
git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname
Run Code Online (Sandbox Code Playgroud)
因此,您可以避免所有不必要的副作用,例如删除您想要保留的文件或目录等.
小智 11
将索引和头重置为origin/master
,但不要重置工作树:
git reset origin/master
Run Code Online (Sandbox Code Playgroud)
要求:
解:
使用干净的文件和目录获取,忽略.gitignore并硬重置为原点.
git stash --include-untracked
git fetch --all
git clean -fdx
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)我阅读了所有的答案,但我正在寻找一个命令来做到这一点.这就是我做的.为.gitconfig添加了一个git别名
[alias]
fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"
Run Code Online (Sandbox Code Playgroud)
运行您的命令
git fp origin master
Run Code Online (Sandbox Code Playgroud)
相当于
git fetch origin master
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)
不要用git reset --hard
.这将抹去他们可能完全不受欢迎的变化.代替:
git pull
git reset origin/master
git checkout <file1> <file2> ...
Run Code Online (Sandbox Code Playgroud)
你当然可以使用,git fetch
而不是git pull
因为它显然不会合并,但如果你通常拉它,继续拉这里是有道理的.
那么这里发生的是git pull
更新您的origin/master引用 ; 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
Run Code Online (Sandbox Code Playgroud)
在 Windows 上,执行以下单个命令:
git fetch --all & git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)
如果要以通用方式重置到远程跟踪分支,请使用:
git fetch
git reset --keep origin/$(git rev-parse --abbrev-ref HEAD)
Run Code Online (Sandbox Code Playgroud)
如果您也想重置本地更改:
git fetch
git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)
Run Code Online (Sandbox Code Playgroud)
小智 6
如果您正在编写代码并发现新的更改是一个巨大的错误或不需要的,您可以简单地使用以下替代方案:
git restore .
Run Code Online (Sandbox Code Playgroud)
在哪里 。表示目录中存在的所有文件。
该解决方案始终运行。
cd $GIT_ROOT_DIRECTORY
git fetch origin/$TARGET_BRANCH
git rm -rf --cached .
git reset --hard origin/TARGET_BRANCH
git clean -df
git pull origin $TARGET_BRANCH
Run Code Online (Sandbox Code Playgroud)
其关键在于使用FETCH_HEAD
.
git fetch origin <your e.g. feature branch>
git reset --hard FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)
我已经尝试过了HEAD
,git pull
但没有一个成功。
您可以使用项目基文件夹中的文件来忽略该文件:
.gitignore
public/images/*
Run Code Online (Sandbox Code Playgroud)
然后提取更改,然后从 gitignore 文件中删除该行。
我使用此命令来删除本地文件,阻止我进行拉/合并.不过要小心!git merge …
首先运行以查看是否只有那些您确实要删除的文件.
git merge origin/master 2>&1 >/dev/null | grep ^[[:space:]] | sed s/^[[:space:]]//g | xargs -L1 rm
Run Code Online (Sandbox Code Playgroud)
git merge
列出所有这些文件.它们被一些白色空间所包围.2>&1 >/dev/null
将错误输出重定向到标准错误输出,以便将其选中grep
.grep ^[[:space:]]
仅过滤带有文件名的行.sed s/^[[:space:]]//g
从一开始就修剪白色空间.xargs -L1 rm
调用rm
每个文件,删除它们.小心处理:无论git merge
输出rm
是什么,都会以从空白开始的每一行调用.
我试图在Angular2-Webpack-Starter上使用Material2分支并且有一段时间.这是我可以下载和使用该分支的唯一方法.
git clone --depth 1 https://github.com/angularclass/angular2-webpack-starter.git
cd angular2-webpack-starter/
git checkout -b material2
Run Code Online (Sandbox Code Playgroud)
打开项目文件夹并删除所有非隐藏文件和文件夹.留下所有隐藏的.
git add .
git commit -m "pokemon go"
git reset --hard
git pull origin material2
Run Code Online (Sandbox Code Playgroud)
(当编辑器弹出时,点击':wq',然后按Enter)
现在你准备好了.
1:重置为之前的提交
git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)
2:删除未跟踪的文件
git clean -f
Run Code Online (Sandbox Code Playgroud)
3:拉取提交
git pull
Run Code Online (Sandbox Code Playgroud)
资料来源:
解决此问题的另一种方法是首先使用存储任何未提交的更改git stash
,然后运行
git pull --rebase=interactive -s recursive -X theirs
Run Code Online (Sandbox Code Playgroud)
在交互式变基中,您可以将所有本地不需要的提交更改为drop
,这将摆脱它们并使您处于远程分支的头部,而无需引入合并提交。
git stash apply
现在,如果您有本地隐藏的更改想要带回来,您可以运行。
小智 5
“我的本地更改很小,或者我的更改不起作用。我只想将所有内容重置回原始状态。我知道我所有的本地更改都会丢失。”
如果是这样的话:
git reset --hard
git pull
Run Code Online (Sandbox Code Playgroud)