140

我正在尝试为预先存在的远程仓库设置一个新的 git 仓库。

我希望我的本地文件覆盖远程仓库,但 git 说我首先必须将这些远程文件拉入并合并它们。

有什么方法可以拉,但要确保本地文件不会被远程覆盖?

4

4 回答 4

225

嗯,是的,不是……

我知道您希望您的本地副本“覆盖”远程中的内容,但是,哦,伙计,如果有人以某种不同的方式修改了远程仓库中的文件,而您只是忽略他们的更改并尝试“强制”你自己的改变甚至没有考虑可能的冲突,好吧,我为你(和你的同事)哭泣;-)

尽管如此,做“正确的事……”真的很容易。

第1步:

git stash

在您当地的仓库中。这会将您的本地更新保存到存储中,然后将修改后的文件恢复到其预编辑状态。

第2步:

git pull

获取任何修改版本。现在,希望这不会得到您担心的文件的任何新版本。如果没有,那么下一步将顺利进行。如果是这样,那么你有一些工作要做,你会很高兴你做了。

第 3 步:

git stash pop

这会将您在第 1 步中隐藏的修改版本与您在第 2 步中提取的版本合并。如果一切顺利,那么您将一切就绪!

另一方面,如果您在第 2 步中提取的内容与您的修改之间存在真正的冲突(由于其他人在此期间进行了编辑),您会发现并被告知解决它们。去做吧。

通过这种方式,事情会变得更好——它可能会在您没有任何实际工作的情况下保留您的更改,同时提醒您注意严重、严重的问题。

于 2013-10-07T03:06:16.023 回答
30

您可以先存储本地更改,然后拉取,然后弹出存储。

git stash
git pull origin master
git stash pop

任何覆盖远程更改的内容都会产生冲突,您必须手动解决。

于 2013-10-07T02:59:33.307 回答
18

因此,您已将本地更改提交到本地存储库。然后,为了在不更改本地文件的情况下远程更改本地存储库,您可以使用git fetch. 实际上git pull是一个两步操作:一个非破坏性git fetch的,然后是一个git merge. 请参阅“git pull”和“git fetch”有什么区别?进行更多讨论。

详细示例:

假设您的存储库是这样的(您已经进行了更改test2

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

origin存储库是这样的(其他人已提交test1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

此时,如果您尝试将您的推test2送到远程存储库,git 会抱怨并要求您先拉取。如果您想在不修改本地存储库的情况下查看 test1 是什么,请运行以下命令:

$ git fetch

您的结果本地存储库将是这样的:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

现在您在另一个分支中进行了远程更改,并且您保持本地文件完好无损。

那么接下来呢?您可以执行 a git merge,这将与git pull(与之前的 结合使用时git fetch)具有相同的效果,或者,我更喜欢执行 agit rebase origin/master以将您的更改应用到 之上origin/master,这将为您提供更清晰的历史记录。

于 2013-10-07T03:44:45.333 回答
2

所有其他答案仍然可能存在合并冲突。如果您真的不想处理冲突,而只是拉动而不是用更改覆盖本地文件,那么这样做的方式是这样的:

存储本地更改:

git stash

拉取所有内容(如果它给您带来冲突git reset --hard HEAD,请使用 stash 保存您的更改)

git pull --force

现在强制应用你的存储(没有冲突!)

git checkout stash -- .
于 2021-08-21T13:07:09.560 回答