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

Joe Isaacson 102 git github

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

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

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

Bob Gilmore.. 164

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

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

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

步骤1:

git stash

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

第2步:

git pull

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

第3步:

git stash pop

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

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

事情会以这种方式变得更好 - 它可能会保留您的更改而不需要您的任何实际工作,同时提醒您严重的严重问题.

  • 有时我处在一个我不想提交代码的位置,但是我希望将它保存在我的本地机器中,这些命令组对此非常有帮助. (9认同)
  • 为什么不只是`git commit`本地更改提供`git pull`? (5认同)
  • 如果您有多个文件,一些您想要覆盖的文件以及一些您不想覆盖的文件,这将无用.有没有办法告诉GIT忽略拉文件?为什么.gitignore只能用于推送,我完全不了解设计决策... (3认同)

Ryan Bigg.. 25

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

git stash
git pull origin master
git stash pop

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

  • 我已经在本地提交了这些更改,因此它说"没有本地更改可以保存" (4认同)

Penghe Geng.. 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

在这个时间点,如果你试图将你推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,这给你一个更清晰的历史.