如何在不提交的情况下同步两个不同的Git存储库?

时间:2017-03-08 13:36:19

标签: git github

我能够将文件从一个 RepoA 同步到 RepoB ,使用'fetch'和'checkout'到我的主人并处理冲突(如果有的话)。但这种方法让我在RepoB上进行“合并 - 提交”。

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

我还研究了git-daemon和post-commit钩子。如果可以这样做,请提供一个示例。

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

申请合并后:
After applying merge

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

3 个答案:

答案 0 :(得分:2)

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

(从技术上讲,你可以说这不是真的,但实际上不会发生两个不同树的提交都有相同的提交哈希值。)

因此,当您合并时,无论您是否解决冲突,除非合并的结果与原始提交之一完全相同(这通常仅在一次提交是另一次提交的前辈和快进时发生)允许),必须创建一个新的提交。

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

更新 - 在评论中,提出了一个后续问题:"可以通过rebase帮助更改提交历史记录,以便以最后一次提交结束而不是最终合并提交?"

虽然这个问题可以通过几种方式解释,但无论如何答案都是" no"。如果所涉及的任何存储库与其他用户共享,请不要使用有关使用rebase的警告,否则它将无法执行您似乎要求的操作。

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

事实上,默认情况下您可能不会注意到这一点,但原始提交仍然保留在rebase之前的位置。 (尝试在执行此类型的rebase之前标记HEAD,然后运行类似gitk --all的内容以查看结果。)

您无法重新提交提交的原因类似于您无法在不创建新提交ID的情况下合并更改的原因。关于提交的 Everything 在提交ID中编码。这包括我之前提到过的树;它还包括父提交的ID(因此,传递上,导致当前提交的整个提交谱系)。

总的来说:

  • 如果你有一个仓库,并且你在其中加入了以前没有contian的新变更,那么每个反映这些变化的提交都会有一个以前在仓库中看不到的新ID。

  • 如果您有两个repos,并且每个repos都包含不在另一个中的更改,那么反映两者的合并更改的每个提交都将是一个新的提交,其中包含之前未在任何repo中看到的新ID

答案 1 :(得分:1)

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

相关的SO问题:

答案 2 :(得分:-1)

合并repo后,只需将Repo的状态恢复到父repo的最后一次提交即可删除最后一次merge-commit。

使用命令:

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

git reset --hard fb62ef635b07afaf719ba15841579ed12e1224b0 将Repo的状态恢复到以前的状态

fb62ef635b07afaf719ba15841579ed12e1224b0是先前状态的提交ID