git - GIT - 在非空目录中克隆并检查合并冲突
问题描述
我在 debian 服务器上有一个目录。我创建了一个我想克隆的 git repo。这个 git repo 是这个目录的一个干净版本,它不包括所有非必要的文件来存储在我的 repo 中。
所以,我想将文件克隆到这个目录中,但是如果需要,我不想在没有一种“合并冲突”的情况下共同删除文件。
我在这篇文章中看到了这个解决方案:
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
但我要问的是,这是否只是用我的仓库中的这些文件的版本替换现有文件(在服务器上)?或者如果有冲突,它会告诉我吗?
谢谢 !
解决方案
该过程部分但不完全适合您的用例。考虑这种方法:
# ... 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
因此它们应该保持不被跟踪。
对于仅在 repo 副本上的文件,它们将被添加到合并结果中。
对于两个位置相同的文件,合并将自动解析。
对于其他任何事情,您都会遇到标准的合并冲突。
一旦你解决了冲突,你应该有一个你想要的工作树状态。为了让我们有一个清晰的画面,让我们看看如果你完成合并会发生什么。
git add .
git commit
现在你有
x -- x -- x -- O <--(origin/master)
\
A -- M <--(master)
您可以推送它,以便master
显示更新以匹配您的本地状态(不包括您的文件.gitignore
)。这也将使提交A
成为您可能不想要的原始历史记录的一部分。所以这里的另一个选择是
git reset --soft origin/master
您的本地更改仍将在索引和工作树中,但提交图现在看起来像
x -- x -- x -- O <--(origin/master)(master)
A -- M
所以现在你可以重新提交。 A
并且M
最终会从您的本地仓库中删除gc
,并且永远不会成为远程历史记录的一部分;但是通过重新提交,您确实将更改添加到远程,以将其与本地目录(被忽略的文件除外)同步。
推荐阅读
- python - 不支持的操作数类型和不可排序的类型错误 python 3.7
- angular - 注入依赖或声明依赖标签:1)离子
- bash - 将特殊字符从标准输入捕获到 shell 变量
- javascript - 如何撤消“toString()”函数
- python - 在VS Code中运行或调试python代码时可以重定向stderr吗
- python-3.x - sklearn决策树的BFS遍历
- python - 遍历 Django 模板中的嵌套字典
- c# - 如何使用 MS.DI 和 .NET Core 从静态方法重构为依赖注入?
- java - 配置比较器
- sql - 合并oracle更新值但不插入,也不给出错误版本11g