我的 git 变基工作流程有什么问题?
What am I doing wrong with my git rebase workflow?
我的团队正在从 git 合并工作流转移到变基工作流,但我不明白我做错了什么。我的工作主要以 this blog post 作为模板。最终,希望能够提交一个 github 拉取请求,其中包含我分支的提交,不会与 master 发生合并冲突。如果该拉取请求只能包含我的提交(用于代码审查目的),那就太好了。
场景如下:
- 我为我的功能创建了一个 master 分支
- 做一些工作...
我从 master 变基到我的本地分支:
git fetch
git rebase origin/master
我会处理任何合并冲突,然后使用
继续变基
git mergetool
git rebase --continue
因为我是唯一一个在我的分支上工作的人,我希望能够通过
来推动我的当前状态
git push origin myBranch
但是,当我尝试推送时,我得到以下信息
$ 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.
- 如果我尝试
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
— 如果您是唯一一个在该分支上工作的人,应该不会造成任何问题。
我的团队正在从 git 合并工作流转移到变基工作流,但我不明白我做错了什么。我的工作主要以 this blog post 作为模板。最终,希望能够提交一个 github 拉取请求,其中包含我分支的提交,不会与 master 发生合并冲突。如果该拉取请求只能包含我的提交(用于代码审查目的),那就太好了。
场景如下:
- 我为我的功能创建了一个 master 分支
- 做一些工作...
我从 master 变基到我的本地分支:
git fetch git rebase origin/master
我会处理任何合并冲突,然后使用
继续变基git mergetool git rebase --continue
因为我是唯一一个在我的分支上工作的人,我希望能够通过
来推动我的当前状态git push origin myBranch
但是,当我尝试推送时,我得到以下信息
$ 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.
- 如果我尝试
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
— 如果您是唯一一个在该分支上工作的人,应该不会造成任何问题。