为什么要避免在已推送的分支上使用 rebase 命令?
Why should we avoid using the rebase command on a branch that has been pushed?
我正在寻找一个简单的示例,说明为什么当有多人使用该项目时,我们应该避免在已推送的分支上使用 rebase 命令。我读到它让其他开发人员感到困惑,但是一个简单的例子可以帮助我想象为什么这是一个问题。
据我了解,如果您是唯一在该分支上工作的人,那么变基应该没有任何问题。如果在该分支机构工作的人不止一个,那么变基可能会有很多并发症。
this 文章末尾有一个简单的例子,对我帮助很大。
简而言之,因为 rebase 更改了提交的 sha1 id,就像重写历史一样。
这是一个例子:
比如说,你有 master 提交了 A1 和 A2。
>> git log master
=> A1, A2
>> git checkout -b mybranch
>>> work..work..work
>> git commit mybranch
>>> work..work..work
>> git commit mybranch
// at this point mybranch contains A1, A2, A3, A4
>> git log mybranch
=> A1, A2, A3,A4
>> git push mybranch origin/mybranch
// now (its critical ! ) other users __checkout__ mybranch on their machines (and get commits A1, A2, A3, A4) of course
////////
// a couple of hours/days later ...
// ...meanwhile other people worked on master so now it looks like this:
>> git checkout master
>> git log
=> A1, A2, B1,B2 // commits B1 and B2 are new!!!
// and now let rebase:
>> git checkout mybranch
>> git rebase master
>> git log mybranch
=> A1, A2, B1, B2, A3', A4'
注意此时A3变成了A3'(它的sha1变了),A4变成了A4'
现在你可以强行推送这个历史(一个新的历史,用原始的 A3 和 A4 提交重写历史)。 git push -- force mybranch
但是,此时您的同事会做什么呢?如果他们通过 git pull mybranch
结帐 mybranch
,他们是否应该同时获得 A3 和 A3'(A4 和 A4' 也是如此)?
这是非常有问题的,除非他们删除 mybranch
的本地副本并拉取,就好像在他们的本地计算机上从未存在过一样。
我正在寻找一个简单的示例,说明为什么当有多人使用该项目时,我们应该避免在已推送的分支上使用 rebase 命令。我读到它让其他开发人员感到困惑,但是一个简单的例子可以帮助我想象为什么这是一个问题。
据我了解,如果您是唯一在该分支上工作的人,那么变基应该没有任何问题。如果在该分支机构工作的人不止一个,那么变基可能会有很多并发症。
this 文章末尾有一个简单的例子,对我帮助很大。
简而言之,因为 rebase 更改了提交的 sha1 id,就像重写历史一样。 这是一个例子:
比如说,你有 master 提交了 A1 和 A2。
>> git log master
=> A1, A2
>> git checkout -b mybranch
>>> work..work..work
>> git commit mybranch
>>> work..work..work
>> git commit mybranch
// at this point mybranch contains A1, A2, A3, A4
>> git log mybranch
=> A1, A2, A3,A4
>> git push mybranch origin/mybranch
// now (its critical ! ) other users __checkout__ mybranch on their machines (and get commits A1, A2, A3, A4) of course
////////
// a couple of hours/days later ...
// ...meanwhile other people worked on master so now it looks like this:
>> git checkout master
>> git log
=> A1, A2, B1,B2 // commits B1 and B2 are new!!!
// and now let rebase:
>> git checkout mybranch
>> git rebase master
>> git log mybranch
=> A1, A2, B1, B2, A3', A4'
注意此时A3变成了A3'(它的sha1变了),A4变成了A4'
现在你可以强行推送这个历史(一个新的历史,用原始的 A3 和 A4 提交重写历史)。 git push -- force mybranch
但是,此时您的同事会做什么呢?如果他们通过 git pull mybranch
结帐 mybranch
,他们是否应该同时获得 A3 和 A3'(A4 和 A4' 也是如此)?
这是非常有问题的,除非他们删除 mybranch
的本地副本并拉取,就好像在他们的本地计算机上从未存在过一样。