如何在不覆盖本地文件的情况下从远程拉取文件



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

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

有没有办法拉取但确保本地文件没有被遥控器覆盖?

嗯,是的,不是...

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

话虽如此,但做"正确的事"真的很容易......">

第 1 步:

git stash

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

第 2 步:

git pull

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

第 3 步:

git stash pop

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

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

这样事情会好得多 - 它可能会保留您的更改,而无需您进行任何实际工作,同时提醒您注意严重的问题。

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

git stash
git pull origin master
git stash pop

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

因此,

您已将本地更改提交到本地存储库。然后,为了在不更改本地文件的情况下对本地存储库进行远程更改,您可以使用 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 

现在,您可以在另一个分支中进行远程更改,并保持本地文件不变。

那么下一步是什么?您可以执行git merge,这将与git pull相同的效果(与上一个git fetch结合使用时(,或者,正如我所希望的那样,执行git rebase origin/master以将您的更改应用于origin/master之上,这为您提供了更清晰的历史记录。

所有其他答案仍然可能存在合并冲突。如果您真的不想处理冲突,并且只是简单地拉取但不覆盖本地文件,那么这样做的方法如下:

存储本地更改:

git stash

拉取所有内容(如果它给你冲突,就git reset --hard HEAD,你用藏匿处保存了你的更改(

git pull --force

现在强制应用您的藏匿处(没有冲突!

git checkout stash -- .

最新更新