Git 用上游历史重写起源历史?

Git 用上游历史重写起源历史?,git,Git,我在一个大型团队中工作,该团队定期挤压对上游的承诺。在这一点上,我的原点的历史与上游有很大的不同,唯一能“同步”它们的方法就是重置到上游并强制推送到原点 有没有办法用上游“同步”或重写我的源代码的历史记录,以摆脱我的“迷你”提交,并用上游的压缩提交替换它们?在git中有几种方法可以做到这一点-我将尝试解释其中一种。假设您正在处理一个名为bug\u fix的本地分支。您应该能够通过执行以下操作恢复与上游的同步: 创建一个新的分支来解决bug: git checkout -b temp_bug_fi

我在一个大型团队中工作,该团队定期挤压对上游的承诺。在这一点上,我的原点的历史与上游有很大的不同,唯一能“同步”它们的方法就是重置到上游并强制推送到原点


有没有办法用上游“同步”或重写我的源代码的历史记录,以摆脱我的“迷你”提交,并用上游的压缩提交替换它们?

在git中有几种方法可以做到这一点-我将尝试解释其中一种。假设您正在处理一个名为
bug\u fix
的本地分支。您应该能够通过执行以下操作恢复与上游的同步:

  • 创建一个新的分支来解决bug:

    git checkout -b temp_bug_fix
    
  • 回到原来的
    bug\u修复
    分支,并将
    HEAD
    重置为本地分支与上游同步的点。假设这是10次提交之前,命令将是:

    git checkout bug_fix
    git reset --hard HEAD~10
    
  • 从上游提取所有新更改。这将使
    bug\u fix
    origin

    git pull origin <upstream_branch>
    
  • 现在已经同步,您可以正常地推送到上游(无需使用
    -f

    git推送原点
    
  • 这个答案假设您的所有更改都是在其他人完成所有“迷你”提交后进行的


    我很想知道你们当地的分支机构最初是如何进入这个州的。标准实践是,开发人员应该在推送到源代码之前压缩他们的提交。一旦本地分支被合并到上游,任何人都不应该使用强制推送来更改历史记录——这只会带来麻烦。

    听起来你需要git rebase。我个人每天早上都会拉下所有的分支,然后将我的开发分支重新放在master上。在合并到master之前和代码审查之后,我会在推之前挤压我分支上的所有提交。我仍然必须进行强制推,以使推落地,否则,它会要求我在再次推之前进行git pull,因为当前分支的尖端在遥控器后面(即使我先做了拉)。如果我拉,我会得到大量的合并冲突,数百个。这就是为什么我问是否可以“重置”/“重新开始”该分支,完全重写历史记录,以便将来不会发生这种情况。理想情况下,如果按照上述步骤进行操作,就不会发生冲突。如果每次推送时仍存在问题,则可以删除本地分支(前提是您已经将所有本地更改推送到上游,并且没有本地更改),并创建一个跟踪原始分支的新本地分支。这将有效地帮助您“重置”/重新开始。
    git cherry-pick <you_commit_SHA>
    
    git push origin <upstream_branch>