github  安装配置以及使用遇到的一些问题

Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理。在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中。目前,包括Rubinius和Merb在内的很多知名项目都使用了Git。Git同样可以被诸如Capistrano和Vlad the Deployer这样的部署工具所使用。同样,eoe.cn客户端的源码也托管在github上。

1 注册账户以及仓库

要想使用github第一步当然是注册github账号了。之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之后会出现一些仓库的配置信息,这也是一个git的简单教程。

2配置Git

首先在本地创建ssh key;
 $ ssh-keygen -t rsa -C "your_email@youremail.com"
后面的your_email@youremail.com改为你的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key。

回到github,进入Account Settings,左边选择SSH Keys,Add SSH Key,title随便填,粘贴key。为了验证是否成功,在git bash下输入:
 $ ssh -T git@github.com  
如果是第一次的会提示是否continue,输入yes就会看到:You’ve successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github。

接下来我们要做的就是把本地仓库传到github上去,在此之前还需要设置username和email,因为github每次commit都会记录他们。

$ git config --global user.name "your name"
$ git config --global user.email "your_email@youremail.com"

进入要上传的仓库,右键git bash,添加远程地址:
$ git remote add origin git@github.com:yourName/yourRepo.git 
后面的yourName和yourRepo表示你再github的用户名和刚才新建的仓库,加完之后进入.git,打开config,这里会多出一个remote “origin”内容,这就是刚才添加的远程地址,也可以直接修改config来配置远程地址。

3.提交、上传

以创建一个hello world为例:

1远端git上建立Repository

到github首页,点击页面右下角“New Respository”

填写项目信息:
project name:hello world
description:my first project 点击“Create Repository” ; 现在完成了一个项目在github上的创建。

2. 我们需要使用git在本地创建一个相同的项目。

$ makdir ~/hello-world    //创建一个项目hello-world
$ cd ~/hello-world //打开这个项目
$ git init //初始化
$ touch README
$ git add README //更新README文件
$ git commit -m 'first commit'//提交更新,并注释信息“first commit”
$ git remote add origin git@github.com:defnngj/hello-world.git //连接远程github项目
$ git push -u origin master //将本地项目更新到github项目上去

------------------------------------关于可能出现的错误----------------------------------

github连接出现Bad file number问题

错误提示:     ssh:connect to host github.com port 22: Bad file number

自己写一个config配置文件(官网上帮助文档如是说),放到RSA相同目录下:

config:

Host github.com
User balfish
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
port 443

原因:22端口是默认的ssh连接端口,不过貌似这个服务有很多弱点,所以系统默认不开放。那么换一个端口,443端口,它是用来支持https服务的,这个端口默认开放。

接下来运行ssh -T git@github.com

再选择yes后在rsa的路径下生成一个known_hosts的文件,打开看了就发现其实就是一个类似cookie的文件。当这个文件存在时以后就不用费劲的输入yes了,直接就连接上了。

在公司因为用了gitlab和github两个ssh key

配置github/gitlab 管理多个ssh key :

FIRST ssh key:

第一次使用ssh生成key,默认会在用户~(根目录)下生成 id_rsa, id_rsa.pub 2个文件;所以需要添加多个ssh key时也会生成对应的私钥和公钥

$ ssh-keygen -t rsa -C "youremail@xxx.com"

在Git Bash中执行这条命令一路回车,会在 ~/.ssh/ 目录下生成 id_rsa 和 id_rsa.pub 两个文件,用文本编辑器将 id_rsa_pub 中的内容复制一下粘贴到github(gitlab)上。

SECOND ssh key:

$ ssh-keygen -t rsa -C "youremail2@xxx.com"

注意不要一路回车,要给这个文件起一个名字, 比如叫 id_rsa_github, 所以相应的也会生成一个 id_rsa_github.pub 文件。

目录结构:

config
id_rsa
id_rsa.pub
id_rsa_github
id_rsa_github.pub
known_hosts

修改配置文件:

# gitlab
Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa # github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github

回退:

case 1: 没有执行git add(改乱了工作区的内容)

git checkout -- file

case 2: 执行了git add(改乱了内容还添加到了暂存区)

step : git reset HEAD file
step : git checkout -- file

case 3:提交了不合适的修改到版本库时,想要撤销本次提交

git reset --hard commit_id
git log  #可以查看提交历史,以便确定要回退到哪个版本。
  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

git revert 和git reset:

假设当前有3个commit:

commit3:  save3
commit2: save2
commit1: save1

执行 git revert HEAD xx 之后,会提示提交信息,提交后git  log如下:

commit4:  Reverts “save2”
commit3: save3
commit2: save2
commit1: save1

执行完后,save2被删除了,运行git status,无变化。

执行 git reset HEAD xx之后,再次看git  log,如下

commit2:  save2
commit1: save1

执行完后,commit3被删除了;但是save3还在本地缓存区,运行git  status,可以看见提示save3可以用git add包含该文件。

总结:

1 git revert 是用一次新的commit来回滚之前的commit.git reset是直接删除指定的commit

2 回滚的这一操作来看,效果差不多.但是在之后merge时候有区别.因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入

3事实上, git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容

上一篇:Oracle PL/SQL Developer集成TFS进行团队脚本文件版本管理


下一篇:linux --> fork()详解