0

到目前为止,我一直在使用 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

它要求我在推动之前先进行拉动,而这种拉动会给我带来冲突。我真的不明白这里发生了什么。

4

2 回答 2

1

明确地在不清楚的部分:

git pull origin dvl_bogdan

这将执行 a git fetch,更新 origin/dvl_bogdan 和 a 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,但请确保您知道在这种情况下您在做什么。

于 2013-05-09T09:31:37.107 回答
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
    
于 2013-05-09T07:54:18.790 回答