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

我试图建立一个新的 git 回购到一个预先存在的远程回购。

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

是否有任何方法可以拉但确保本地文件不被远程覆盖?

174239 次浏览

您可以首先隐藏本地更改,然后拉取,然后弹出隐藏。

git stash
git pull origin master
git stash pop

任何重写远程更改的操作都会产生冲突,您必须手动解决这些冲突。

是的,也不是。

我知道你希望你的本地副本“覆盖”远程文件,但是,哦,伙计,如果有人用某种 与众不同方式修改了远程回收文件,而你只是 忽略他们的修改,并试图“强制”你自己的修改,甚至在可能的冲突中没有 寻找,那么,我为你(和你的同事)哭泣; -)

也就是说,尽管 真的很容易做“正确的事情... ...”

第一步:

git stash

在你们当地的回收站。这将保存您的本地更新到隐藏,然后恢复您的修改后的文件回到他们的预编辑状态。

第二步:

git pull

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

第三步:

git stash pop

这将合并您在步骤1中隐藏的修改版本和您在步骤2中提取的版本。如果一切顺利的话,那么你就会准备好了!

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

事情将工作出 很多更好的这种方式-它可能会保持您的变化没有任何真正的工作,您的一部分,同时提醒您的严重,严重的问题。

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

详细的例子:

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

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

origin存储库是这样的(有人提交了 test1) :

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

此时,git 会抱怨,并要求您在尝试将 test2推送到远程存储库时首先进行拉取。如果希望在不修改本地存储库的情况下查看 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 -- .