什么是Git jquery
Git是一种很是流行的分布式版本控制系统,它和其余版本控制系统的主要差异在于Git只关心文件数据的总体是否发生变化,而大多数版本其余系统只关心文件内容的具体差别,这类系统(CVS,Subversion,Perforce,Bazaar 等等)git
每次记录有哪些文件做了更新,以及都更新了哪些行的什么内容github
Git另外一个比较好的地方在于绝大多数操做均可以在本地执行,而每一个本地均可以从服务器获取一份完整的仓库代码数据库
并且在没网时仍然能够修改和使用大部分命令,在方便时再跟服务器进行同步,这样能够更好的实现多人联合编程编程
另外我的感受Git系统的强大在于它建立了一个个相似于快照的东西缓存
记忆咱们每一次的提交而且能够在将来的任什么时候候回到这里,对于大型项目的管理很是有效服务器
最原始的版本控制是纯手工的版本控制:修改文件,保存文件副本。有时候偷懒省事,保存副本时命名比较随意分布式
时间长了就不知道哪一个是新的,哪一个是老的了,即便知道新旧,可能也不知道每一个版本是什么内容ide
相对上一版做了什么修改了,当几个版本过去后,极可能就是下面这个老土的样子了:fetch
Git特色
分布式相比于集中式的最大区别在于开发者能够提交到本地
每一个开发者经过克隆(git clone),在本地机器上拷贝一个完整的Git仓库
直接记录快照,而非差别比较 : Git 更像是把变化的文件做快照后,记录在一个微型的文件系统中
近乎全部操做都是本地执行 :在 Git 中的绝大多数操做都只须要访问本地文件和资源,不用连网
时刻保持数据完整性 :在保存到 Git 以前,全部数据都要进行内容的校验和(checksum)计算
并将此结果做为数据的惟一标识和索引
多数操做仅添加数据 :经常使用的 Git 操做大多仅仅是把数据添加到数据库
开发流程示意图:
一、基本概念
Stage:暂存区,缓存区
Repository:仓库(本地仓库).git目录
Remote:远程仓库
Track: 将一个新文件加入到git
Unstage:取消放入暂存区
Git存储原理
Git 保存的不是文件差别或者变化量,而只是一系列文件快照。
快照管理:(微型文件系统,文件指纹验证是否变化,不便的直接连接)
三种区域
全部数据存放在本地.git目录,能够直接拷贝。
二、基本操做
2.一、仓库建立
Git init
2.二、仓库复制
Git clone url
只会复制master下来
Git clone url dir
指定文件夹
git clone https://github.com/libgit2/libgit2 mylibgit
2.三、文件管理
2.3.一、添加文件到暂存区
Git add *
Git add file
Git add dir
2.3.二、删除文件到暂存区
Git rm
2.3.三、修改文件名(移动)到暂存区
Git mv [file-orgin] [file-rename]
2.3.四、提交暂存区到仓库
Git commit –m “注释”
2.3.五、撤销修改文件
修改的文件能够在git status观察到
若是撤销修改
能够采用git checkout -- file的方式撤销
撤销全部
git checkout -- *
2.3.6 撤销暂存区数据
2.四、分支管理
查看分支:git branch
建立分支:git branch <name>
切换分支:git checkout <name>
建立+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
默认使用fast-forward模式
能够禁用,合并时会生成一个新的commit
git merge --no-ff -m "merge " dev
删除分支:git branch -d <name>
远程分支下载:git checkout -b <本地分支名> origin/<远程分支名>
合并冲突:
当merge出现冲突的时候,git会提醒
须要手动修改后进行提交
Git add
Git commit
2.五、版本管理
每一个提交都是一个版本,git提供了一些方便的命令供咱们使用。
2.5.一、查看日志
Git log
当前分支的commit历史
有用的配置
log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
Git reflog
显示引用变化历史,至关于head变化
2.5.二、版本回退:
一个git reset --hard HEAD^
俩git reset --hard HEAD^^
多个git reset --hard HEAD~数字
回退到指定版本
git reset --hard commit_id
commitid能够从reflog或者log中查看
--hard表示丢弃暂存区的东西
--soft – 暂存区和工做目录都不会被改变,改变都放在暂存区
--mixed – 默认选项。缓存区和你指定的提交同步,但工做目录不受影响,改变不会放在暂存区。
--hard – 缓存区和工做目录都同步到你指定的提交
Git revert
reset是指将当前head的内容重置,不会留任何痕迹。
revert是撤销某一次提交,可是此次撤销也会做为一次提交进行保存
假设当前有3个commit,git log以下:
commit3: add test3.c
commit2: add test2.c
commit1: add test1.c
执行 git revert HEAD~1以后,会提示提交信息,提交后git log以下:
commit4: Reverts “test2.c”
commit3: test3.c
commit2: test2.c
commit1: test1.c
执行完后,test2.c被删除了,运行git status,无任何变化。
执行 git reset HEAD~1以后,再次看git log,以下:
commit2: test2.c
commit1: test1.c
执行完后,commit3被删除了
可是test3.c还在本地缓存区,运行git status,能够看见提示test3.c能够用git add包含该文件。
若执行git reset --soft HEAD~1,log为:
commit2: test2.c
commit1: test1.c
执行完后,test3.c也被删除了,查看git status,提示能够commit以提交test3.c,test3.c在暂存区。
若执行git reset --hard HEAD~1,log为:
commit2: test2.c
commit1: test1.c
执行完后,test3.c也被删除了,查看git status,无任何变化。
2.六、标签管理
2.6.一、打标签
至关于给某个提交取一个好记住的名字,例如v1.0.0
git tag v1.0.0 [commitid]
2.6.二、显示全部标签
git tag
2.6.三、显示标签信息
Git show tagname
2.6.四、标签管理
命令git push origin <tagname>能够推送一个本地标签;
命令git push origin --tags能够推送所有未推送过的本地标签;
命令git tag -d <tagname>能够删除一个本地标签;
命令git push origin :refs/tags/<tagname>能够删除一个远程标签。
2.七、远程管理
通常都要和两部分人提供
2.7.一、git clone
从远程主机克隆一个版本库
git clone <版本库的网址> <本地目录名>
2.7.二、git remote
为了便于管理,Git要求每一个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
列出全部主机:git remote
带网址列出主机:git remote –v
clone版本库的时候,所使用的远程主机自动被Git命名为origin
若是想用其余的主机名,须要用git clone命令的-o选项指定。
git clone -o jQuery https://github.com/jquery/jquery.git
git remote show命令加上主机名,能够查看该主机的详细信息。
git remote show <主机名>
git remote add命令用于添加远程主机。
git remote add <主机名> <网址>
git remote rm命令用于删除远程主机。
git remote rm <主机名>
git remote rename命令用于远程主机的更名。
git remote rename <原主机名> <新主机名>
2.7.三、git fetch
将某个远程主机的更新,所有取回本地。
若是只想取回特定分支的更新,能够指定分支名。
git fetch <远程主机名> <分支名>
所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取
好比origin主机的master,就要用origin/master读取。
git branch –r,能够用来查看远程分支,
-a选项查看全部分支。
能够采用git checkout <远程主机名>/ <分支名>切换到该分支
可是通常用git checkout -b newBrach <远程主机名>/ <分支名>
意思是在<远程主机名>/ <分支名>的基础上,建立一个新分支。
也可使用merge,合并远程分支。
2.7.四、git pull
取回远程主机某个分支的更新,再与本地的指定分支合并。
git pull <远程主机名> <远程分支名>:<本地分支名>
等同于先作git fetch,再作git merge
2.7.五、git push
命令用于将本地分支的更新,推送到远程主机。
git push <远程主机名> <本地分支名>:<远程分支名>
省略远程分支名,表示将本地分支推送与之存在"追踪关系"的远程分支(一般二者同名)
若是该远程分支不存在,则会被新建。省略本地分支名,则表示删除指定的远程分支
若是当前分支与远程分支之间存在追踪关系,则本地分支和远程分支均可以省略。
若是本地版本低,那么会报错,能够--force强制push,--tags表示也推送tags.
git push --force origin
2.7.六、将本地库推到远程端
git push origin master
2.八、自定义Git
2.8.一、自定义命令
能够利用git config命令来给命令取别名。
例如
git config --global alias.co csheckout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'
其中,global表示针对当前用户全部仓库都起做用
若是不加,表示只对当前仓库有用,每一个仓库的Git配置文件都放在.git/config文件中:
当前用户的config存放在用户主目录下的一个隐藏文件.gitconfig中:
2.8.二、忽略文件
为了防止没用的文件被提醒untracked,能够在git仓库主目录下添加.gitignore文件
(自己要放到版本库里面),该文件能够配置git要忽略哪些文件,不添加到仓库中。
若是发现不能添加文件,能够采用
git check-ignore -v file检查被哪一个规则忽略了