如何创建使一个分支与另一个分支相同的提交?

How to create a commit that makes one branch identical to another?

假设我有两个分支:masterdeploymaster 分支是当前的 "edge" 代码 - 功能和错误修复分支合并到 master。另一方面,deploy 分支是我的 CI 系统监视以触发自动部署的分支。正常的工作流程是,一旦代码在 master 上被视为 "good",它就会合并到 deploy,这会导致自动部署。

在测试 CI 环境时,我对 deploy 分支做了一堆测试提交。提交只是为了更改而更改,只是为了测试 CI 触发器。现在可能有 12 个左右的提交只是简单地进行愚蠢的随机(但在部署中可检测到)更改。现在 CI 正在工作,我想 "roll back" deploy 分支到当前 master

问题是我无法在远程仓库(权限)上使用 --force

因此,我希望能够以某种方式进行提交,使 masterdeploy 分支相同。基本上我想区分当前的部署和主分支,并将该差异添加为部署提交。然后我可以将 deploy 合并到 master 中,这将导致不进行任何更改,并且分支将恢复同步。

现在只是将 master 合并到 deploy 是行不通的,因为 deploy 的更改将得到保留。

我不担心提交历史。

我知道我可以通过 git checkout <branch> <file> 从另一个提交或分支引入单个文件。我基本上要寻找的是 "check out ALL files from another branch but do not switch to that branch." 然后我可以提交并从那里开始。

像这样使用 merge strategy called ours :

git checkout master
git merge deploy -s ours
git checkout deploy
git merge master
git push origin HEAD

将在 deploy 上进行合并提交,从 deploy 中获取 0 次修改,因此从 master 中获取所有代码。但它不会重写历史,并且您可以在没有 --force.

的情况下推送 deploy

或者,为了不那么笨拙的历史记录(感谢 eftshift0 巧妙的技巧),您也可以选择这种方法:

git checkout --detach master
git merge -s ours deploy -m "setting content just like master"
git branch -f deploy
git push some-remote deploy