git documentation在几个地方提到not to rebase if the code has been pushed to a public repository Here is an example。如果执行rebase的每个操作都包含rebase
命令,那么这将是一个简单的规则:
$ git rebase foobar
但是,我已经看到它提到其他命令(即reset
)也可以在幕后执行rebase。因此,“thall shall rebase”规则变得更难以遵循,因为用户可能不知道他正在运行的命令将包含rebase。
用户如何知道哪些命令执行rebase,以避免它们?
答案 0 :(得分:4)
正如评论中指出的那样,实际问题是改变已经分享的历史(例如:推动)。
例如,如果你有:
A -- B -- C
\ L master | origin/master
\
-- D
如果您在提交master
上重新定位D
,那么您将拥有
A -- B -- C
\ L origin/master
\
-- D -- B' -- C'
L master
如您所见,如果您按master
,则当前的origin/master
将会丢失。
如果你做git reset --hard HEAD^
会发生同样的事情,因为它会改变
A -- B -- C
L master | origin/master
到
A -- B ------ C
L master L origin/master
正如您所看到的,当您知道命令应该做什么时,很容易理解它是否会改变历史。
如果有疑问,在执行操作后,您可以使用gitk --all
显示分支,以查看本地和远程分支是否仍处于同步状态。
还有一个最后的安全网:Git会阻止你推送一些会改变历史的东西(你可以推动这种推动(git push -f
),但至少在你不知道的情况下就不会发生这种情况)。
答案 1 :(得分:1)
通常,您需要阅读您将要使用的命令的文档,并在问自己一个问题时应用一些常识:
此操作是否会更改我本地git存储库的图形?
如果您的答案是肯定的,则需要检查是否已按下将要更改的部件。