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

时间:2013-10-07 02:53:42

标签: git github

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

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

有没有办法拉,但要确保本地文件不会被遥控器覆盖?

3 个答案:

答案 0 :(得分:141)

嗯,是的,没有......

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

尽管如此,真的很容易做出“正确的事情......”

第1步:

git stash

在您当地的回购中。这样可以将您的本地更新保存到存储中,然后将修改后的文件恢复到预编辑状态。

第2步:

git pull

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

第3步:

git stash pop

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

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

事情会以这种方式更好地实现很多 - 它可能会保留您的更改而不需要您做任何实际工作,同时提醒您注意严重的问题。

答案 1 :(得分:20)

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

git stash
git pull origin master
git stash pop

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

答案 2 :(得分:11)

因此,您已将本地更改提交到本地存储库。然后,为了在不更改本地文件的情况下对本地存储库进行远程更改,您可以使用git fetch。实际上git pull是一个两步操作:非破坏性git fetch后跟git merge。有关详细信息,请参阅What is the difference between 'git pull' and '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/masterorigin/master之上应用您的更改,这会为您提供更清晰的历史记录。

相关问题