我在debian服务器上有一个目录。 我创建了一个我想要克隆的git repo。这个git repo是这个目录的一个干净版本,它不包括存储在我的repo上的所有非necesserary文件。
所以,我想将文件克隆到这个目录中,但我不想删除共同的文件而没有一种"合并冲突"如果需要的话。
我在this post上看到了这个解决方案:
git init
git remote add origin PATH/TO/REPO
git fetch
git reset origin/master # this is required if files in the non-empty directory are in the repo
git checkout -t origin/master
但我要问的是,这只是用我的仓库中的那些文件的版本替换现有文件(在服务器上)吗?或者它会告诉我是否有冲突?
谢谢!
答案 0 :(得分:1)
该程序部分(但不完全)对您的用例是正确的。考虑这种方法:
# ... in the local directory
git init
你提到你的本地文件不应该是'在回购中 - 并且可能还没有在回购中。因此,创建一个列出这些文件的.gitignore
文件。然后
git add .
git commit
现在您有一个当前的工作树状态的提交。
A <--(master)
然后
git remote add origin URL/OF/REMOTE/REPO
(请注意,如果REPO在本地文件系统上,则URL / OF / REMOTE / REPO可能是PATH / TO / REPO;但即便如此,我通常也使用file://
URL。)
git fetch
现在您可以访问repo的历史记录了。也许它看起来像
x -- x -- x -- O <--(origin/master)
A <--(master)
下一步是合并远程更改。
git merge --allow-unrelated-histories origin/master
仅适用于您本地副本的文件......好吧,您将它们放在.gitignore
中,以便它们保持未跟踪状态。
对于仅在回购副本上的文件,它们将被添加到合并结果中。
对于两个位置相同的文件,合并将自动解析。
除此之外,您还会遇到标准的合并冲突。
一旦解决了冲突,就应该有一个像你想要的工作树状态。我们有一个清晰的图片,让我们来看看如果你完成合并会发生什么。
git add .
git commit
现在你有了
x -- x -- x -- O <--(origin/master)
\
A -- M <--(master)
您可以推送它,以便master
显示与您的本地状态匹配的更新(不包括您.gitignore
d)的文件。这也将使A
部分原始历史记录成为您可能不需要的部分。所以这里的另一个选择是
git reset --soft origin/master
您的本地更改仍将在索引和工作树中,但提交图现在看起来像
x -- x -- x -- O <--(origin/master)(master)
A -- M
所以现在你可以重新提交。由于A
,M
和gc
最终将从您的本地仓库中删除,并且永远不会成为远程历史记录的一部分;但是通过重新提交,您可以将更改添加到远程,以将其与本地目录(忽略的文件除外)同步。