Git pull需要合并但不需要本地更改

时间:2014-06-27 21:26:03

标签: git version-control merge fetch

我在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。这些变化来自哪里?

1 个答案:

答案 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上不再存在提交。

我们可以通过不修改共享历史记录来避免此问题。而不是修改共享提交,请考虑添加新提交。您的历史记录现在可能包含

等消息
  • 添加新功能X
  • 糟糕,修复功能X中的简单错误

但由于修改后的共享历史记录而无需处理因分支不同的分支,这是一个很小的代价。