如何从远程拉文件而不覆盖本地文件?


112

我正在尝试为现有的远程仓库建立一个新的git仓库。

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

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

Answers:


181

好吧,是的,不是...

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

话虽如此,但是做“正确的事情……” 确实很容易。

第1步:

git stash

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

第2步:

git pull

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

第三步:

git stash pop

这会将您在步骤1中隐藏的修改后的版本与您在步骤2中提取的版本进行合并。如果一切顺利,那么您将大功告成!

另一方面,如果您在第2步中所做的操作与您的修改之间存在真正的冲突(由于其他人在此期间进行编辑),您将找到并被告知要解决它们。做吧

事情会解决很多这样更好-它可能会保持你的改变,而不需要您的任何实际工作,同时提醒你认真,严肃的问题。


5
为什么不只是git commit局部变化而已git pull
Don Cheadle

10
有时我不想提交代码,但是我想将其保存在本地计算机中,这些命令集对此很有帮助。
Vargan

3
如果您有多个文件,一些文件要被覆盖,而另一些文件不希望被覆盖,则此功能不起作用。没有办法告诉GIT在拉动时忽略文件吗?为什么.gitignore只适用于推送,我根本不了解设计决策……
Bobak Hashemi

25

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

git stash
git pull origin master
git stash pop

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


4
我已经在本地提交了这些更改,因此它说“没有要保存的本地更改”
Joe Isaacson

我认为,这是最好的策略。
Jimmy Obonyo Abor

13

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

此时,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 pull解释为两步git fetch / git merge
cdabel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.