github和gitee(四)

一 关联github远程仓库

  (github的使用不做介绍)由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要⼀点设置:
  第1步:创建SSH Key。在⽤户主⺫录下,看看有没有.ssh⺫录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个⽂件,如果已经有了,可直接跳到下⼀步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "[email protected]"

  你需要把邮件地址换成你⾃⼰的邮件地址,然后⼀路回⻋,使⽤默认值即可,由于这个Key也不是⽤于军事目的,所以也⽆需设置密码。如果⼀切顺利的话,可以在⽤户主目录⾥找到.ssh目录,⾥⾯有id_rsa和id_rsa.pub两个⽂件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放⼼地告诉任何⼈。
  第2步:登陆GitHub,打开“Account settings”,“SSH Keys”⻚⾯:然后,点“Add SSH Key”,填上任意Title,在Key⽂本框⾥粘贴id_rsa.pub⽂件的内容,点“Add Key”,你就应该看到已经添加的Key。为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,⽽不是别⼈冒充的,⽽Git⽀持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你⾃⼰才能推送。当然,GitHub允许你添加多个Key。假定你有若干电脑,你⼀会⼉在公司提交,⼀会⼉在家⾥提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
  第3步:登陆验证,使用命令:

$ ssh -T [email protected]

  如果初次设置的话,会出现如下界面,输入yes 同意即可:

  第4步:添加远程库,现在的情景是,你已经在本地创建了⼀个Git仓库后,又想在GitHub创建⼀个Git仓库,并且让这两个仓库进⾏远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他⼈通过该仓库来协作,真是⼀举多得。先在github创建一个空仓库,在本地的同名仓库下:

$ git remote add origin [email protected]:michaelliao/learngit.git

  michaelliao替换成你⾃⼰的GitHub账户名,添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字⼀看就知道是远程库。
  第5步:就可以把本地库的所有内容推送到远程库上:

$ git push -u origin master
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (19/19), 13.73 KiB, done.
Total 23 (delta 6), reused 0 (delta 0)
To [email protected]:michaelliao/learngit.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.

  把本地库的内容推送到远程,⽤git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第⼀次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以⽴刻在GitHub⻚⾯中看到远程库的内容已经和本地⼀模⼀样。
  第6步:从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master

二 关联gitee远程仓库

  建立仓库,有两种情况:1、本地已经开发一个项目有一段时间了,需要提交到 gitee 上;2、在 gitee 上建立仓库,然后 clone 到本地,修改完成后,再次提交到 gitee 上。针对这两种情况,分别如下:
  对于第一种情况,和 github 的使用一样,前面有讲述,如下操作:
在这里插入图片描述

cd existing_git_repo
git remote add origin https://gitee.com/use1/test.git
git push -u origin master

  对于第二种情况,如下操作:
在这里插入图片描述

git clone [email protected]:use1/test.git
touch test.txt #进行修改
git add test.txt
git commit -m "second commit"
git push -u origin master #提交

  git push -u origin master命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了,此示例只有一个主分支。

三 origin

  其实,对于git的使用主要围绕三点展开:1、从远程取数据(git clone);2、改动代码;3、将改动同步到远端(git push)。
  这3个步骤又涉及到两个repository,一个是remote repository,在远程服务器上;一个是local repository,在自己工作区上。其中 1,3 两个步骤涉及到remote server/remote repository/remote branch,2 涉及到 local repository/local branch。
  设计到远程库,必须明确origin的概念,已经关联了远程仓库的本地仓库,使用git remote时:

$ git remote -v #查看clone地址
origin  https://gitee.com/use1/test.git (fetch)
origin  https://gitee.com/use1/test.git (push)

  也就是说 git 默认创建了一个指向远端代码库的 origin,顾名思义,origin 就是一个名字,在关联一个远程库时,git默认创建的指向这个远程代码库的标签, origin指向的是repository,master只是这个repository中默认创建的第一个branch(运行git remote –v或者查看.git/config可以看到origin的含义)。
  如果user1想加一个远程指向user2的代码库,可以在控制台输入:

$ git remote add upstream [email protected]:user2/repository.git
$ git remote -v
origin [email protected]:user1/repository.git (fetch)
origin [email protected]:user2/repository.git (push)
upstream [email protected]:user2/repository.git (fetch)
upstream [email protected]:user2/repository.git (push)

  增加了指向 user2 代码库的 upstream。

四 https和git协议

  git支持https和git两种传输协议,github 和 gitee 都有两种协议可选:
在这里插入图片描述在这里插入图片描述
  git使用https协议,每次pull, push都会提示要输入密码,使用git协议,然后配置 ssh 密钥,这样免去每次都输密码的麻烦。所以根据具体情况,在使用 url 的时候以自己的情况而定。

五 切换协议

  对于使用 https 协议进行同步的项目,每次提交都需要输入账号和密码,对于这个问题,有两种解决方法:
  1、保存密码到本地:在项目目录下输入:git config --global credential.helper store,然后会在本地生成一个文本,上边记录账号和密码,然后你使用上述的命令配置好之后,再操作一次git pull,然后它会提示你输入账号密码,这一次之后就不需要再次输入密码了。
  2、切换成ssh(必须是在配置了公钥的情况下):

$ git remote -v #查看clone地址
origin  https://gitee.com/use1/test.git (fetch)
origin  https://gitee.com/use1/test.git (push)
$ git remote rm origin #移除https的方式,换成ssh方式
$ git remote add origin [email protected]:use1/test.git #关联远程库
$ git remote -v
origin	[email protected]:use1/test.git (fetch)
origin	[email protected]:use1/test.git (push)

六 更新远程仓库到本地

  对于多个终端的开发,不同的终端修改完成后提交到远程仓库,为了保持最新状态,需要及时跟新,对于远程仓库更新到本地,使用git fetchgit pull命令,此示例只有一个主分支。

1 git fetch

  1. git fetch:更新git remote 中所有的远程 repo 所包含分支的最新 commit-id,将其记录到.git/FETCH_HEAD文件中;
  2. git fetch remote_repo:更新名称为 remote_repo 的远程 repo 上的所有 branch 的最新commit-id,将其记录;
  3. git fetch remote_repo remote_branch_name:更新名称为 remote_repo 的远程 repo 上的分支 remote_branch_name;
  4. git fetch remote_repo remote_branch_name:local_branch_name:更新名称为 remote_repo 的远程 repo 上的分支 remote_branch_name,并在本地创建 local_branch_name 本地分支保存远端分支的所有数据。

2 git pull

  git pull的作用是从一个仓库或者本地的分支拉取并且整合代码。

git pull [<options>] [<repository> [<refspec>…​]]

  是仓库的名字, 是分支的名字。如果都不写,会有一个默认值。

七 git fetch和git pull的区别

  本地.git文件夹里面存储了本地仓库 master 分支的 commit ID和跟踪的远程分支 orign/master 的 commit ID(可以有多个远程仓库)。

.git/refs/head/[本地分支]
.git/refs/remotes/[正在跟踪的分支]

  其中head就是本地分支,remotes是跟踪的远程分支。
  更改远端跟踪分支只能用git fetch,或者是git push后作为副产品(side-effect)来改变。我们无法直接对远程跟踪分支操作。

1 git fetch

  当远程服务器有更新时,使用 git fetch 更新代码,本地的库中 master 的 commitID 不变,但是与远程库关联的 orign/master 的 commitID 和远程一样。这时候本地相当于存储了两个代码的版本号,我们还要通过merge去合并这两个不同的代码版本(如果这两个版本都修改了同一处的代码,这时候merge就会出现冲突)。
  相当于fetch的时候本地的master没有变化,但是与远程仓关联的那个版本号被更新了,我们接下来就是在本地合并这两个版本号的代码。

2 git pull

在这里插入图片描述
  使用git pull的会将本地的代码更新至远程仓库里面最新的代码版本。
  由此可见,git pull看起来像git fetch+get merge,但是根据commit ID来看的话,他们实际的实现原理是不一样的。这里借用之前文献看到的一句话:不要用git pull,用git fetch和git merge代替它。git pull的问题是它把过程的细节都隐藏了起来,以至于你不用去了解git中各种类型分支的区别和使用方法。当然,多数时候这是没问题的,但一旦代码有问题,你很难找到出错的地方。看起来git pull的用法会使你吃惊,简单看一下git的使用文档应该就能说服你。将下载(fetch)和合并(merge)放到一个命令里的另外一个弊端是,你的本地工作目录在未经确认的情况下就会被远程分支更新。当然,除非你关闭所有的安全选项,否则git pull在你本地工作目录还不至于造成不可挽回的损失,但很多时候我们宁愿做的慢一些,也不愿意返工重来。以上内容来自这里

八 遇到的问题

一、使用ssh连接远程主机时:
在这里插入图片描述
  大概意思就是说密钥权限的文件不能为777,不能被其他用户读取。了解了问题后,修改密钥文件权限为700就OK了。
二、fatal: remote origin already exists.
  $ git remote rm origin
三、! [rejected] master -> master (non-fast-forward)
  问题(Non-fast-forward)的出现原因在于:git仓库中已经有一部分代码,所以它不允许你直接把你的代码覆盖上去。于是你有2个选择方式:
  1、强推,即利用强覆盖方式用你本地的代码替代git仓库内的内容:git push -f
  2、先把git的东西fetch到你本地然后merge后再push。

$ git fetch
$ git merge

  这2句命令等价于:git pull

发布了67 篇原创文章 · 获赞 26 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/essity/article/details/100944538