Git 使用 BitBucket 变基
Git Rebase with BitBucket
我 运行 遇到了一个让我发疯的问题。我的分支中有与 master 冲突的代码(在我的例子中是开发)。这不是一个大问题,因为它实际上是 7 行代码,很容易识别。
BitBucket 好心地告诉我,为了解决合并冲突,我需要执行以下步骤。
- git结帐
<branch in question>
- git pull
<master>
(在我的例子中是开发)
- 修复冲突
- 此时命令行也提供了这个指导
- "手动解决所有冲突,将它们标记为已解决
“git add/rm
<conflicted_files>
”,然后 运行 “git rebase --continue”。
- 一旦我 运行 “git rebase --continue”,就会出现一个新文档,有机会更改原始提交消息。我只关闭它,合并继续
- git 提交
- git 结果为“成功地重新定位并更新
<current branch>
- git 推送原点 HEAD
- 我希望收到一条成功的消息,表明一切 运行 一切都很好,正如预期的那样,但是我不断收到此消息:
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 merge
或git 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 有点痛苦。
我 运行 遇到了一个让我发疯的问题。我的分支中有与 master 冲突的代码(在我的例子中是开发)。这不是一个大问题,因为它实际上是 7 行代码,很容易识别。
BitBucket 好心地告诉我,为了解决合并冲突,我需要执行以下步骤。
- git结帐
<branch in question>
- git pull
<master>
(在我的例子中是开发)- 修复冲突
- 此时命令行也提供了这个指导
- "手动解决所有冲突,将它们标记为已解决
“git add/rm
<conflicted_files>
”,然后 运行 “git rebase --continue”。 - 一旦我 运行 “git rebase --continue”,就会出现一个新文档,有机会更改原始提交消息。我只关闭它,合并继续
- git 提交
- git 结果为“成功地重新定位并更新
<current branch>
- git 结果为“成功地重新定位并更新
- git 推送原点 HEAD
- 我希望收到一条成功的消息,表明一切 运行 一切都很好,正如预期的那样,但是我不断收到此消息:
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 merge
或git 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 有点痛苦。