【问题标题】:GIT - Cloning in non-empty directory with checking merge conflictsGIT - 在非空目录中克隆并检查合并冲突
【发布时间】:2018-05-23 13:01:01
【问题描述】:

我在 debian 服务器上有一个目录。 我创建了一个我想克隆的 git repo。这个 git repo 是这个目录的一个干净版本,它不包括所有非必要的文件来存储在我的 repo 中。

所以,我想将文件克隆到此目录中,但如果需要,我不想在没有“合并冲突”的情况下共同删除文件。

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

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

谢谢!

【问题讨论】:

  • 不要这样做!在 git reset origin/master 应该没问题之前保存你的工作
  • 什么意思?
  • git reset origin/master 应该没问题(你所有的更新都会出现在 git status 中)但是你的工作没有被保存。我建议您创建一个分支并执行 git status ; git add ;混帐提交;将工作保存在分支中后,查找诸如 git merge 之类的内容
  • 很好的解决方案,谢谢!

标签: git


【解决方案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 中,这样它们应该不会被跟踪。

对于仅在 repo 副本上的文件,它们将被添加到合并结果中。

对于两个位置相同的文件,合并将自动解决。

对于其他任何事情,您都会遇到标准的合并冲突。

一旦你解决了冲突,你应该有一个你想要的工作树状态。让我们有一个清晰的画面,让我们看看如果你完成合并会发生什么。

git add .
git commit

现在你有

x -- x -- x -- O <--(origin/master)
                \
            A -- M <--(master)

您可以推送它,以便master 显示更新以匹配您的本地状态(不包括您.gitignored 的文件)。这也将使提交 A 成为您可能不想要的原始历史记录的一部分。所以这里的另一个选择是

git reset --soft origin/master

您的本地更改仍将在索引和工作树中,但提交图现在看起来像

x -- x -- x -- O <--(origin/master)(master)

A -- M 

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

【讨论】:

  • 感谢回答,会试试的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多