如何在不进行提交的情况下同步两个不同的Git仓库?
我能够使用“提取”和“签出”将文件从一个RepoA同步到RepoB,并处理冲突(如果有的话)。 但是这种方法导致我在RepoB上进行“合并提交”。
有没有办法做到这一点, 而没有生成该提交ID? 我想安排所有提交,然后通过时间任务定期同步。
我还研究了git-daemon和post-commit钩子。 如果可以做到这一点,请举个例子。
Repos的初始状态:
应用合并后:
重置为上次提交后(创建File02.txt):
由于git存储和访问数据的方式,给定的提交ID只能存储一个特定的树 - 也就是说,一组目录包含一组文件,每个文件中包含一组特定的内容。
(从技术上讲,你可以争辩说这不是真的,但实际上它不会发生两次使用不同树的提交具有相同的提交散列。)
所以当你合并时,不管你是否解决冲突,除非合并的结果与原始提交完全相同(通常只有当一个提交是另一个提交的祖先并且允许快进时才发生) ,必须创建一个新的提交。
所以,当你同步两个仓库时,如果包括同步分支,其中每个仓库都包含另一个仓库尚未见过的更改,则不可能避免创建新的提交。
更新 - 在评论中,提出了一个后续问题:“可以通过rebase帮助修改提交历史,以最后一次提交而不是最终的合并提交结束吗?”
虽然这个问题可以用几种方式来解释,但答案无论如何都是“不”。 如果任何涉及的存储库与其他用户共享,那么不要使用rebase的警告,否则它不会执行您似乎要求的内容。
首先,了解rebase不会改变提交的顺序。 改变提交顺序是不可能的。 当您执行交互式重新绑定并更改待办事项列表的顺序时,会发生什么情况是创建了全新的提交(每个提交都有一个新的提交ID),以便按不同的顺序应用相同的更改。
实际上,默认情况下您可能没有注意到这一点,但原始提交仍然保留在rebase之前的位置。 (在做这种类型的rebase之前,尝试标记HEAD,然后运行gitk --all
类的东西 - 以查看结果。)
您无法重新排序提交的原因类似于无法创建新提交ID而无法在更改中合并的原因。 关于提交的所有内容都在提交ID中编码。 包括我之前提到的树; 它还包含父提交的ID(因此,传递性地,导致当前提交的整个提交谱系)。
一般来说:
如果你有一个回购协议,并且你在之前并入了新的更改,那么每一次反映这些更改的提交都会有一个以前在回购协议中看不到的新ID。
如果您有两个仓库,并且每个仓库都包含不在另一个仓库中的更改,那么反映两者合并更改的每个提交都将是一个新的提交,其中有一个以前在任何一个仓库中都没有出现的新标识。
你可以使用git pull --rebase
,它将重定位你在远程头上的本地提交。 您当然可能遇到需要解决的其他冲突,但是您仍然不会有任何其他合并提交。 你也可以将git config pull.rebase true
,以便始终通过git pull
实现此目的。 尽管如此,你应该意识到rebase
的后果,例如你之前不应该push
任何rebase
d。
相关SO问题:
git fetch
然后git rebase
和git pull --rebase
什么git pull --rebase
? 合并回购后,最后一次合并提交可以通过简单地将回购的状态恢复到父回购的最后一次提交来消除。
使用命令:
git log --format =“%H”-n 1 --->从父仓库获取最后一个提交ID
git reset --hard fb62ef635b07afaf719ba15841579ed12e1224b0将Repo状态恢复到之前的状态
fb62ef635b07afaf719ba15841579ed12e1224b0是来自之前状态的提交ID
链接地址: http://www.djcxy.com/p/45125.html上一篇: How to sync two different Git repos without making a commit?
下一篇: How to use `git merge` to achieve same result as `git pull`?