使用变基的git工作流程

时间:2013-05-09 06:24:54

标签: git git-rebase

到目前为止,我已经与SVN,GIT和Mercurial合作,对于后两者,工作流程始终只包含拉/合并/推送。现在我正在开发一个项目,其中工作流程涉及经常从父分支进行变基,我不确定我完全理解发生了什么,或者我的工作流程是否正确。我正在指定的分支机构完成所有工作,所以:

git checkout dvl_bkend      // This is 'parent' branch
git checkout -b dvl_bogdan  // Created my own branch 

现在以下所有来自我自己的分支。当我开始编码时:

git pull --rebase -s recursive -X ours origin dvl_bkend

编码和东西,只要我有稳定的东西

git add stuff
git commit stuff
// rinse and repeat above two steps

现在,当我准备推送时。

git pull --rebase -s recursive -X ours origin dvl_bkend

此时我想推送到我的dvl_bogdan,但我不能说我需要先拉。所以我:

git pull origin dvl_bogdan

现在这给了我需要合并的冲突(没有想到为什么会发生这种情况?)而且在这一点上我猜测某些事情是不对的。无论如何,如果我解决冲突,我可以:

git push origin dvl_bogdan

重复上述所有步骤,直到我准备好提取请求。然后再重复一遍。我在哪里弄乱我的流量?我已经设法进入了一种情况,在这种情况下,变基器不断应用重复的提交:

   bogdan   5b31717  Merge branch 'develop_bogdan' of xx into develop_bogdan     8 May 2013

   Bogdan Neacsa    810d753  Updated payment service to recieve an Account entity now rather that creating it itself. Also change…   8 May 2013

   bogdan   429f97b  Fix to model and service in payments. Quick fix to tests after changes.     8 May 2013

   Bogdan Neacsa    7c6ff32  Updated payment service to recieve an Account entity now rather that creating it itself. Also change…   8 May 2013

   bogdan   d74ce5a  Fix to model and service in payments. Quick fix to tests after changes.     8 May 2013

   Bogdan Neacsa    8ab401e  Updated payment service to recieve an Account entity now rather that creating it itself. Also change…   8 May 2013

   bogdan   259349b  Fix to model and service in payments. Quick fix to tests after changes.     8 May 2013

谢谢, 波格丹

编辑:------------部分不清楚-------------------

所以我在我的dvl_bogdan分支上,它与我的远程分支同步,即如果我这样做:

git pull origin dvl_bogdan

这说明我是最新的。现在我做:

git pull --rebase -s recursive -X ours origin dvl_bkend

这并没有给我任何冲突。但是现在当我尝试:

git push origin dvl_bogdan

它要求我在我可以推动之前做一个拉动,这拉动会给我带来冲突。我真的不明白这里会发生什么。

2 个答案:

答案 0 :(得分:1)

一般的想法听起来很不错。一些评论:

  • 本地分支机构能够跟踪其对应的远程上游分支。设置上游分支总是一个好主意,因为它是许多操作(如推拉)的默认设置。使用git branch -vv查看您拥有的本地分支以及他们跟踪的远程分支。

  • 重新定位正在改变历史。 永远不要更改已发布的历史记录。 否则会导致重复的提交条目。正确设置上游可以帮助您。

  • git config push.default设为好值。 (见git help config)如果您有最新的git版本,我会推荐“当前”或“简单”。

  • 请确保您理解“-s recursive -X ours”的含义。它可能会忽略项目所需的上游更改。

  • 考虑设置merge.ff = false。这将确保无论何时进行合并,都会创建相应的合并提交。但请记住现在总是使用--rebase选项,否则每次拉动都会创建合并提交。 - 一个好的别名很方便。

我建议采用以下略微调整的工作流程:

  • 首先设置你的配置:

    git config --global push.default current
    git config --global merge.ff false
    git config --global alias.up 'pull --rebase'
    
  • 创建您的本地分支

    git checkout dvl_bkend
    git branch -vv # dvl_bkend should track something like "origin/dvl_bkend"
    git branch -m dvl_bogdan # creating your own branch by renaming the other is an easy way of tracking the original upstream
    
  • 处理代码。完成某项任务后,经常提交。您只能回滚到您提交的状态。偶尔执行git up以集成上游更改并注意相互冲突的更改。

  • 完成工作后,请考虑将其提供给其他人:

    git rebase -i # have a look on your commits. You can reorder them, squash them together, correct errors in commit messages, etc.
    
    git log -p -w --reverse  @{u}.. # a final look at all the changes you are about to push
    
    git push --set-upstream # push your changes to your own remote branch and change the upstream to track your own branch from now on.
    
  • 一旦推送完最终提交,就要将分支合并回来:

    git merge origin/dvl_bkend # optional, to notice potential merge conflicts
    git checkout dvl_bkend
    git merge --no-ff origin/dvl_bogdan
    git push
    

答案 1 :(得分:1)

关于不明确的部分:

git pull origin dvl_bogdan

这将执行git fetch更新origin / dvl_bogdan和git merge,它会尝试将origin / dvl_bogdan中的所有更改应用到本地dvl_bogdan。如果它告诉你,你是最新的。然后没有人推动那个分支。 (正如预期的那样,你似乎打算单独在这个分支上工作。)

git pull --rebase -s recursive -X ours origin dvl_bkend

这将再次执行git fetch更新origin / dvl_bkend。然后,rebase将复制所有更改并将其应用于origin / dvl_bkend。生成的分支与您的dvl_bogdan完全无关。立即使用gitk origin/dvl_bogdan...dvl_bogdan查看您的情况: 你有一个共同的基础,其中有一个分支(1),你的原始提交以origin / dvl_bogdan结尾,另一个分支(2)包含来自dvl_bkend的变化,你的变化副本位于顶部。

git push origin dvl_bogdan

现在你尝试将分支(2)推送到分支(1),这不起作用,因为这不是快进推送。

要解决这个问题,请面对origin / dvl_bkend和origin / dvl_bogdan是两个已经发布的分支的事实。您需要将两者合并为合并提交,使用git fetch && git merge origin/dvl_bkend或简单git pull,这样做完全相同。

或者,无论如何都可以强制推动更新dvl_bogdan,但是在这种情况下要确定你知道自己在做什么。

相关问题