平台:centos6.5
git版本:git version 2.14.1
工具:xshell
第一步:在任意一个目录下创建一个文件夹:(比如说创建haha) 只要这个目录里面要有你要上传到github的文件
第二步:将项目目录中的文件全都拷贝到haha这个目录里面。
报错:出现
cp: omitting directory `chatSystem/client/'
cp: omitting directory `chatSystem/comm/'
cp: omitting directory `chatSystem/lib/'
cp: omitting directory `chatSystem/window/'
cp: omitting directory `chatSystem/window/'
这个是说明目录下面还有目录,所以需要递归拷贝,即加入-r选项
另外,在如果需要将一个目录下所有的文件拷贝过去,可以用*来代替所有的文件,
如上面的cp -r chatSystem/client/ chatSystem/comm/ chatSystem/lib/ chatSystem/window/ chatSystem/window/ chatSystem/Makefile haha/
就可以写为cp -r chatSystem/* haha,意思就是将chatsystem下的所有文件都拷贝到haha。
第三步:进入这个文件夹,通过命令git init把这个文件夹变成Git可管理的仓库
通过ls -a命令可以看到当面文件夹下多出一个.git文件。
第四步:输入git add .
这个是将项目上所有的文件添加到仓库中的意思,如果想添加某个特定的文件,只需把.换成这个特定的文件名即可。
第五步:输入git commit -m "first commit",双引号里面的内容随便写。
第六步:打开github,点击右上角的加号,选择其中的New repository(新的仓库,读音是[rɪˈpɒzɪt(ə)ri]),之后在出现的Repository name一栏填写任意的库名。接着点击最下面的create repository,之后在出现的页面将SSH后的链接复制。
第七步:查看虚拟机上有没有相应的SSH密钥。
可以看到里面有相应的密钥(这里的id_rsa我自己觉得是用RSA加密算法生成的密钥,id_rsa_pub是用RSA算法生成的公钥,pub是public的意思)。这里不再赘述密钥的生成过程,如果没有密钥,可以参考这篇文章:《Permission denied(publickey). fatal: Could not read from remote repository.》
如果有密钥。我们需要将公钥部分也就是id_rsa.pub里面的内容拿出来,可以输入cat id_rsa.pub,也可以输入vi id_rsa.pub.。我这里只输入cat id_rsa.pub。
将得到的以ssh-rsa开头的一大段字符串复制。
打开github,选择右上方自己的图标,注意不是点击加号,选择里面的Settings,接着在出现的页面点击最左边的SSH and GPG keys一栏
点击 New SSH key
Title随便写,将刚才得到的id_rsa.pub里面的以ssh-rsa开头的一大段字符串复制到下图中的Key中
第八步:github上的repository(git库)与虚拟机上的本地库关联
$ git remote add origin 自己远程仓库(即github上的)的url地址。这个origin是远程库在本地的别名,可以随便起名比如git remote add pb +url
比如上面的我的url仓库地址是git@github.com:lixuhao/wdqw.git。则输入git remote add origin git@github.com:lixuhao/wdqw.git
如果出现提示信息:fatal: remote origin already exists.(远程地址已经存在)
解决方法:输入git remote rm origin(删除掉以前的地址),rm是删除的意思。
之后重新输入git remote add origin git@github.com:lixuhao/wdqw.git
如果创建项目时没有下面这个:
可以在生成的项目里找到Clone or download,然后点击,如下图:
这样就有项目的链接了(看见上面有这个Use HTTPS了吗,点击这个可以将url换成https开头的)。
关于使用git remote add 远程库的本地库名+ 远程库的url,即创建远程库的本地别名出现的问题:如下
usage: git remote add [<
options
>] <
name
> <
url
>
-f, --fetch fetch the remote branches
--tags import all tags and associated objects when fetching or do not fetch any tag at all (--no-tags)
-t, --track <
branch
> branch(es) to track
-m, --master <
branch
> master branch
--mirror[=<
push
|fetch>] set up remote as a mirror to push to or fetch from
总是一直出现这个usage,我的解决方法是换为root,然后改了origin为pb这个名称,然后竟然好了。本目录下生成了pb库。
这一步完了可以使用git remote查看当前配置有哪些远程仓库,可以用 git remote 命令,它会列出每个远程库的简短名字.在克隆完某个项目后,至少可以看到一个名为 origin 的远程库。
git remote -v | --verbose 列出详细信息(|是或者的意思,只需要执行git remote -v或者git remote --verbose),在每一个名字后面列出其远程url。如:
$ git remote -v
origin git://github.com/schacon/ticgit.git
第九步:git push -u origin master (在执行这一步的时候,会有提示让你输入github的用户名和密码,)
由于新建的远程仓库是空的,所以要加上-u这个参数,等远程仓库里面有了内容之后,下次再从本地库上传内容的时候只需输入git push origin master
最后就会出现100%done ,Branch master set up to track remote branch master from oragin等字样,表示成功。
关于中间可能会出现问题:
- 运行git push时出错,提示Permission denied (publickey),这个可以参考《Permission denied(publickey). fatal: Could not read from remote repository.》这篇文章虽然是针对unbuntu的,但是对于centos同样适用。
- 在git push的时候出现:Updates were rejected because the tip of your current branch is behind,如下我们很明显的看到有这个hint: 'git pull ...') before pushing again.,即说push之前应该pull,git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
$ git pull <远程主机名> <远程分支名>:<本地分支名>
比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
$ git pull origin next:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin next 当然,若不想merge远程和本地修改,可以先创建新的分支:
git branch [name]
然后push
git push -u origin [name]
- 在git pull的时候 提示fatal: refusing to merge unrelated histories ,这个只要在后面加上 --allow-unrelated-histories。如git pull origin master --allow-unrelated-histories
- 出现Please enter a commit message to explain why this merge is necessary,...",这个就是一个vi界面,直接在末行模式下输入:wq。按enter键。但是我遇到的不是vi界面,是一个可编辑的类似于vi界面,下面是一些选项,比如^X ,^G等等,而我们不管他,直接看哪个表示退出,比如^X表示退出,则ctrl+X,然后问你保存吗,也不管,不保存都行,然后出去了,接着使用git push -u pb master. 会让你输入github的用户名和密码。如下:
注意,我在这让又遇到一个问题就是我不知道啥时候改成root权限,然后出现 fatal:unable to auto-detect email address (got 'root@ubuntu.(none)')错误,然后我退出了root变成用户名。再执行 git push -u pb master就没这个问题了。如下图: