教程网站
廖雪峰的官方网站
阮一峰的官方博客--git远程操作详解
git教程
trygit.io
Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)
为什么学习git
1.装蛋(牛逼的大神们都在用),github全是绿色人真的让我羡慕
2.解决多人协作
3.提高开发效率,避免代码重复
4.有人推荐大学期间一定要了解markdown vim python git这几个工具,那个作者的理由是 学生时期时间多 可以随便折腾。。。。
git的身世
(其实我一直抵触写这种虚的玩意觉得没有什么用,现在明白这更多是对创作者的一种尊敬,和精神的传播。)
Linus在1991年创建了开源的Linux。
Linus在2005年,花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
现在的github已经成为一个社区,不光局限在软硬件还有人使用github出书,做blog,更多移步知乎问答git有什么奇技淫巧。
git与svn cvn的区别
CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统
svn cvn需要联网
git随时随地,离线开发,然后上传就ok
而且git的分支管理巨强大
远程仓库(github)
github由Tom Preston-Werner、Chris Wanstrath和PJ Hyett三人在2008年联合创立。从一个开发者社区变成了一个免费开源代码托管平台,在2011年的9月份,GitHub的用户数就已经突破了100万的关卡;到了今年1月,其又迎来了第300万的用户。也就是说,在短短的几个月内,该网站就迎来了50万的新用户。当前,GitHub雇用了超过150位员工。GitHub不仅是一个分享开源创作并与其它程序员合作的好地方,你也可以从GitHub上收到自己作品的反馈。用户可以提出复核、评论每一行的代码、报告问题、甚至询问其它用户的想法,并尝试将它们变成现实。
我个人特别敬佩github的公司,据说全公司从ceo到普通员工,不管是从事开发的工程师还是行政管理人员都特爱写代码,公司文化就是这样。
我们让协作和分享更轻松
这是github创立的目标,性感的目标,伟大的产品,相比当下的哪些互联网创业公司,得了。。。我还没有资格说他们。
扯多了,,,,,这就是情怀
git安装
linux自带git
window直接去git官网下载git的.exe软件,一直下一步/next就行
安装完linux直接在命令行里运行就行
window下鼠标右键Git Bash就出现下面的
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
这里的your name 和email地址换成自己的
创建远程仓库
1.注册github
git创建
先创建文件夹
然后输入$ git init 完成
这时可以发现当前目录下多了一个.git
的目录(有时候时不可见的 需要运行 ls -ah),不懂不要去修改里面的内容。。修改的后果我也不知道。。大不了一死
1、创建一个 SSH key
$ ssh-keygen -t rsa -C "[email protected]"
2.在本地创建ssh key,
ls ~/.ssh / 打开.ssh 文件
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
按3个回车,密码为空。
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rs和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
3.登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
代码参数含义:
-t 指定密钥类型,默认是 rsa ,可以省略。-C 设置注释文字,比如邮箱。-f 指定密钥文件存储文件名。
以上代码省略了 -f 参数,因此,运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key 代码,如:
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]
当然,你也可以不输入文件名,使用默认文件名(推荐),那么就会生成 id_rsa 和 id_rsa.pub 两个秘钥文件。
接着又会提示你输入两次密码(该密码是你push文件的时候要输入的密码,而不是github管理者的密码)
当然,你也可以不输入密码,直接按回车。那么push的时候就不需要输入密码,直接提交到github上了,如:
Enter passphrase (empty for no passphrase): # Enter same passphrase again:
接下来,就会显示如下代码提示,如:
Your identification has been saved in /c/Users/you/.ssh/id_rsa.
Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.
The key fingerprint is:
01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db [email protected]
当你看到上面这段代码的收,那就说明,你的 SSH key 已经创建成功,你只需要添加到github的SSH key上就可以了。
2、登陆github系统。点击右上角的 Account Settings—->SSH Public keys —-> add another public keys
3、把你本地生成的密钥复制到里面(key文本框中), 点击 add key 就ok了
测试
可以输入下面的命令,看看设置是否成功, [email protected]的部分不要修改:
$ ssh -T [email protected]
如果是下面的反馈:
The authenticity of host 'github.com (207.97.227.239)' can't be established.RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.Are you sure you want to continue connecting (yes/no)?
不要紧张,输入yes就好,然后会看到:
Hi cnfeat! You've successfully authenticated, but GitHub does not provide shell access.
设置用户信息
现在你已经可以通过SSH链接到GitHub了,还有一些个人信息需要完善的。
Git会根据用户的名字和邮箱来记录提交。GitHub也是用这些信息来做权限的处理,输入下面的代码进行个人信息的设置,把名称和邮箱替换成你自己的,名字必须是你的真名,而不是GitHub的昵称。
$ git config --global user.name "cnfeat"//用户名
$ git config --global user.email "[email protected]"//填写自己的邮箱
SSH Key配置成功
本机已成功连接到github。
若有问题,请重新设置。常见错误请参考:
GitHub Help - Generating SSH Keys
GitHub Help - Error Permission denied (publickey)
填好就行了。
ssh -Tv [email protected] 测试是否完成
github上建立仓库
登录后系统,在github首页,点击页面右下角「New Repository」
当前创建git的文件夹里新建文件
(这里用readme.txt为例)
首先在文件夹先新建一个readme.txt的文件
(千万不要使用Windows自带的记事本编辑任何文本文件)
把readme.txt添加到git仓库
成功的话,没有任何提示,git就是这样不废话,
git commit -m '提交第一个文件到git仓库'
-m 后面是你添加的注释,写代码不写注释,那你等着被打死吧。
上面的add是添加 commit是提交。。。。其实就是add到一个临时的地方叫做缓存区,然后等你全都确定无误,就可以提交了。
一些git 命令行
$ git status ---查看git状态
$ git diff ---查看有哪些修改
$ git log ---查看日志
$ git log --pretty=oneline ---在一行显示log
$ git log --graph 查看分支合并图
git log实例截图
这里需要了解的就是commit 就版本号,唯一确定,以后想会退到那个状态,只要知道commit的前几位就可以(基本7,8位就行 别1,2位就行)就可以
git常用功能
- git clone
- git remote
$ git remote -v
- git fetch
- git pull
- git push
移除远程库
有时候打错了,,想要换一个
git remote rm origin
git remote add origin [email protected]:Liutos/foobar.git
版本回退
$git reset --hard +版本号就可以
Git中,总是有后悔药可以吃
如果你git reset 后悔了
$ git reset --hard HEAD^
回退到上个版本
$ git reset --hard HEAD^^
回退到上上个版本
$ git reflog
查询版本号
这种“回退”就是在否认历史,如果有其他人也在用你的remote,你push以后将他置于何地呢?
所以,如果仅仅你自己在使用,那么强制push,命令是 git push -f 如果是与人合作,更漂亮的做法是revert,给个例子供参考
$ git checkout -- readme.txt
这些版本回退都是在你本地实现的
删除分支
$rm readme.txt
$git rm readme.txt
$git commit -m "你爱说什么说什么 例如删除分支"
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- readme.txt
在github上创建Create a new repo
在Repository name填入learngit
,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
这里我就直接用廖雪峰大神的原图了
添加远程库
$ git remote add origin [email protected]:yourgithubname/learngit.git
origin是远程库的意思,对应github的repository
$ git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样.
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
从github上克隆代码
git clone [email protected]:yourgithub/gitskills.git
所以我们只要知道对方或者自己的github账号以及项目名称就可以在github上获得源码(我们也可以直接在github网站上用网页直接图形化操作)
分支管理
谈谈我对分支管理的认识
首先一个项目是要多人协作,就会出现不同组件合并,相互研究对方代码,相同组件不同版本合并升级删除,这些操作,就算小项目都会折磨死你。
创建分支(命名为dev)
$ git branch dev
#创建分支
$ git checkout dev
#切换到dev分支
#简写如下
$ git checkout -b dev
Fast-forward快速合并分支
$ git merge dev
#把dev分支合并到当前分支
#so 你需要在合并前切换到master
这样是最基本的合并分支,只有在dev与master在相同的部分是没有改变得,dev只是增加了一个文件这样不产生冲突的情况下才成功合并
如果存在冲突就需要解决冲突才能合并
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
下面我们实战一下--no-ff方式的git merge:
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 + 1 file changed, 1 insertion(+)
删除分支
$ git branch -d dev
$ git branch -D dev
#强行删除,还没有合并的时候想要删除是会报错的 需要强制删除
git stash
关于git stash ,。。。。廖神叼
.gitignore
远程协助
看大神怎么说吧,我也说不清还是学学人家吧
远程协作,以及冲突处理,协作流程
小结贴上 留给自己复习 哈哈哈哈哈
到这里git的基本操作就学习完了
还有的例如搭建私有git服务器
自己研究吧
谢谢廖雪峰大神
虽然他看不到
代表所有想了解git的孩子们对大叔表示诚挚的问候
gitignore 后期修改无效的解决办法
Even if you haven't tracked the files so far, git seems to be able to "know" about them even after you add them to .gitignore.
NOTE : First commit your current changes, or you will lose them.
Then run the following commands from the top folder of your git repo:
git rm -r --cached .
git add .
git commit -m "fixed untracked files"