首页 > 解决方案 > 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

但我要问的是,这是否只是用我的仓库中的这些文件的版本替换现有文件(在服务器上)?或者如果有冲突,它会告诉我吗?

谢谢 !

标签: git

解决方案


该过程部分但不完全适合您的用例。考虑这种方法:

# ... 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,并且永远不会成为远程历史记录的一部分;但是通过重新提交,您确实将更改添加到远程,以将其与本地目录(被忽略的文件除外)同步。


推荐阅读