Git 使用 BitBucket 变基

Git Rebase with BitBucket

我 运行 遇到了一个让我发疯的问题。我的分支中有与 master 冲突的代码(在我的例子中是开发)。这不是一个大问题,因为它实际上是 7 行代码,很容易识别。

BitBucket 好心地告诉我,为了解决合并冲突,我需要执行以下步骤。

On branch <current branch> Your branch and '<current branch>' have diverged, and have 4 and 3 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean

好的,没问题,让 运行 git 拉...我们必须重新开始,就好像我从未解决过合并冲突一样。

我正在阅读其他具有类似问题的评论,发现有人使用 -f 标志(强制)推送代码。我试过了,当然它起作用了,但是我的 7 行更改变成了多个文件更改。合并冲突消失了,但我担心主(开发)分支会因不必要的提交而膨胀。

TL;DR: 你需要 git push --force-with-lease origin HEAD.

你 运行 正在解决这个问题,因为你正在使用 rebase。 (这里与 Bitbucket 无关;我剪掉了那个标签。)

rebase 操作的核心是对 Git 的命令,格式如下:

  • 我有一些旧的提交。他们... 还可以,但还不够好。
  • 删除旧的提交,创建一些新的和改进的替换提交来代替使用。

当你完成后,旧的提交就消失了(ish1),你现在正在使用新的和改进的替换提交。

当你 运行 git push origin HEAD 时,你的 Git 将你的名字 HEAD 解析为你当前的 b运行ch 名字——无论那个名字是什么——并且就像你 运行 git 推送原点 <em>b运行ch</em> 一样。这让你的 Git 调用他们的 GIt,在 origin,发送你的新提交,然后礼貌地询问他们是否愿意,如果可以的话,设置 他们的 b运行ch 名称来识别与您的 b运行ch 名称相同的最后一次提交。

因为你使用了rebase,所以这个请设置b运行ch name ______(填写name)为_______(填写hash ID ) 相当于对 their Git 形式的指令: Throw away the same old commits I throw away, using these same replacement commits 。但他们不知道您的新替代者提交 替代品,此时。他们完全忘记了之前告诉你的任何事情。他们只看到您要求他们丢弃一些提交。所以他们说不!如果我这样做,我会失去一些提交。

为了克服他们不愿放弃提交的情绪,您必须向他们发送更有力的命令,而不是礼貌的请求。您必须告诉他们:是的,我知道这可能会丢弃一些提交。无论如何都要这样做! 为此,您必须在 git push 命令中使用 --force--force-with-lease 选项。

--force-with-lease 选项在某种意义上“更安全”:当您使用此选项时,您的命令具有以下形式:我希望您更新 _____ (用 b运行ch 名称填空)。我相信您的最新提交是 _______(用哈希 ID 填空)。如果是这样,请丢弃一些提交;使用 ______(用散列 ID 填写空白)。 您的 Git 填写所有空白并将其发送过来。如果他们的 Git 自上次您的 Git 与他们的 Git 交谈以来没有积累任何 new 提交,您的替换提交是正确的替换,如果他们服从这个强有力的命令,那就成功了。

--force选项跳过安全检查:更新______(填空name)为_____(填空hash ID )! 只要在您开始工作后没有人 else added new 提交,这个强制命令会达到与更谨慎 --force-with-lease.

当您使用 git pull 而不是带有强制选项的 git push 时,您会得到 他们的 最新提交——这是您之前丢弃的那些做你的替换——现在你遇到了同样的问题。您可以通过任何类型的拉取来获得它,无论是使用获取和重新设置拉取,还是使用获取和合并拉取。 (我个人建议避免git pull:运行git fetch自己,然后运行git mergegit rebase 你自己,根据你的意图。然后当它出错时,你知道实际上是哪个命令失败了。当你使用 git pull 到 运行 two Git commands for you, and something fails, you may even know that which Git command failed. 但有些人觉得输入几个额外的字符很困难。根据我的回答长度你可以看到,我不知道没有这个特殊问题。)


1Git 很贪commit,舍不得放弃。出于这个原因,作为备用,以防您改变主意,旧的提交还没有 真的 消失。默认情况下,您至少有 30 天的时间才能真正消失。不过,在那 30 天内恢复它们 window 有点痛苦。