将存储库的一部分合并到我的存储库中

Merging part of a repository into my repository

我有一个存储库,我想将另一个存储库的 master 分支添加到我的,所以我这样做了:

git remote add upstream repo_link
git pull upstream master --allow-unrelated-histories

然后我推到原点就是这样。

现在,我想让它保持最新,但又不想丢失我的更改,所以我过滤了我拥有的文件 created/modified,并以此获取作者的电子邮件(然后使用 python 或 bash)

git ls-tree -r main --name-only
git log -n 1 --pretty=format:%ae -- file_iterator

我从其他存储库中拉取...

git pull upstream maaster -X theirs

然后,我重置了我上面检查电子邮件得到的文件,就像这样...

git reset origin/HEAD -- myfile_iterator

可以正常工作,但是有一个大问题:myfiles 必须再次提交,为什么?它们是完全相同的文件。我不想修改 myfiles 的历史记录,我想让 myfiles 保持不变 always.

据我了解,reset 下载给定分支、repo 等中给定提交的文件,使它像一个未修改的文件,所以我不明白为什么它要求我提交又来了。

是否有更好的方法来实现这一点?基本上我想要的是“及时冻结”那些我修改过的文件,其他所有文件,从外部存储库中提取。我澄清一下,我刚开始使用 git,所以可能有更好的方法。

The relationship is basically me modifying that project, I know I can do a fork or something like that, but I don't want to lose commit history, and I don't want to start a new repository either, due to "watchs", forks, etc. I originally made a new repository instead of a fork because I hardly knew anything about git

您可能认为您正在让它变得更容易,但您正在努力 Git 并以艰难的方式做到这一点。 git reset 处理不相关的历史记录和奇特的合并都是非常先进的,对于您正在做的事情来说完全没有必要。

Now, I want to keep it up to date, but without losing my changes, so I filter the files that I have created/modified...

更改通常涉及许多文件并且需要所有这些更改才能工作。排除他们对您接触过的任何文件的更改可能会破坏代码。

您不需要做任何花哨的事情,这就是合并的目的。将您的代码与他们的代码合并将使他们的更改与您的更改交织在一起。如果你们都更改相同的代码,就会发生冲突。矛盾不能Git不能给你解决。如果你让他们离开 --ours 或 --theirs 你很可能会破坏代码。您必须考虑每个冲突以及如何解决它们。

None 这是必要的,这就是合并的目的。 git pull 只是一个 git fetch 和一个 git merge,所以 git pull 应该做正确的事情。


保持简单。 git clone 项目。做一个分支。在那个分支做你的工作。当您想更新 git fetch 以从上游项目获取最新版本,然后 git merge origin/master 将他们的工作合并到您的分支时。

  • git fetch origin
  • git merge origin/master

(您可以像 git pull 一样执行此操作,但是在您学习的过程中最好执行这两个步骤以查看它们的作用。)

在分支机构完成所有工作。只有 git pull 在 master 中才能使您的本地版本保持最新。将您的所有工作与他们的分开是很重要的。

一旦您对此感到满意,使用 Github 叉子就不会复杂得多。 Github has good documentation, read through it. Pro Git也不错

关于具体问题。


*reset downloads the file of the given commit in the given branch, repo, whatever...

git reset 很复杂。它做了很多不同的事情。

首先,git reset 不下载任何东西。 Git 从不 未经您的同意就与网络对话。三个基本网络命令是 git fetchgit pushgit pull(执行 git fetch)。其他都是本地的。

making it like an unmodified file so I don't understand why it asks me to commit it again.

它不是未修改的。有点乱。

git reset origin/HEAD -- myfile_iterator

这只会影响暂存区(东西你 git add)。它不会更改工作树(实际文件)或提交。它相当于新的 git restore --source origin/HEAD --staged myfile_iterator.

您剩下 origin/HEAD 版本的 myfile_iterator 和磁盘上的 myfile_iterator 版本。如果 origin/HEAD 中的 myfile_iterator 与您的 HEAD 中的版本(即您最后一次提交)不同,它将显示为分阶段更改。

使用 git reset 需要对工作树、暂存区、HEAD 和提交历史有深入的了解。暂时不要惹它。请改用 git restore

注意:origin/HEAD 不一定等同于 origin/masterorigin/HEAD 可以是任何东西。

但这一切都是不必要的。