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

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签出文件名

其他回答

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

你有三个选择:

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

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

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

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命令用于强制运行。

在拉之前要求提交

git stash git pull pull origin << branch >

如有需要:

Git stash应用

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

变基

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

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拉”覆盖本地文件?

在使用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