http://blog.csdn.net/pipisorry/article/details/44671529
已经在本地创建了一个Git仓库后(前提是已经创建本地库[$ cd 'E:\mine\pythonworkspace' $ git init])[Git版本控制教程 - Git本地仓库],又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。
GitHub这个网站就是提供Git仓库托管服务的,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
到https://github.com/注册用户
在用户主目录下,如果已经有了.ssh目录下且包含id_rsa
和id_rsa.pub
文件,可直接跳到第2步。
如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
Note: 需要把邮件地址换成你自己的邮件地址,一路回车,使用默认值即可,无需设置密码, 这里一般不使用密钥。
在用户主目录里找到.ssh
目录(C:\Users\pi\.ssh),里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
“Account settings” > “SSH Keys” > “Add SSH Key” > 填上任意Title > 在Key文本框里粘贴id_rsa.pub
文件的内容 > “Add Key”
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到的(但只有你自己才能改)。所以,不要把敏感信息放进去。
如果你不想让别人看到Git库,有两个办法:
一个是交费,让GitHub把公开的仓库变成私有的,这样别人就看不见了。
另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。
[在GitHub多个账号上使用不同的SSH的配置方法]
皮皮Blog
登陆GitHub > 右上角“Create a newrepo” > 创建新的仓库 > 填写仓库名 如在Repositoryname填入python_workspace ,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库.
目前,在GitHub上的这个python_workspace仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
给远程的代码库起个别名git remote add <alias><remote address>
在本地的python_workspace仓库(当前git目录)下运行命令:
$ git remote add origin [email protected]:pplove/python_workspace.git
Note:
1. 上面的地址来自你的账户 >选择某个账户 > 点击https右边的ssh就会出现对应的ssh地址(也就是你的repository对应的ssh地址)
这里要注意地址要用ssh地址,而不是http地址!!上面列出的地址只有 origin 用的是 SSH URL 链接,只有这个仓库能推送数据上去。http不行,但是可以通过 HTTP 克隆和获取仓库的内容。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
2. 请千万注意,把上面的pplove替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。
3. 添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。如果提示已经存在这个远程库名,可以改成另一个名字。
下一步,就可以把本地库的所有内容推送到远程库上:
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
$ 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
* [newbranch] master -> master
Branch master set up to track remote branch master fromorigin.
Note:
1. 注意要先有已经commit好的本地仓库。Git本地仓库
2. 把本地库的内容推送到远程,用gitpush命令,实际上是把当前分支master推送到远程。
3.注意,如果在github上创建了一个readme.md,则先要执行git pull origin master将readme.md拉取下来,保持远程和本地数据一致,不然就会git push失败:error: failed to push some refs to '[email protected]:...'.updates were rejected because the remote contains work that you do not have locally.
4. 推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样。
从现在起,只要本地作了提交,就可以通过命令:
git push (使用当前分支并push到远程对应分支)
git push origin dev (指定分支push)
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
Note:Git 1.x 的默认行为是matching,其意是如果你执行 git push 但没有指定分支,它将 push 所有你本地的分支到远程仓库中对应匹配的分支。而 Git 2.x 默认的是 simple,意味着执行 git push 没有指定分支时,只有当前分支会被 push 到你使用 git pull 获取的代码。
将所有本地分支都推送到origin主机
git push --all origin
--force选项
如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用--force选项。
$ git push --force origin
上面命令使用--force选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用--force选项。
git diff origin/dev...HEAD --name-status
Note: dev可以为任何分支名;去掉--name-status则显示每个文件的具体变化,加上则只显示有变化的文件。显示结果中D代表delete的文件;A代表add的文件;M代表modified的文件。
[使用Git如何查看即将被push上去的代码差异]
SSH警告
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can'tbe 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添加到本机的一个信任列表里了。
[Git使用上ssh协议授权]
git pull <alias> <branch name>
如git pull origin dev
远程库创建总结
echo # Crawler >> README.md git init git add . git commit -m "first commit" git remote add origin [email protected]:***/***.git git push -u origin master
git remote add origin [email protected]:***/***.git git push -u origin master
Note:
1. 上面就是来自在github上创建完一个repository后的提示。
2. 注意git管理是可以嵌套的,一个大目录(对应远程的repository1)下面可以有好多小目录(对应远程的repository2-n)。这样push后也会对应到不同远程中。
>>dev
git checkout -b dev
git push -u origin dev
冲突文件冲突的地方会有如下提示
a123 <<<<<<< HEAD b789
=======
b45678910
>>>>>>> 6853e5ff961e684d3a6c02d4d06183b5ff330dcc
c
冲突标记<<<<<<< (7个<)与=======之间的内容是A的修改,=======与>>>>>>>之间的内容是B的修改。
此时,还没有任何其它垃圾文件产生。你需要把代码合并好后重新走一遍代码提交流程就好了。
Note:在git push后出现错误可能是因为其他人提交了代码,而使你的本地代码库版本不是最新。这时你需要先git pull代码后,检查是否有文件冲突。没有文件冲突的话需要重新走一遍代码提交流程add —> commit —> push。
git子项目submodule
开发过程中,经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用。
为当前工程添加submodule
git submodule add 仓库地址 路径
Note:
1. 仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
2. 路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone)
命令执行完成,会在当前工程根路径下生成一个名为“.gitmodules”的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。
删除git子项目
首先删除.gitmodules文件中相应配置信息。然后git rm –cached命令将子模块所在的文件从git中删除。
下载带有submodule的工程
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:
git submodule update --init --recursive
这样子模块内容下载下来后工程才不会缺少相应的文件。
皮皮Blog
之前我们是先有本地库,后有远程库的时候,学习如何关联远程库。现在我们
先创建远程库,然后从远程库克隆,这个可以实现多人合作,远程库不一定是自己创建的。
$ git clone [email protected]:pplove/***_workspace.git
参见[Git版本控制教程 - Github的使用:多人协作及参与项目]
GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。
搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt
命令就可以完成安装。
sudo
权限的用户账号,开始安装git
第一步,安装git
:
$ sudo apt-get install git
第二步,创建一个git
用户,用来运行git
服务:
$ sudo adduser git
第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub
文件,把所有公钥导入到/home/git/.ssh/authorized_keys
文件里,一行一个。
第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git
,在/srv
目录下输入命令:
$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git
结尾。然后,把owner改为git
:
$ sudo chown -R git:git sample.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd
文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git
用户可以正常通过ssh使用git,但无法登录shell,因为我们为git
用户指定的git-shell
每次一登录就自动退出。
第六步,克隆远程仓库:
现在,可以通过git clone
命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys
文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。
有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。这里不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。
ref:Git版本控制教程 - Github的使用
pycharm中进行git版本控制
http://www.liaoxuefeng.com/
目前世界上最为流行的代码托管网站