修改已经推送到远程的提交

时间:2015-03-11 16:14:35

标签: git

重现的步骤:

  1. 在本地进行更改并提交。分配了新的SHA1哈希 提交。
  2. 按下遥控器。这时,本地和远程完全进入 同步和HEAD SHA1在两个地方都是相同的。
  3. 现在进行一项功能上属于同一更改的新更改 如上1.和git commit --amend它而不是它自己的 承诺。这会更改本地SHA1。
  4. 此时,git status通过一次提交报告本地和远程都在彼此之前,因为它无法告诉最新的本地提交建立在&#之上。 39;遥控器上的HEAD。对于delta目的,本地和远程的HEAD是两个不同的提交(而不是知道本地建立在远程上的东西之上),而共同的祖先是HEAD~1。这会引起很多麻烦,因为它(AFAIK)需要合并。

    有没有办法让git跟踪同一个更改的不同提交(我认为应该很容易记录,以便在执行git commit --amend时了解历史记录),这样就可以推送对远程的增量更改无需先合并?

2 个答案:

答案 0 :(得分:2)

如果你搞乱了本地提交历史记录(这正是--amend所做的那样),你的本地和远程历史记录将会分歧并且不兼容。解决此问题的唯一合理方法是git push --force

通常认为避免更改提交是一种好习惯,特别是在推送之后。如果你想拥有一个可以逐步推送的正确差异树,你将不得不在这些中使用分支和提交,单独推送它们,并仅在需要合并版本时合并它们。修改提交会有效地删除旧提交并插入一个新提交,因此可追溯;它非常不合适。

答案 1 :(得分:0)

来自git commit --amend的{​​{3}}:

  

您需要小心这项技术,因为修改了提交的SHA-1。这就像一个非常小的变形 - 如果你已经推动它,不要修改你的最后一次提交。

Git的制造商警告我们一旦被推动就要避免修改提交,所以我们明智地跟风。

如上所述,如果您坚持修改提交,则必须使用git push --force更新遥控器。但是,如果你这样做,你就冒着给已经拉过遥控器的人造成问题的风险。

作为修改已推送的提交的替代方法,您可以简单地为更改创建一个新的单独提交。它可能不像做amend那样性感,但它会使事情更加清晰。