Git和SVN的对比:git
1)Git是分布式的,SVN是集中式;程序员
2)Git每一个历史版本存储完整的文件,SVN存储文件的差别;github
3)Git可离线完成大部分操做,SVN则必须与中央服务器进行网络交互;服务器
4)Git有着优雅的分支和合并功能;网络
5)Git有着更强的撤销修改和修改版本历史的能力;ssh
6)Git速度更快,效率更好;分布式
Git安装:工具
CentOS6.5环境:yum install git学习
下载源码进行编译再安装:本身查阅网络资料网站
which -a git 查看git的安装位置
git version 查看git的版本
建议你们先在GitHub上面注册一个帐号
如何学习Git的命令:git help
添加user.name和user.email
git config --global user.name fyuan925
git config --global user.email fyuan925@gmail.com
获得user.name/user.email
git config user.name
git config user.email
添加一个新的user.name
git config --global --add user.name kgc
获得属性的值
git config user.name
git config --get user.name
获得全局全部属性的值
git config --list --global
删除一个属性,而且是指定属性名进行删除
git config --global --unset user.name kgc
git config --list --global
当只有一个属性值的时候,咱们能够在删除时不指定值
git config --global --unset user.name
git config --list --global
git config --global user.name fyuan925
git config --list --global
Git命令的基本使用(版本控制工具只能跟踪文本文件的改变):
git init 建立仓库
添加一个readme.txt
git status 查看当前版本库的状态(查看暂存区的工做状态)
git add filename 使用git add命令告诉git,把该文件添加到仓库
git commit -m 'comment' 使用git commit命令告诉git,把文件提交到仓库
将文件提交到仓库,须要两步:
1) add
2) commit
git add 能够反复添加多个
git diff 查看修改的内容
git log 能够查看全部的提交历史记录
git log filename 仅查看指定文件名的提交历史记录
git log --pretty=oneline filename
d085ee8434392d2cf88b48592f29fbeefb0818f7 commit id(版本号) SHA-1 Hash计算出来一个16进制的值
版本回退:
前提:知道当前版本是哪一个, HEAD表示当前版本(HEAD是指最后一次提交的commitid)
回退到上一个版本: HEAD^ 一个^就表是前一个版本, 若是N个前版本能够用HEAD~N
回退:git reset --hard HEAD^
回退以后你后悔了又想回到后退以前的那个版本: git reset --hard xxxxxxxxx
xxxxxxxxx 前面能够经过 git log filename
3commit <== HEAD
2commit
1commit
执行了git reset --hard HEAD^以后
3commit
2commit <== HEAD
1commit
git reset:版本穿梭, 可使用git log查看提交历史,以便肯定回退/穿梭到哪一个版本
HEAD这个指针执行当前版本(也是git版本回退快速的缘由)
git reflog:查看命令历史,以便肯定要回到将来/过去的哪一个版本(若是不知到到回退commitid可经过此命令查询)
什么是修改:新增一行、修改几个字符、删除一行、新增文件、删除文件
Git管理的是修改,而不是文件
git status :是工做区和暂存区的对比,若是检测出改变,会建议咱们add提交到暂存区或者撤销修改。
git commit:只是将暂存区提交到历史区,与工做区无关。
撤销修改:
没有提交到暂存区时,其实就在工做区: git checkout -- file
已经提交到暂存区了: 分两步:
1)git reset HEAD file 清空暂存区中的修改
2)git checkout -- file 清空工做区的修改
删除文件
手误删除,如何恢复: git checkout -- file
真删除版本库的文件:
1) git rm file
2) git commit -m 'xxx'
Git远程操做之添加远程库
生成ssh:ssh-keygen -t rsa -C 'kgc@gmail.com'
在GitHub上设置ssh的公钥
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuDoeVYFqwhspG7SrOMugb32+q8jwu0fRptuQuEREjeqsCVkGPVBuFJo3hEPwXhk87VAgEHGd6JQUEtL6CFkrld3GWcMuz+dlNTIQ1/tNnwDABvYo5/dXlR6WZ6sdn/3eT/KO1KnyQI0VDFg/smAtAVVr5guXAzg36hOAgzihh3ZVM0Gcg4cOzd0/rO5+hO7nK1q0W1Wk2aem5xX+FOWF+r+g+nQpIERL4I45JgL9rXYCPEfFnP+17FjLBAUSNNaoj4I49Z4EboyN/as58PXVPbEv7Xdhh7ARn7qFRdPKxkIhVTI/4ljIp4OAyfENYtD6qanhBu3P3WX/hYCiHN0Lww== 947186883@qq.com
与远程库创建链接
git remote add origin git@github.com:iamxuas/git_demo.git
git push -u origin master
git push 就是把当前分支(master)推送到远程
-u:第一次推送到master分支时,要设置了,后续就不须要再使用-u了
git push origin master
执行get push时出现错误及解决办法:
当执行命令git push -u origin master时报以下错误
解决办法:git remote set-url origin https://fdd8@github.com/fdd8/kgc_git.git,即在网址中添加GitHub的用户名便可。
再执行命令git push -u origin master时,就不会报错
远程库的两种方式
1)先有本地仓库,后有远程仓库
git remote add origin git@github.com:fangyuan925/kgc_git.git
git push -u origin master
第一次使用-u,后面再也不使用
2)先有远程仓库,再clone到本地(最多见的,通常都是先在GitHub上建立仓库,而后开发人员再clone到本地)
git clone xxxxxx
git push -u origin master
第一次使用-u,后面再也不使用
Git会串成一条时间线,这条时间线就是分支, 默认就是master
HEAD并非指向提交,而是指向master
v1 ==> v2 ==> v3
|
master
|
HEAD
v1 ==> v2 ==> v3 ==> v4
|
master
|
HEAD
master
|
v1 ==> v2 ==> v3 ==> v4 ==> v5 ==> v6
|
dev
|
HEAD(建立分支以后,HEAD就不指向master了,而是指向分支)
Master(将dev分支合并到master上)
|
v1 ==> v2 ==> v3 ==> v4 ==> v5 ==> v6
|
dev
|
HEAD
查看分支:
git branch
* master
*表示你当前所处的branch是哪一个
git checkout -b dev (建立分支)
-b表示建立而且切换分支(HEAD指向dev分支)
切换分支: git checkout xxxx
git merge dev 把dev分支合并到当前分支,由于咱们当前分支是master,因此就是将dev合并到master(使用的是Fast-forward模式:直接将master指向v6,存在冲突是Fast-forward模式就不行了)
master =>master
|
v1 ==> v2 ==> v3 ==> v4 ==> v5 ==> v6
|
dev
|
HEAD(建立分支以后,HEAD就不指向master了,而是指向分支)
删除分支: git branch -d dev
解决冲突:
feature1 : a.txt AND simple
master : a.txt & simple
master
|
v1 ==> v2 ==> v3 ==> v4 ==> v5 ==> v6
|
feature1
|
HEAD
在master和分支上分别对a.txt作了不一样修改以后,合并分支出现如下错误:
git merge feature1
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
cat a.txt
a.txt
在master和分支上分别对a.txt作了不一样修改以后,a.txt的内容以下:
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
<<<<<<< ======= >>>>>>>标记出不一样分支的内容
git log --graph --pretty=oneline --abbrev-commit
当Git没法自动合并分支时,就必须首先解决冲突,再提交,最后再merge
可使用git log --graph命令能够看到分支合并图。
分支管理策略:
1)master分支: 代码是稳定的,平时不能在上面干活的,仅仅是用来发布新版本用
2)dev分支:是不稳定的,bug、feature能够建立新的分支进行开发,最后再合并到master便可
bug-id 10000 bug-10000
标签操做总结:
git tag <name> 新建一个标签,默认是HEAD,也能够指定一个commit id
git tag -a <name> -m 'xxxxxx'指定标签信息
git tag 查看全部标签
git tag -d v0.1 删除标签
提交标签到GitHub:git push origin v1.0
将本地全部标签提交到远程github:git push origin --tags
若是tag已经推送到远程,要删除远程标签就须要麻烦一点,分2步:
1)删除本地tag: git tag -d v0.9
2)git push origin :refs/tags/v0.9
Git控制台颜色设置
git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto
颜色设置关闭
git config --global color.status false
忽略某些特殊文件不提交
1)只须要在git项目的根目录下建立一个.gitignore
2) 把须要提交的文件或者目录写到.gitignore
3)若是你真正想提交的文件已经被包含在.gitignore里面了,那么就须要使用-f进行强制提交
Git配置别名:
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.co checkout
配置别名完成以后在什么地方能看到呢?
默认在当前用户的根目录下有一个.gitconfig
cat .gitconfig
[user]
email = fyuan925@gmail.com
name = fyuan925
[color]
diff = auto
status = false
branch = auto
[alias]
st = status
ci = commit
br = branch
co = checkout
知识点总结:
分支管理
场景描述:开发一个新功能,预计一周完成,你三天开发好了70%的代码,可是还没连调,若是此时马上提交,因为代码还没写完,不完整的代码库会致使别人不能干活。若是等代码所有写完再一次提交,又存在丢失天天进度的巨大风险。
分支的诞生:本身在本身的分支上开发,和别人互不影响,开发完成后再合并到master上去便可。
查看分支:git branch
建立分支:git branch <name>
切换分支:git checkout <name>
建立&切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
解决冲突时查看分支合并图:git log --graph
Bug分支
Feature分支
标签管理
什么是标签(tag):是版本库的一个快照
发布一个新版本时,一般先在版本库中打一个标签,不管在未来的时候,取出某个标签的版本便可
建立标签:git tag <tagname>
查看全部标签:git tag
建立带有说明的标签:git tag -a <tagname> -m <desc>
查看标签的说明:git show <tagname>
删除标签:git tag -d <tagname>
推送一个本地标签:git push origin <tagname>
推送所有未推送的本地标签:git push origin --tags
删除一个本地标签:git tag -d <tagname>
删除一个远程标签:git push origin:refs/tags/<tagname>
多人协做
开源项目确定都是不少人参与到社区中,经过协做完成
多人协做经常使用操做
克隆远程仓库:git clone
查看远程信息:git remove (-v)
解决冲突问题
推送分支:git push origin <branch-name>
建立Pull Request
(https://www.zhihu.com/question/21682976)
GitHub经常使用操做介绍
能够将我的的开源项目放在GitHub中,既可让别人参与你的项目,你也能够参与到别人的开源项目中去
但愿你们能真正参与带本身感兴趣的开源项目中去,作到从开源中来,而后回馈到开源中去
GitHub经常使用操做:clone、fork、watch、star
GitHub经常使用操做之博客
相信不少人都有写博客的习惯,免费和收费的都有
近些年,一些程序员开始在github网站上搭建blog。他们既拥有绝对管理权,又享受github带来的便利----无论什么时候何地,只要向主机提交commit,就能发布新文章
更妙的是,这一切仍是免费的,github提供无限流量,世界各地都能访问
使用GitHub搭建博客
GitHub经常使用操做之组织
除了我的帐户外,GitHub还提供被称为组织(Organizations)的帐户
组织帐户和我的帐户同样都有一个用于存放所拥有项目的命名空间,可是许多其余的东西都是不一样的
组织帐户表明了一组共同拥有多个项目的人,同时也提供一些人具用于对成员进行分组管理
一般,这种帐户被用于开源群组(例如:“perl”或者“rails”),或者公司(例如:“google”或者“twitter”)
经过GitHub建立组织
Git其余功能介绍
Git颜色设置
设置颜色:git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto
颜色设置关闭:git config --global color.status false
忽略特殊文件
1)只须要在git项目的根目录下建立一个.gitignore
2) 把须要提交的文件或者目录写到.gitignore
3)若是你真正想提交的文件已经被包含在.gitignore里面了,那么就须要使用-f进行强制提交
设置经常使用命名别名
git config --global alias.st status