Git 意外合并;“释放”;分为;大师;

Git 意外合并;“释放”;分为;大师;,git,Git,最近,我犯了一个错误,将用于主分支的内容提交到发布分支中,更糟糕的是,我将发布分支合并到主分支中 我在发布分支上提交了未合并到主分支中的内容,因为它们仅用于发布 下面是两个图表,显示了错误和我实际想要实现的目标,即执行针对master对master的提交,并避免将release合并到master中。 请注意,我在v0.2之后并没有只进行一次提交,而是多次提交,这只是为了说明 错误 应该是怎样的 这是您的图表,突出显示了“M”和“A”: previous corr

最近,我犯了一个错误,将用于主分支的内容提交到发布分支中,更糟糕的是,我将发布分支合并到主分支中

我在发布分支上提交了未合并到主分支中的内容,因为它们仅用于发布

下面是两个图表,显示了错误和我实际想要实现的目标,即执行针对master对master的提交,并避免将release合并到master中。 请注意,我在v0.2之后并没有只进行一次提交,而是多次提交,这只是为了说明

错误

应该是怎样的
这是您的图表,突出显示了“M”和“A”:

                previous correct state for Master
                v
Master:   *-----M------*
           \     \    /
Release:    *--*--*--A
                  ^  ^
               v0.2  accidental commit
您可以在本地“修复”历史记录,并使用
push--force
发布它

如果这是一个共享存储库,请首先与您的同事确认他们是否有基于“错误”提交的工作,并通知他们在您的操作后必须重新应用/重定工作基础

  • 要将
    主机设置为您期望的状态,请执行以下操作:

    运行以下操作:

    # from your master branch :
    git checkout Master
    
    # reset it to its previous M state :
    git reset --hard M
    
    # cherry-pick commit A :
    git cherry-pick A
    
    # publish the 'fixed' Master branch using push --force :
    git push --force origin Master
    
    将上述命令中的
    M
    A
    替换为各自的sha

  • 要在
    发布时还原意外提交

    # replace 'v0.2' with the actual name of the tag, or the sha of `v0.2` the commit,
    # replace 'Release' with the actual name of the release branch
    git push origin --force v0.2:Release
    

这是您的图表,突出显示了“M”和“A”:

                previous correct state for Master
                v
Master:   *-----M------*
           \     \    /
Release:    *--*--*--A
                  ^  ^
               v0.2  accidental commit
您可以在本地“修复”历史记录,并使用
push--force
发布它

如果这是一个共享存储库,请首先与您的同事确认他们是否有基于“错误”提交的工作,并通知他们在您的操作后必须重新应用/重定工作基础

  • 要将
    主机设置为您期望的状态,请执行以下操作:

    运行以下操作:

    # from your master branch :
    git checkout Master
    
    # reset it to its previous M state :
    git reset --hard M
    
    # cherry-pick commit A :
    git cherry-pick A
    
    # publish the 'fixed' Master branch using push --force :
    git push --force origin Master
    
    将上述命令中的
    M
    A
    替换为各自的sha

  • 要在
    发布时还原意外提交

    # replace 'v0.2' with the actual name of the tag, or the sha of `v0.2` the commit,
    # replace 'Release' with the actual name of the release branch
    git push origin --force v0.2:Release
    

Git有两个不同的命令,用于备份以不同方式工作的提交

重置
git reset
将当前分支重置回指定的提交。还有许多别名用于撤消上次提交等操作。默认情况下,它会将提交中的更改保留在工作副本中,但保留为未老化的更改。如果要完全摆脱,请使用
--hard
选项

鉴于您已经推送到服务器,重置将不安全。这有效地重写了历史记录,如果其他人已经取消了您的提交,那么这些历史记录可能会打乱他们的工作区。一般来说,我只会将其用于尚未推送的本地提交

还原
git revert
通过将当前分支重置为以前的提交来执行相同的操作,但是它没有删除不需要的提交,而是添加了一个新的提交来撤销更改。这意味着你的历史可能有点混乱,但它是更安全的,因为你没有重新编写历史

樱桃采摘
您可能会发现另一个命令很有用。如果您对错误的分支进行了提交,或者即使您只是想在不进行完全合并的情况下复制提交,也可以使用
git cherry pick


您可能还需要研究如何保护主分支。我们使用gitlab并保护这个分支,需要来自另一个分支的合并请求来保存这样的意外推送。我相信其他工具也可以做类似的事情。

Git有两个不同的命令,用于备份以不同方式工作的提交

重置
git reset
将当前分支重置回指定的提交。还有许多别名用于撤消上次提交等操作。默认情况下,它会将提交中的更改保留在工作副本中,但保留为未老化的更改。如果要完全摆脱,请使用
--hard
选项

鉴于您已经推送到服务器,重置将不安全。这有效地重写了历史记录,如果其他人已经取消了您的提交,那么这些历史记录可能会打乱他们的工作区。一般来说,我只会将其用于尚未推送的本地提交

还原
git revert
通过将当前分支重置为以前的提交来执行相同的操作,但是它没有删除不需要的提交,而是添加了一个新的提交来撤销更改。这意味着你的历史可能有点混乱,但它是更安全的,因为你没有重新编写历史

樱桃采摘
您可能会发现另一个命令很有用。如果您对错误的分支进行了提交,或者即使您只是想在不进行完全合并的情况下复制提交,也可以使用
git cherry pick


您可能还需要研究如何保护主分支。我们使用gitlab并保护这个分支,需要来自另一个分支的合并请求来保存这样的意外推送。我相信其他工具也可以做类似的事情。

你推送更改了吗,还是它们仍然是本地的?@BenThurley也推送了更改。既然你推送了更改(我假设这是与其他人共享的回购),那么现在就来不及简单地重置提交。我将首先在master上执行
git revert
以退出合并,然后
git cherry pick
从发布分支提交您想要的内容,最后您可以
revert
发布分支。顺便说一句,
revert
将通过新提交的方式退出更改。你的历史将永远混乱,但这是最安全的。如果您还没有按下,那么您可以简单地
reset
删除提交,而没有人会知道。这就是原因