Loading

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 为我们标识出的冲突位置修改为所需要的样子,然后提交,再推送到远程即可。
posted @ 2020-08-19 11:10  x0c  阅读(788)  评论(0编辑  收藏  举报