git - Git工作流和 rebase VS 合并问题

  显示原文与译文双语对照的内容

我已经在一个项目中使用了几个月的git 。 我有多年的svn经验,所以我想我应该为这个关系带来很多的包袱。

我听说git很适合分支和合并,到目前为止,我还没看到它。 当然,分支是很简单的,但是当我试图合并时,一切都会消失。 现在,我习惯从svn,但在我看来,我只是一个sub-par版本控制系统,另一个交易。

我的搭档告诉我,我的问题源于我想要合并 willy-nilly,而我应该在许多情况下使用 rebase,而不是合并。 例如下面是他已经制定的工作流:

clone the remote repo
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature
git checkout master
git merge my_new_feature

本质上,创建一个特性分支,总是从主分支到分支,并从分支合并到主分支。 重要要注意的是,分支总是保持局部不变。

下面是我开始的工作流

clone remote repo
create my_new_feature branch on remote repo
git checkout -b --track my_new_feature origin/my_new_feature
..work, commit, push to origin/my_new_feature
git merge master (to get some changes that my partner added)
..work, commit, push to origin/my_new_feature
git merge master
..finish my_new_feature, push to origin/my_new_feature
git checkout master
git merge my_new_feature
delete remote branch
delete local branch

有 2个基本差异( 我觉得): 我总是使用合并而不是重新转换,我将特性分支( 我的功能分支提交) 推送到远程仓库。

我对远程分支的推理是我想在工作时备份我的工作。 我们的仓库自动备份,如果有问题,可以恢复。 我的笔记本电脑不是,也不是完全的。 因此,我讨厌在我的笔记本电脑上有没有被镜像的代码。

我的理由合并,而不是变基是合并似乎标准和变基似乎是一个先进的特性。 我的直觉是,我试图做的不是一个高级的设置,所以不需要有 rebase 。 我甚至阅读了关于git的新的实用编程书籍,它们覆盖了大量的合并,并且几乎没有提到 rebase 。

无论如何,我在最近的分支跟踪我的工作流,当我试图将它重新合并到主服务器时,一切都会发生。 有大量与那些不应该有问题的事情冲突。 这些冲突对我没有意义。 我花了一天,把一切整理并最终以强制推送到远程的主人,因为我当地的主人所有的冲突解决,但远程还是不快乐。

什么是像这样的"正确"工作流? Git应该建立分支和合并 super-easy,我只是看不到它。

更新 2011-04-15

这似乎是一个非常流行的问题,所以我想我应该在我第一次问的时候用我的2年的经验来更新。

原来的工作流是正确的,至少在我们的例子中。 换句话说,这就是我们所做的,它工作:

clone the remote repo
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature
git checkout master
git merge my_new_feature

事实上,我们的工作流程有点不同,因为我们倾向于用来代替原始合并。 这使我们可以将整个功能分支转换为master上的单个提交。 然后删除我们的特征分支。 这允许我们在逻辑上构造我们的提交,即使它们在我们的分支上有些混乱。 这就是我们要做的:

clone the remote repo
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature
git checkout master
git merge --squash my_new_feature
git commit -m"added my_new_feature"
git branch -D my_new_feature

我喜欢 git,不想回到 SVN 。 如果你在挣扎,坚持它,最终你会看到隧道尽头的光线。

时间:

在你的情况下,我认为你的伙伴是正确的。 垫底术的优点是局外人更改看起来像他们自己所有发生在一个干净的序列。 这意味着

  • 你的更改非常容易查看
  • 你可以继续做不错,小的承诺,但你可以集公共( 合并到主控形状) 提交
  • 当你查看公共的主分支时,你会看到不同的开发者对不同功能的不同的承诺,但它们并不会全部混合

你仍然可以继续推动私人开发分支到远程存储库的备份但其他人不应该治疗,作为一个"公用"分支,因为你将重新定价。 顺便说一下,一个简单的命令是 git push --mirror origin

本文包装软件使用git相当不错的工作解释合并和重新权衡。 有点不同的上下文,但主体是相同的--基本上可以归结为你的分支是否公共或私人,你计划如何将它们集成到主流。

阅读你的解释后,我有一个问题: 是不是你从来没有做过


git checkout master
git pull origin
git checkout my_new_feature

在你的特性分支中执行'git rebase/merge 母版'之前?

因为你主分支不会从你朋友库自动更新。 你必须用'git pull 原点'。 换句话说,也许你总是从一个never-changing本地主分支开始? 然后来推动你正推动在一个存储库( 本地) 提交你从未见过,因此,推动失败。

...