我是git的新手。所以请像新手一样对待我。
我的情况是我的团队必须以GitHub repo作为初始代码库进行开发。我们没有为这个原始回购做出贡献,但希望不断获取原始GitHub回购中可用的任何更新到我们的回购中。如此有效,我需要在GitHub上有一个回购:
请指导初始设置和每日命令/工作流程。
到目前为止,我已尝试过以下内容:
初始工作流程:
将fork克隆到本地计算机(local-repo)
git clone https://github.com/fork/devfiles.git project
将原始GitHub存储库添加为远程
cd project
git remote add upstream https://github.com/original/devfiles.git
在bitbucket上创建了一个空的repo,用作我的开发团队的DVCS,并将其添加为第二个遥控器。
git remote add devrepo git@bitbucket.org:mycomp/devfiles.git
从我的本地机器,将分叉的仓库推到bitbucket
git push devrepo master
我的开发团队在他们的本地机器上克隆了bitbucket repo
git clone git@bitbucket.org:mycomp/devfiles.git
每日工作流程
开发团队使用bitbucket repo,将其更改推送到它。
要从devrepo获取更新到local-repo,我运行:
git fetch devrepo (did not do what I wanted)
git pull devrepo master (this works)
从原始GitHub仓库获取更新到本地仓库。我做了以下事情:
git fetch upstream
git rebase upstream/master
这将获得原始GitHub仓库的最新提交,并将我的团队提交给他们。
到目前为止,一切似乎都很好。
现在我终于需要将这些更新的文件推送到devrepo
git push devrepo master
To git@bitbucket.org:mycomp/devfiles.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:mycomp/devfiles.git'
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.
答案 0 :(得分:0)
作为一个自我描述的git新手,我觉得我必须教育你几点。
git fetch devrepo (this does not work)
我将在此假设您希望上述命令将工作文件夹中的文件更改为表示当前状态为devrepo
并且工作文件夹当前处于何种状态的内容,因为在下一个声明中你说:
git pull devrepo master (this works)
了解git fetch
,git merge
和git pull
之间的区别非常重要。 git pull
是一种方便的方法,可以执行非常常见的git fetch
,后跟git merge
。说git fetch
不起作用(说得太直白)完全错了,这样说会更准确:
git fetch
(没做我想做的事)
如果不这样做,我们可以尝试解决您的问题。
根据您的命令历史记录,有几点值得称赞:
git pull
向本地分支机构运行devrepo/master
到合并提交。这会更新您的主分支指针,如果您已对<{1}}上不存在的本地master
分支进行任何提交,则会为您创建合并提交。您的本地devrepo
分支有master
作为父级,因此这不会导致您的devrepo/master
失败。 push
。我个人从未试图将合并提交重新绑定到另一个分支,但我猜这个问题就在这里。我的猜测(基于我如何看待git处理合并提交与其他不相关的命令)是rebase跳过上面运行rebase
时创建的提交。这肯定会使您的git pull
分支进入master
告诉您的非快进状态。要修复工作流程,您可以执行以下操作。 (注意:这不是唯一可行的解决方案,只是我认为最直接的解决方案)
从两个回购中获取所有新提交:
git pull
git fetch devrepo
在devrepo / master检查一个临时分支:
git fetch upstream
引入上游更改(这可能会创建合并提交):
git checkout -b tmp_master devrepo/master
git pull upstream master
分行master
git checkout master
git rebase tmp_master
您现在应该能够git branch -D tmp_master
而不会收到该错误消息。