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