GIT - 在非空目录中克隆并检查合并冲突

时间:2018-05-23 13:01:01

标签: git

我在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

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

谢谢!

1 个答案:

答案 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 

所以现在你可以重新提交。由于AMgc最终将从您的本地仓库中删除,并且永远不会成为远程历史记录的一部分;但是通过重新提交,您可以将更改添加到远程,以将其与本地目录(忽略的文件除外)同步。