关于github:如何在不提交的情况下同步两个不同的Git仓库?

How to sync two different Git repos without making a commit?

我能够使用"提取"和"签出"到我的母版并处理冲突(如果有),将文件从一个RepoA同步到RepoB。 但是这种方法使我对RepoB进行了"合并提交"。

没有生成提交ID的方法有什么办法吗?
我想安排所有提交,然后通过chron-task定期进行同步。

我还研究了git-daemon和提交后的钩子。 如果可以做到这一点,请提供一个例子。

回购的初始状态:
Initial state of Repos

应用合并后:
After applying merge

重置为最后一次提交后(创建File02.txt):
After resetting to last commit (Create File02.txt)


由于git存储和寻址数据的方式,给定的提交ID只能存储一棵特定的树-也就是说,一组目录包含一组文件,每个文件中包含一组特定的内容。

(从技术上讲,您可以说这是不正确的,但实际上,永远不会发生两个具有不同树的提交具有相同的提交哈希的情况。)

因此,在合并时,无论是否解决冲突,除非合并的结果与原始提交之一完全相同(通常仅在一个提交是另一个提交的祖先且允许快速转发时才会发生) ,必须创建一个新的提交。

因此,当您同步两个存储库时,如果其中包括同步分支(其中每个存储库包含另一个尚未看到的更改),则无法避免创建新的提交。

更新-在评论中,提出了一个后续问题:"可以重新设置基础以帮助更改提交历史记录,以便最后一次提交而不是最终的合并提交吗?"

尽管可以以多种方式解释该问题,但答案始终是"否"。如果所涉及的任何存储库已与其他用户共享,则搁置有关使用rebase的警告,它不会执行您似乎要求的操作。

首先,了解变基并不会改变提交的顺序。更改提交顺序是不可能的。当您进行交互式变基并更改待办事项列表的顺序时,发生的事情是创建了全新的提交(每个提交都有新的提交ID),以便以不同的顺序应用相同的更改。

实际上,默认情况下,您可能不会注意到这一点,但是原始提交仍保持在重新设置基准之前的位置。 (在进行这种类型的变基之前,请尝试标记HEAD,然后运行类似gitk --all的操作以查看结果。)

无法对提交进行重新排序的原因与不创建新的提交ID而无法合并更改的原因类似。有关提交的所有内容均编码在提交ID中。如前所述,其中包括它的树;它还包括父提交的ID(因此,可传递地包括导致当前提交的整个提交沿袭)。

因此,通常:

  • 如果您有一个存储库,并且在其中合并了以前没有配置的新更改,那么反映这些更改的每个提交都将具有一个以前在存储库中未看到的新ID。

  • 如果您有两个存储库,并且每个存储库包含彼此都不存在的更改,则反映了两个存储库中合并更改的每个提交都将是一个新提交,该提交具有新的ID,以前在任何一个存储库中均未看到。


您可以使用git pull --rebase,它将在远程头顶部重新建立本地提交。当然,您可能会遇到其他必须解决的冲突,但仍然不会有任何其他合并提交。您也可以git config pull.rebase true,以便始终通过git pull实现此目的。请注意rebase的后果,例如您之前不应该push ed任何rebase d。

相关的SO问题:

  • git fetch然后git rebasegit pull --rebase有什么区别?
  • 什么时候使用git rebase而不是git merge?
  • git pull VS git fetch git rebase


合并存储库后,只需将存储库的状态恢复到父存储库的最后一次提交,即可删除最后一个合并提交。

使用命令:

git log --format ="%H" -n 1 --->从父仓库获取最后的提交ID

git reset --hard fb62ef635b07afaf719ba15841579ed12e1224b0将Repo的状态恢复为先前的状态

fb62ef635b07afaf719ba15841579ed12e1224b0是来自先前状态的提交ID