Git学习笔记(4)——添加远程仓库,克隆远程库,以及库的推送

本文记录了远程库的连接和库的克隆和推送。


远程仓库简介

Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。

分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,

有个叫GitHub的国外网站,提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。类似的网站还有很多,比如:国内的开源中国的Git(本文使用的是国外的GitHub,网速有点慢)


SSH协议配置

和远程的版本库同步的时候,我们可以使用HTTPS协议或者SSH协议,SSH协议更安全,更快一些。根据自己的需求采用不同的方式。所以我使用安全更快一些的SSH协议。

查看是否已经产生了SSH所需的秘钥对

//查看你系统的家目录
ubuntu@myUbuntu:~$ pwd
/home/ubuntu
//.ssh文件是隐藏的
ubuntu@myUbuntu:~$
ls -
a
.              .bashrc  .dbus       .ICEauthority  .pki      .sudo_as_admin_successful  公共的  
..             .cache   .dmrc       joe            .presage  .Xauthority                模板    
.bash_history  .compiz  .gconf      .local         .profile  .xsession-errors           视频    
.bash_logout   .config  .gitconfig  .mozilla       .ssh      .xsession-errors.old       图片    
//进入.ssh查看里面的文件
ubuntu@myUbuntu:~$ 
cd .ssh/

ubuntu@myUbuntu:~/.ssh$ ls
id_rsa  id_rsa.pub  known_hosts//有3个文件分别是私钥,公钥,以及已经相互建立的关联主机。
//主要是前2个秘钥的文件。你也可以查看一下里面的内容。
//如果没有,那么进行如下设置

设置SSH秘钥

//命令如下(邮箱换成自己的啊)
&ssh-keygen
-t rsa -C "youremail@example.com"
//设置的过程中,可能会问一些问题或者设置一些参数(不用慌,可以耐心的看一下这些问题,提高一下自己的英语。)使用默认值(直接回车)或者yes 就可以了。
//然后查看用户主目录下发现已经有了秘钥那2个文件了。

将自己的公钥告诉远程库,建立SSH连接。

利用你注册的账号,登录以后按照图片指示操作(也不必必须按照下面的来,你也可以自己摸索一下这个网站)。

01

 

如果后期上时间没有使用git,突然使用时,发现push的时候,出现如下问题:

joe@a:~/github/Qt/source$ git push
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

 

可能是你的权限被进制了 。需要重新把公钥在github settings中这是一下。

对于在Linux下面把公钥文件内容复制到Linux系统剪切板中的命令如下:

joe@a:~/.ssh$ cat id_rsa.pub | xsel -b

 

可以自行查看学习一下xsel命令工具。


添加远程连接

 

 

 

 

02

成功以后,首个库,网站会给你提示信息,如下(其中有2中协议HTTP和SSH,你可以选择,下面还有一些提示帮助,不放阅读一下。)

04


下载远程库和提交

摸索找到库的详细信息(如下网页)

05

//根据GitHub的提示,在本地的learngit仓库下运行命令:
$ 
git remote add origin git@github.com:michaelliao/learngit.git
//git@github.com:michaelliao/learngit.gi替换成复制的SSH,这里设置远程库的名字就是origin
//把本地的内容推送到远端库
$ 
git push -u origin master
    //实际上是把当前分支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 git@github.com:michaelliao/learngit.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
//由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
//从现在起,只要本地作了提交,就可以通过命令:
$ 
git push origin master

连接和推送时的SSH警告

//当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
//这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的//Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
//Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
//这个警告只会出现一次,后面的操作就不会有任何警告了。

克隆库

上面说了那么多主要是建立连接,连接我们只建立一次就可以了.平时用的最多的是克隆和推送库.

ubuntu@myUbuntu:~/joe$ ls    //只有一个本地库
learngit
ubuntu@myUbuntu:~/joe$ 
mkdir testgit
    //新建一个本地库
ubuntu@myUbuntu:~/joe$ 
cd testgit/

ubuntu@myUbuntu:~/joe/testgit$ ls
ubuntu@myUbuntu:~/joe/testgit$ 
git init
    //库的初始化
初始化空的 Git 版本库于 /home/ubuntu/joe/testgit/.git/
ubuntu@myUbuntu:~/joe/testgit$ 
git clone git@github.com:joesGit15/git-test.git
    //克隆库
正克隆到 'git-test'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (3/3), 完成.
检查连接... 完成。
ubuntu@myUbuntu:~/joe/testgit$
ls
    //克隆成功
git-test
ubuntu@myUbuntu:~/joe/testgit$ cd git-test/
ubuntu@myUbuntu:~/joe/testgit/git-test$ ls
README.md

再次练习库的推送

ubuntu@myUbuntu:~/joe/testgit/git-test$ ls
README.md
ubuntu@myUbuntu:~/joe/testgit/git-test$ 
git status
    //查看库的状态
位于分支 master
您的分支与上游分支 'origin/master' 一致。
无文件要提交,干净的工作区
ubuntu@myUbuntu:~/joe/testgit/git-test$ 
vi README.md
 //修改文件
ubuntu@myUbuntu:~/joe/testgit/git-test$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
  (使用 "git add <file>..." 更新要提交的内容)
  (使用 "git checkout -- <file>..." 丢弃工作区的改动)

    修改:     README.md

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
ubuntu@myUbuntu:~/joe/testgit/git-test$
git add README.md
 //添加
ubuntu@myUbuntu:~/joe/testgit/git-test$ git status    
位于分支 master
您的分支与上游分支 'origin/master' 一致。
要提交的变更:
  (使用 "git reset HEAD <file>..." 撤出暂存区)

    修改:     README.md

ubuntu@myUbuntu:~/joe/testgit/git-test$ 
git commit -m "test"
    //提交
[master c287068] test
 1 file changed, 1 insertion(+)
ubuntu@myUbuntu:~/joe/testgit/git-test$ git status
位于分支 master
您的分支领先 
'origin/master'1
 个提交。//只有提交以后,才会显示不一致
  (使用 "git push" 来发布您的本地提交)
无文件要提交,干净的工作区
ubuntu@myUbuntu:~/joe/testgit/git-test$ git push origin master//推送
对象计数中: 3, 完成.
写入对象中: 100% (3/3), 261 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:joesGit15/git-test.git
   111509c..c287068  master -> master
ubuntu@myUbuntu:~/joe/testgit/git-test$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
无文件要提交,干净的工作区
posted @ 2015-05-12 19:35  [0]  阅读(1580)  评论(0编辑  收藏  举报