我的 git 变基工作流程有什么问题?

What am I doing wrong with my git rebase workflow?

我的团队正在从 git 合并工作流转移到变基工作流,但我不明白我做错了什么。我的工作主要以 this blog post 作为模板。最终,希望能够提交一个 github 拉取请求,其中包含我分支的提交,不会与 master 发生合并冲突。如果该拉取请求只能包含我的提交(用于代码审查目的),那就太好了。

场景如下:

  1. 我为我的功能创建了一个 master 分支
  2. 做一些工作...
  3. 我从 master 变基到我的本地分支:

    git fetch
    git rebase origin/master
    
  4. 我会处理任何合并冲突,然后使用

    继续变基
    git mergetool
    git rebase --continue
    
  5. 因为我是唯一一个在我的分支上工作的人,我希望能够通过

    来推动我的当前状态
    git push origin myBranch
    
  6. 但是,当我尝试推送时,我得到以下信息

    $ git push origin myBranch 
    To <github address>
     ! [rejected]        myBranch -> myBranch (non-fast-forward)
    error: failed to push some refs to <github address>
    hint: Updates were rejected because the tip of your current branch is behind
    hint: its remote counterpart. Integrate the remote changes (e.g.
    hint: 'git pull ...') before pushing again.
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.
    
  7. 如果我尝试 git rebase origin/myBranch 我会遇到很多冲突,因为我从 master 拉取的提交抱怨我的分支中存在的提交来自以前的 rebase (但我从未亲自更改).

我以前在这里看到过这个错误:

git push github master
To git@github.com:Joey-project/project.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:Joey-project/project.git'

一个通用的解决方案是使用以下命令的变体:

git fetch github; git merge github/master

我建议也看看 How to update topic branch with upstream changes on master?,它可以让你对如何解决这个问题有进一步的想法。

您必须使用 git push -f 强制推送。默认情况下,git push 只允许快进合并(也就是说,如果新提交是远程仓库中已有提交的直接后代,它只允许你推送一个分支)。 git rebase 重写历史,这会更改 所有 分支上的提交,因此您必须改为强制推送。

如果你不想强制推送 (push -f) 你的功能分支,你必须避免在你已经将它推送到 GitHub 后重新设置你的功能分支。

我使用此工作流程而没有出现您在第 6 步中提到的错误。

  • git checkout master
  • git pull
  • git checkout -b feature_branch
  • git commit -m "Finish my work"
  • git checkout master
  • git pull
  • git checkout feature_branch
  • git rebase master
  • Resolve merge conflicts.
  • git push origin feature_branch
  • Open pull request.

作为 mipadi says in ,如果您在签出功能分支时执行以下操作,则必须强制推送您的功能分支:

  • git push origin feature_branch
  • git rebase master
  • git push origin feature_branch#错误
  • git push -f origin feature_branch

最后一个命令 — git push -f origin feature_branch — 如果您是唯一一个在该分支上工作的人,应该不会造成任何问题。