我在本地机器上做了一些更新,将它们推送到远程存储库,现在我试图将更改拉到服务器上,我得到了消息;

error: Your local changes to the following files would be overwritten by merge:
wp-content/w3tc-config/master.php
Please, commit your changes or stash them before you can merge.

所以我跑了,

git checkout -- wp-content/w3tc-config/master.php

再试一次,我得到了同样的信息。我假设w3tc更改了服务器上配置文件中的一些内容。我不关心本地副本或远程副本是否在服务器上(我认为远程副本是最好的),我只是希望能够合并我的其余更改(插件更新)。

什么好主意吗?


您不能与本地修改合并。Git保护您避免丢失潜在的重要更改。

你有三个选择:

使用以下命令提交更改 git commit -m我的信息 隐藏它。 存储就像一个堆栈,您可以在其中推送更改,并以相反的顺序弹出更改。 储存,键入 git藏 做合并,然后取出藏物: Git隐藏pop 丢弃局部更改 使用git重置——很难 或者git checkout -t -f remote/branch 或者:放弃特定文件的本地更改 使用git签出文件名


我遇到的情况是这样的:

错误:您对以下文件的本地更改将被merge覆盖: wp-content / w3tc-config / master.php 请在合并之前提交您的更改或隐藏它们。

除了,在那之前,是遥远的: 实际上是这样的:

您对以下文件的本地更改将被merge覆盖: 一些/ file.ext 请在合并之前提交您的更改或隐藏它们。

发生的事情是(我认为,不是100%肯定)git post receive钩子开始运行,由于远程服务器存储库中的移动变化而搞砸了,理论上,不应该触及。

So what I ended up doing by tracing through the post-receive hook and finding this, was having to go to the remote repository on the server, and there was the change (which wasn't on my local repository, which, in fact, said that it matched, no changes, nothing to commit, up to date, etc.) So while on the local, there were no changes, on the server, I then did a git checkout -- some/file.ext and then the local and remote repositories actually matched and I could continue to work, and deploy. Not entirely sure how this situation occurred, though a couple dozen developers plus IT changes may had something to do with it.


git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

第一个命令将更改临时存储在存储区中,并从工作目录中删除它们。

第二个命令切换分支。

第三个命令恢复您在stash中存储的更改(——index选项用于确保暂存文件仍然是暂存的)。


您可以尝试以下方法之一:

变基

对于简单的更改,尝试在它的基础上重新调整,同时拖动更改,例如。

git pull origin master -r

所以它会在取回后把你当前的分支应用到上游的分支上。

这相当于:checkout master, fetch和rebase origin/master git命令。

这是一种潜在危险的操作方式。它重写了历史,这不是一个好兆头,因为你已经出版了那段历史。除非你仔细阅读了git-rebase(1),否则不要使用这个选项。


结帐

如果你不关心你的局部变化,你可以暂时切换到其他分支(强制),然后切换回来,例如。

git checkout origin/master -f
git checkout master -f

重置

如果您不关心您的本地更改,尝试将其重置为HEAD(原始状态),例如。

git reset HEAD --hard

如果上面没有帮助,它可能是你的git规范化文件(.gitattributes)中的规则,所以最好提交它所说的。或者你的文件系统不支持权限,所以你必须在git配置中禁用filemode。

相关:我如何强制“git拉”覆盖本地文件?


试试这个

git stash save ""

再拉一次


在我的例子中,我备份然后删除Git抱怨的文件,提交,然后我终于能够签出另一个分支。

然后我替换文件,复制回内容并继续,就像什么都没有发生一样。


在拉之前要求提交

git stash git pull pull origin << branch >

如有需要:

Git stash应用


警告:这将删除未跟踪的文件,所以它不是这个问题的一个很好的答案。

以我为例,我不想保留这些文件,所以这对我来说很有效:

Git 2.11及更新版本:

git clean  -d  -fx .

较旧的 Git:

git clean  -d  -fx ""

参考:http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

-x意味着被忽略的文件以及git不知道的文件也会被删除。 -d表示除未跟踪的文件外,还删除未跟踪的目录。 -f命令用于强制运行。


这可能是CRLF问题造成的。

参见:为什么我应该使用核心。在Git中为true ?

使用这个来拉并强制更新:

git pull origin master
git checkout origin/master -f

我尝试了第一个答案:得分最高的git stash,但错误消息仍然弹出,然后我找到了这篇文章来提交更改,而不是stash“勉强提交”

错误信息最终消失了:

1:去添加.

2: git commit -m "这是一个额外的提交"

3: git checkout the-other-file-name

然后就成功了。希望这个答案能有所帮助。


对我来说,只有重新开始,努力工作。

承诺不是一个选项,因为没有什么可承诺的。

藏东西是不可能的,因为没有东西可以藏。

看起来它可能来自。git/info/exclude中的排除文件,并且git update-index——assume-unchanged <file>'ed了一些文件。


要在解决此问题时记录新创建的文件:

如果你有新创建的文件,你可以创建一个本地更改的补丁,拉入远程合并,并在远程合并完成后应用你的本地补丁,如下所示:

进行本地更改。(不要承诺)。为新创建的文件创建补丁需要分段(因为它们仍然无法跟踪)

转到添加 。

创建一个补丁来保存记录

Git diff——缓存> myppatch .patch

丢弃本地更改并删除新的本地文件

Git重置——很难

把变化

git pull

应用补丁

去应用mypatch.patch

Git将合并更改,并为未合并的更改创建.rej文件。

根据Anu的建议,如果你在应用补丁时有问题,试试:

Git apply——reject——whitespace=fix myppatch .patch 本回答git: patch does not apply详细讨论了这个问题

享受您在特性上的持续工作,完成后提交您的局部更改。


如果你正在使用Git扩展,你应该能够在工作目录中找到你的本地更改,如下所示:

如果您没有看到任何变化,可能是因为您在错误的子模块上。所以检查所有的项目与潜艇图标如下所示:

当你发现一些未提交的更改:

选择带有工作目录的行,导航到Diff选项卡,右键单击带有铅笔(或+或-)图标的行,选择重置以第一次提交或提交或隐藏或任何你想做的事情。


对我来说,这很有效:

Git重置——很难

然后

Git拉原点<*当前分支>

在那之后

Git checkout <*branch>


可能

git --rebase --autostash

将有助于


丢弃局部更改 使用git重置——很难


这解决了我的错误:

我在分支A上

git stash

移动到主分支:

git checkout master 
git pull*

回到我的分支,A

git checkout A 
git stash pop*

在使用reset之前,请考虑使用revert,这样您就可以随时返回。

https://www.pixelstech.net/article/1549115148-git-reset-vs-git-revert

根据要求

来源:https://www.pixelstech.net/article/1549115148-git-reset-vs-git-revert

Git重置vs Git恢复 sonic0002 2019-02-02 08:26:39

When maintaining code using version control systems such as git, it is unavoidable that we need to rollback some wrong commits either due to bugs or temp code revert. In this case, rookie developers would be very nervous because they may get lost on what they should do to rollback their changes without affecting others, but to veteran developers, this is their routine work and they can show you different ways of doing that. In this post, we will introduce two major ones used frequently by developers.

去重置 git 还原

它们的区别和对应的用例是什么?我们将在下面详细讨论它们。 git重置 假设我们有以下几个提交。

提交A和B是工作提交,但提交C和D是坏提交。现在我们想回滚提交B,并删除提交C和D。目前HEAD指向提交D 5lk4er,我们只需要指向HEAD提交B a0fvf8来实现我们想要的。 git reset命令的使用很简单。

git reset --hard a0fvf8

执行上述命令后,HEAD将指向提交B。

但是现在远程的原点仍然有HEAD点提交D,如果我们直接使用git push来推送更改,它不会更新远程repo,我们需要添加一个-f选项来强制推送更改。

git push -f

这种方法的缺点是,一旦重置完成,HEAD之后的所有提交都将消失。万一有一天我们发现有些提交吃了很好的,想要保留它们,那就太晚了。因此,许多公司禁止使用这种方法来回滚更改。

git恢复 git revert的用途是创建一个新的提交,该提交将恢复之前的提交。HEAD将指向新的还原提交。 对于上面的git重置的例子,我们需要做的只是还原提交D,然后还原提交C。

git revert 5lk4er
git revert 76sdeb

现在它创建了两个新的提交D'和C',

在上面的例子中,我们只有两个提交需要恢复,所以我们可以一个一个地恢复。但是如果有很多提交要恢复怎么办?我们可以还原一个范围。

git revert OLDER_COMMIT^..NEWER_COMMIT

这个方法不会有git重置的缺点,它会将HEAD指向新创建的还原提交,并且可以直接将更改推到远程而不使用-f选项。 现在让我们来看一个更难的例子。假设我们有三次提交,但错误的提交是第二次提交。

使用git reset回滚提交B不是一个好主意,因为我们需要保持提交C,因为它是一个好的提交。现在我们可以恢复提交C和B,然后再使用选择性提交C。

从上面的解释中,我们可以发现git reset和git revert之间最大的区别是git reset会通过删除提交后的所有更改来重置分支的状态到之前的状态,而git revert会通过创建新的恢复提交并保留原始提交来重置到之前的状态。建议在企业环境中使用git revert而不是git reset。 参考:https://kknews.cc/news/4najez2.html


% git状态 头部在5c分离 未为commit暂存的更改: (使用“git add…”来更新将要提交的内容) (使用“git restore…”来丢弃工作目录中的更改)


使用:

Git重置——很难

然后:

Git拉源主


在我的NestJS项目中,我在.env文件中遇到了类似的问题。

尝试了很多方法,包括本页上的方法。

最后,在剪贴板上复制。env的内容,删除文件,git拉起工作!

重新创建.env并将内容粘贴回来。

如果有多个文件,只需将它们临时移出git回购目录,然后在拉出更改后将它们移回。


如果只有一个文件在本地更新,并且您想要丢弃该文件中的更改,那么您可以执行以下操作——

// Pull latest activities-page.tsx from remote and discard local changes.
git checkout activities-page.tsx  
//Pull latest branch
git pull origin master

如果你在你的任何文件做了更改;

转到添加 。

然后;

Git commit -m "your message"

在此之后,你可以成功地从你的回购中获取或推入。