我在GitHub仓库上有一个webhook触发了另一台服务器上的git pull,因此服务器上的存储库始终与推送到GitHub的内容同步。
有时,pull需要合并提交,但服务器版本永远不会被提交或更改。当我查看差异时,合并提交会显示最近几次提交的更改,这使得服务器版本看起来像是最新的,并且它正在尝试提取的内容是它的背后。
它运行此代码以下拉所有分支(可以改进)。但在这种情况下,唯一的分支是master
。
git fetch origin
for remote in $(git branch -r) ; do git checkout $(echo $remote | cut -d \'/\' -f2) && git pull origin $(echo $remote | cut -d \'/\' -f2); done
当我在服务器版本上运行git status
时,它表示本地分支在远程前面是XX。这些变化来自哪里?
答案 0 :(得分:1)
听起来您可能正在修改已经推送到GitHub的提交。有很多方法可以实现,但两个常见的方法是修改提交和重新定位。这些都可以与本地提交一起使用,但使用共享提交执行此操作通常会带来麻烦。
考虑一下GitHub上的简单存储库:
A---B---C [master]
如果开发人员决定修改提交哈希变更的提交C
,例如更改为D
。所以现在GitHub有上面列出的提交,但开发人员在本地有这个:
A---B---D [master]
当开发人员推送到GitHub时,推送将被拒绝,因为GitHub包含提交C
master
分支,但该提交不存在于开发人员的分支中。为了让GitHub接受更改,开发人员现在必须强制推送。
每当你发现自己强行推进Git时,你可能会做一些应该仔细考虑的事情。这应该是偶尔的行动,你只有在必要时才会这样做,而不是正常行为的一部分"工作流程。
现在GitHub已经强制更新为包含commit D
的新提交结构,当您尝试从GitHub进行pull
更新时,我们遇到完全相同的问题:其他开发人员的存储库副本和#39;机器和服务器无法彻底解决问题,因为它们包含提交C
,GitHub上不再存在提交。
我们可以通过不修改共享历史记录来避免此问题。而不是修改共享提交,请考虑添加新提交。您的历史记录现在可能包含
等消息但由于修改后的共享历史记录而无需处理因分支不同的分支,这是一个很小的代价。