Git 远程库:Github 推送 push 克隆 clone、协作开发详解
准备工作
- 要让 GitHub 识别出你推送的提交确实是你推送的,需要创建 SSH Key。
- 创建 SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
邮箱地址任意,仅作注释之用。键入回车后会要求你输入一个 passphrase(密码),这个可有可无,作用是防止有人取得你的计算机使用权限,在 SSH 连接时还要输入这个密码,建议不用填直接跳过。 - 然后计算机用户主目录里找到 .ssh 目录,里面的 id_rsa 和 id_rsa.pub 两个文件就是SSH Key 的秘钥对,id_rsa 是私钥,不能泄露出去,id_rsa.pub 是公钥,可以放心地告诉任何人。
- 登陆 GitHub,打开个人设置添加 SSH key,填上任意 Title(最好能标识你当前的电脑),在 Key 文本框里粘贴公钥。
推送到远程库 - git push
- 关联远程库(先有本地库):首先再 Github 网页上创建一个新的库,例如命名为 learngit。在本地仓库中执行
git remote add origin git@github.com:<Github用户名>/learngit.git
,将本地库与远程库关联。 - origin 就是远程库的名字,这是 Git 默认的叫法,也可以改成别的,但是 origin 这个名字一看就知道是远程库。
- 下一步,把本地库的所有内容推送到远程库上:
git push -u origin master
(实际上是把当前 master 分支推送到远程)。git push
的格式为git push <远程库名> <本地分支名>:<远程分支名>
。- 第一次推送 master 分支时加上 -u 参数,指定 origin 为默认主机,在以后的推送或者拉取时就可以不加任何参数使用
git push
了。
在 Github 上显示的 commit 记录中,如果本地仓库设置的 Git email 地址是 Github 上已存在的账号,则 push 到 Github 上后 commit 记录里会显示相应的 Github 用户名和头像,而非 Git username。
可以尝试设置
git config user.email "torvalds@linux-foundation.org"
,再git push
,Github 页面上就会显示是 linus torvalds 提交的代码,很有意思。
克隆远程库 - git clone
- 关联远程库(先有远程库):
git clone git@github.com:<Github用户名>/gitskills.git
,执行该命令后会在当前目录下新建一个 gitskills 目录,并将远程库克隆到本地的 gitskills 目录中。
Github里 git clone 和 download zip 的区别:git clone 包含
.git
目录,即包含历史版本信息,而 download zip 没有历史版本信息,相当于当前分支的最新版本。
- 如果是多人协作开发,最好的方式是先创建远程库,然后各自从远程克隆一份即可。
多人协作
- 查看远程库名:
git remote
- 查看远程库信息,显示了可以抓取和推送的远程库地址:
$ git remote -v origin git@github.com:username/learngit.git (fetch) origin git@github.com:username/learngit.git (push)
- 推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,Git 就会把该分支推送到远程库对应的远程分支上:
git push origin master
,如果要推送 dev 分支,就改成:git push origin dev
。
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?- master 分支是主分支,因此要时刻与远程同步; dev 分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug 分支只用于在本地修复 bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个 bug;
- feature 分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
- 现在,另外一位同事要在 dev 上进行开发,首先将远程库克隆到本地:
git clone git@github.com:username/learngit.git
,
然后创建远程 origin 的 dev 分支到本地:git checkout -b dev origin/dev
这一步的前提是远程库已经有 dev分支,否则先需要把 dev 分支推送到远程库
git push origin dev
,然后同事git pull
重新拉取数据,现在便可创建远程的 dev 分支到本地。
现在他就可以在 dev 上继续修改,并且时不时地把 dev 分支 push 到远程:git push origin dev
。 - 一般情况是这样:同事先修改了 dev 分支并 push 到了远程,而此时你也对 dev 分支进行了修改,但是你 push 到远程库便会出错,因为你本地分支和远程分支不一致,即远程分支上存在本地分支中不存在的提交:
由提示可知,在这种情况下我们需要先用$ git push origin dev To github.com:username/learngit.git ! [rejected] dev -> dev (fetch first) error: failed to push some refs to 'git@github.com:username/learngit.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
git pull
把最新的提交从origin/dev
拉取下来,即先让本地分支与远程分支完成同步,可能还需要解决冲突,然后再推送便可成功。
如果git pull
也提示失败了,原因是没有指定本地 dev 分支与远程 dev 分支的关联。所以需要先设置 dev 和 origin/dev 的关联,再执行git pull
:
可以看出,执行$ git branch --set-upstream-to=origin/dev dev Branch 'dev' set up to track remote branch 'dev' from 'origin'. $ git pull Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result.
git pull
时发生了冲突。此时解决冲突的方式和解决分支合并冲突的方式一样。编辑 readme.txt,将 Git 为我们标识出的冲突位置修改为所需要的样子,然后提交,再推送到远程即可。