git svn rebase 而其他人处理我的文件

git svn rebase while others work on my files

我是 git 的新手,我正尝试在我的 SVN 服务器上使用它。 我不明白 "git svn rebase" 获取更新的原因。据我了解,如果我使用 SVN 服务器更新我的本地存储库,提交 GIT(本地)我的更改,而不是 "git svn rebase",我可能会覆盖其他用户对我处理的文件的更改。

我理解正确吗?如果我这样做,为什么我要使用 rebase 并冒这样的风险(我理解快进的想法,但听起来真的很冒险)?

希望我没有遗漏一些基本的东西!

反之亦然:git svn rebase 防止您覆盖他人的工作。正如 Git-SCM book 恰当地指出的那样,将 git svn rebase 视为 svn update 的等价物。这是 使用 SVN 服务器更新本地存储库的方式

在标准 SVN 工作流程中...

...您签出存储库版本(比方说,@9001)。您进行了一些更改,并准备好提交,但是——哎呀——有人签入了更改 9002。您 svn update 到修订版 9002,必要时合并,然后签入您的更改以生成 9003。如果您没有运行 svn update,你会覆盖你队友的修订版9002; 运行宁 svn update表现得好像你的工作是基于修订版 9002 而不是 9001.

SVN         9001-------------------------------9002---------------9003--------->
                \                                  \             / svn commit
your feature     local work       [now update]      updated work

在标准 git 工作流程中...

...历史不是编号的,而是线性的。您可以随时在本地提交,并将您的工作合并到您的团队指定 "master" 分支的任何提交中。

your teammate's feature            T1--T2--T3---T4--T5
                                  /                   \  merge
master      M1------------------M2-------M3------------M4--------M5------------->
                                           \                    / merge
your feature                                Y1-----Y2-----Y3--Y4

我已将 Y1 Y2 Y3 Y4 标记为 您的特色工作的本地提交,所有这些都是基于您检出的世界状况 M3。所有这些历史都是 public,所以如果你像上面那样提交,你的队友可能会告诉你基于 M3 的 Y1。如果您想 更改 ,您可以要求 git 将您的功能工作改为基于 M4。这就是所谓的 git rebase.

your teammate's feature            T1--T2--T3---T4--T5
                                  /                   \  merge
master      M1------------------M2-------M3------------M4----------------M5----->
                                                         \              / merge
your feature after rebase                                 Y1--Y2--Y3--Y4

变基后,所有提交 ID(散列)都会更改,因为它们是根据您的提交的父项计算的,并且通过变基您故意更改父项。

所以在您的 git+svn 工作流程中...

...您需要将git 的提交图映射到svn 的线性历史。这意味着 运行在提交之前 svn update (git svn rebase),以便您的工作基于 SVN 存储库中的最新修订版。

SVN         9001-------------------------------9002----------------9003--------->
                \                                  \              / git svn dcommit
your feature     Y1--Y2--Y3--Y4   [now rebase]      Y1--Y2--Y3--Y4

有关更多说明和示例,请参阅 Git-SCM chapter on SVN