我实现了经典的OSS维护者/贡献者git的工作流程,在github公司的项目,但是一个边缘的情况下产生我不知道怎么去解决一些奇怪的结果。git pull --rebase upstream&git push origin拒绝非快进?
比方说有,我分叉和上游添加远程保持它最新的一个典型项目。
git clone [email protected]:kozhevnikov/<project>.git
git remote add upstream [email protected]:<company>/<project>.git
就这个例子而言,这个fork后面是一些提交。
git reset --hard HEAD~5 && git push --force
我对这个工作叉,推动一些提交,推我的最后提交并创建一个pull请求更新我的叉子的克隆,以确保没有冲突了。
touch foo && git add foo && git commit -m foo && git push
touch bar && git add bar && git commit -m bar
git pull --rebase upstream master
From github.com:<company>/<project>
* branch master -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Applying: foo
Applying: bar
现在,当我尝试推到我的叉子时,我被拒绝了。
git push
To [email protected]:kozhevnikov/<project>.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to '[email protected]:kozhevnikov/<project>.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.
接下来我该做什么?我想要的是拉请求包含foo和bar提交,但是...
当我pull
,拉请求包含重复foo提交以及额外的合并。
git pull
Merge made by the 'recursive' strategy.
git push
在github拉请求看起来像这样。
Showing 4 unique commits by 1 author.
12345
kozhevnikov foo 4 minutes ago
67890
kozhevnikov foo 4 minutes ago
abcde
kozhevnikov bar 2 minutes ago
fghij
kozhevnikov Merge branch 'master' of github.com:kozhevnikov/<project> just now
当我git pull --rebase
而不是pull
,充其量它会包括其他人的承诺进入我拉请求(来自复位),在最坏的情况它给了我合并冲突。
当我git push --force
没有任何pull
或--rebase
它完美的作品,但是我在说给大家使用武力或使其成为标准的工作流的一部分,我可以想象,没有几个人或一个小的工作小组合作,对单个感到非常不安叉和踩着对方的脚趾,用力推动。
任何想法?我错过了什么?