How to sync two different Git repos without making a commit?
我能够使用"提取"和"签出"到我的母版并处理冲突(如果有),将文件从一个RepoA同步到RepoB。 但是这种方法使我对RepoB进行了"合并提交"。
没有生成提交ID的方法有什么办法吗?
我想安排所有提交,然后通过chron-task定期进行同步。
我还研究了git-daemon和提交后的钩子。 如果可以做到这一点,请提供一个例子。
回购的初始状态:
应用合并后:
重置为最后一次提交后(创建File02.txt):
-
"处理冲突"是指创建有关如何解决冲突的数据。 此数据必须存储在某个位置,并且该位置是合并提交。 即使没有冲突,合并提交也是使两个不同的分支再次收敛以合并两个变更集的原因。 因此,在一般情况下,您无法避免合并提交。
-
可以重新设置基础以帮助更改提交历史记录,以便最后一次提交而不是最终的合并提交结束吗?
-
@PratyushRaizada是的,最简单的方法就是简单地使用git pull --rebase,有关详细信息,请参见我的答案。
-
这两个"初始提交"是否具有不同的哈希值? 然后可以观察到所观察到的行为,但是此注释空间太狭窄而无法解释;)
-
两个"初始提交"(A和B)确实具有不同的哈希,因此git必须进行合并
-
好吧,现在我明白了,那就是为什么它给出了一个额外的合并提交,但是当我进行重置时,它用B覆盖了As文件。谢谢!
由于git存储和寻址数据的方式,给定的提交ID只能存储一棵特定的树-也就是说,一组目录包含一组文件,每个文件中包含一组特定的内容。
(从技术上讲,您可以说这是不正确的,但实际上,永远不会发生两个具有不同树的提交具有相同的提交哈希的情况。)
因此,在合并时,无论是否解决冲突,除非合并的结果与原始提交之一完全相同(通常仅在一个提交是另一个提交的祖先且允许快速转发时才会发生) ,必须创建一个新的提交。
因此,当您同步两个存储库时,如果其中包括同步分支(其中每个存储库包含另一个尚未看到的更改),则无法避免创建新的提交。
更新-在评论中,提出了一个后续问题:"可以重新设置基础以帮助更改提交历史记录,以便最后一次提交而不是最终的合并提交吗?"
尽管可以以多种方式解释该问题,但答案始终是"否"。如果所涉及的任何存储库已与其他用户共享,则搁置有关使用rebase的警告,它不会执行您似乎要求的操作。
首先,了解变基并不会改变提交的顺序。更改提交顺序是不可能的。当您进行交互式变基并更改待办事项列表的顺序时,发生的事情是创建了全新的提交(每个提交都有新的提交ID),以便以不同的顺序应用相同的更改。
实际上,默认情况下,您可能不会注意到这一点,但是原始提交仍保持在重新设置基准之前的位置。 (在进行这种类型的变基之前,请尝试标记HEAD,然后运行类似gitk --all的操作以查看结果。)
无法对提交进行重新排序的原因与不创建新的提交ID而无法合并更改的原因类似。有关提交的所有内容均编码在提交ID中。如前所述,其中包括它的树;它还包括父提交的ID(因此,可传递地包括导致当前提交的整个提交沿袭)。
因此,通常:
-
可以重新设置基础以帮助更改提交历史记录,以便最后一次提交而不是最终的合并提交结束吗?
-
简短的回答:不。病情长了答案。
-
Ive提供了更新以尝试解决此问题。如果您想进一步了解细节,或者我认为我误解了这个问题,建议您尝试以下操作:绘制一个图表,显示合并前每个仓库的内容,并绘制一个图表,显示您希望最终仓库的外观。将其张贴出来,我们可以直接解决它是否可能,如果可以的话,以及为什么不可以。
-
谢谢我不久后
-
嗨,马克!我找到了解决删除提交的方法,方法是将存储库恢复到最后一个提交者提交,现在我可以使用命令" git reset --hard fb62ef635b07afaf719ba15841579ed12e1224b0"来忽略合并提交。
-
fb62ef635b07afaf719ba15841579ed12e1224b0是合并前的最后一个提交的提交ID,所有以前的提交都存在,没有合并问题
-
嗯...好吧,您可以在合并之前重置为,但是在那种情况下,您会忽略其他仓库中的所有更改...所以,如果您不关心其他仓库,为什么首先尝试同步它们变化?
-
实际上,即使我也对这种行为感到困惑,但是不知何故,提交并没有被删除。
-
假设RepoA a在时间T1,T2,T3的提交为c1,c2,c3,现在我将它们同步到RepoB c1-T1,c2-T2,c3-T3,m-T4,这里m是我git reset时的合并提交只删除m-T4即可提交c3,其余所有提交均应按需保留。就连我也对此感到困惑
-
@PratyushRaizada-如果m是合并,则它将c1-c2-c3提交行与另一行提交合并。如果没有其他提交行,则m不是合并。那么:是什么让您认为如果重置为c3,您将失去其他提交吗? (你是。)
-
c3是最后一次提交(按时间),如果我重置为该提交,则所有先前的提交都将在第二个存储库中保持不变。由于ReadMe.md文件中的更改,即将提交合并提交。当我将其硬重置为最后一次提交时,它实际上也会覆盖该文件。唯一的问题是我执行git merge命令时显示的额外合并提交。重置后,如果合并提交,将忽略。
-
imageshack.com/i/pnOgarWip --->仓库的初始状态imageshack.com/i/poRkcCcqp --->应用合并后imageshack.com/i/pnAkkqJtp --->重置为最后一次提交后(创建File02.txt )
-
在图2中,出现了合并提交,后来在第三个中,Ive添加了另一个文件并再次合并,但是他的时间Ive也将其重置为RepoA中的最后一个提交,即。 (创建File02.txt)
您可以使用git pull --rebase,它将在远程头顶部重新建立本地提交。当然,您可能会遇到其他必须解决的冲突,但仍然不会有任何其他合并提交。您也可以git config pull.rebase true,以便始终通过git pull实现此目的。请注意rebase的后果,例如您之前不应该push ed任何rebase d。
相关的SO问题:
-
git fetch然后git rebase和git pull --rebase有什么区别?
-
什么时候使用git rebase而不是git merge?
-
git pull VS git fetch git rebase
-
嗯...我想我对问题的理解有所不同,但是根据您真正想要实现的目标,这可能是一个很好的解决方案。
-
@MarkAdelsberger是的,不幸的是,没有一些示例历史记录,这个问题还不是很清楚。希望我们的答案对其他人都有用:)
-
@TobiasKienzler Ive上传了一些图像作为示例来显示问题。您可以在马克斯答案中找到它。希望它能澄清。 (这是使用该平台的新手,否则我可以将其发布在问题本身中)
-
@PratyushRaizada您可以编辑您的问题,还有图像上传功能-噢,我知道,您首先需要代表,不要担心那会很快发生。我会替你编辑。
合并存储库后,只需将存储库的状态恢复到父存储库的最后一次提交,即可删除最后一个合并提交。
使用命令:
git log --format ="%H" -n 1 --->从父仓库获取最后的提交ID
git reset --hard fb62ef635b07afaf719ba15841579ed12e1224b0将Repo的状态恢复为先前的状态
fb62ef635b07afaf719ba15841579ed12e1224b0是来自先前状态的提交ID
-
可以使用HEAD^代替上一个提交ID,而不是固定的提交ID,例如HEAD~4表示4次提交之前的提交。但是硬重置通常是危险的过程,会使您丢失所有未提交的更改。您可能需要考虑使用rebase。或先使用git stash。
-
我考虑过考虑HEAD ^,但是如果没有提交,则一次真正的提交将被删除。感谢您介绍git stash!
-
不客气-但请注意,您的回答不仅意味着要失去合并提交,而且还意味着您自上次拉取以来的所有提交!幸运的是,git确实保留了刷新记录,因此如果您尽快采取行动,您可以再次找到这些提交。