记录文件每次的更新,能够对每一个版本作一个快照,或是记录补丁文件,适合我的用,如RCS。git
全部的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传本身的修改github
全部的版本数据都存在服务器上,用户的本地只有本身之前所同步的版本,若是不连网的话,用户就看不到历史版本,也没法切换版本验证问题,或在不一样分支工做。并且,全部数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失全部的数据,固然能够按期备份。表明产品:SVN、CVS、VSS数据库
全部版本信息仓库所有同步到本地的每一个用户,这样就能够在本地查看全部版本历史,能够离线在本地提交,只需在连网时push到相应的服务器或其余用户那里。因为每一个用户那里保存的都是全部的版本数据,只要有一个用户的设备没有问题就能够恢复全部的数据,但这增长了本地存储空间的占用。安全
Git是目前世界上最早进的分布式版本控制系统。服务器
Git是免费、开源的编辑器
优势:分布式
缺点:工具
一直Next默认就行了,若是须要设置就要仔细读一下安装界面上的选项。fetch
使用git config -l 能够查看如今的git环境详细配置ui
#(1)查看系统config
#/etc/gitconfig:包含了适用于系统全部用户和全部项目的值。(Win:C:\Program Files\Git\mingw64\etc\gitconfig) --system 系统级 git config --system --list #(2)查看当前用户(global)配置
#~/.gitconfig:只适用于当前登陆用户的配置。(Win:C:\Users\Administrator\.gitconfig) --global 全局 git config --global --list #(3)查看当前仓库配置信息
#位于git项目目录中的.git/config:适用于特定git项目的配置。(Win:C:\gitProject) --local当前项目 git config --local --list
注意:对于同一配置项,三个配置文件的优先级是1<2<3
安装Git后首先要作的事情是设置你的用户名称和e-mail地址。这是很是重要的,由于每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:
$ git config --global user.name "zhoumo" #名称 $ git config --global user.email 838616767@qq.com #邮箱
#传递了--global 选项,--global为全局配置,不加为某个项目的特定配置。
#若是你但愿在一个特定的项目中使用不一样的名称或e-mail地址,你能够在该项目中运行该命令而不要--global选项。
添加配置项:
$ git config [--local|--global|--system] section.key value #[--local|--global|--system] #可选的,对应本地,全局,系统不一样级别的设置 #section.key #区域下的键 #value #对应的值
删除配置项:
$ git config [--local|--global|--system] --unset section.key
更多配置项:
$ git config --global color.ui true #打开全部的默认终端着色 $ git config --global alias.ci commit #别名 ci 是commit的别名 [alias] co = checkout ci = commit st = status pl = pull ps = push dt = difftool l = log --stat cp = cherry-pick ca = commit -a b = branch user.name #用户名 user.email #邮箱 core.editor #文本编辑器 merge.tool #差别分析工具 color.diff true #diff颜色配置 alias.co checkout #设置别名 git config user.name #得到用户名 git config core.filemode false #忽略修改权限的文件
Git本地有三个工做区域:工做目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。若是在加上远程的git仓库(Remote Directory)就能够分为四个工做区域。文件在这四个区域之间的转换关系以下:
git的工做流程通常是这样的:
3.2.一、在工做目录中添加、修改文件;
3.2.二、将须要进行版本管理的文件放入暂存区域;
3.2.三、将暂存区域的文件提交到git仓库。
所以,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
全新仓库
# 在当前目录新建一个Git代码库
$ git init
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]
克隆远程仓库
因为是将远程服务器上的仓库彻底镜像一份至本地,而不是取某一个特定版本,因此用clone而不是checkout,语法格式以下
# 克隆一个项目和它的整个代码历史(版本信息)
$ git clone [url]
Untracked: 未跟踪, 此文件在文件夹中, 但并无加入到git库, 不参与版本控制. 经过git add
状态变为Staged
.
Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中彻底一致. 这种类型的文件有两种去处, 若是它被修改, 而变为Modified
. 若是使用git rm
移出版本库, 则成为Untracked
文件
Modified: 文件已修改, 仅仅是修改, 并无进行其余的操做. 这个文件也有两个去处, 经过git add
可进入暂存staged
状态, 使用git checkout
则丢弃修改过, 返回到unmodify
状态, 这个git checkout
即从库中取出文件, 覆盖当前修改
Staged: 暂存状态. 执行git commit
则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify
状态. 执行git reset HEAD filename
取消暂存, 文件状态为Modified
# 查看指定文件状态
$ git status [filename]
# 查看全部文件状态
$ git status
# 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的全部文件到暂存区
$ git add .
# 直接从暂存区删除文件,工做区则不作出改变
$ git rm --cached <file>
# 不但从stage中删除,同时删除物理文件 $ git rm readme.txt # 把a.txt更名为b.txt $ git mv a.txt b.txt
# 查看文件修改后的差别
$ git diff [files]
$ git reset HEAD <file>... #若是已经用add 命令把文件加入stage了,就先须要从stage中撤销
# 只执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,可是工做区不受影响。
$ git clean [options] #移除全部未跟踪文件,通常会加上参数-df,-d表示包含目录,-f表示强制清除。
$ git diff HEAD~n #比较工做空间中的文件与仓库中倒数第n+1次提交时的差别
# 只执行git diff HEAD,表示与当前指向的HEAD比较
$ git diff --cached #比较暂存区的文件与以前已经提交过的文件
$ git checkout
$ git checkout HEAD
# 汇总显示工做区、暂存区与HEAD的差别。
$ git checkout -- filename
$ git checkout filename #用暂存区中filename文件来覆盖工做区中的filename文件。至关于取消自上次执行git add filename以来(若是执行过)的本地修改。
$ git checkout -- . 或写做 git checkout .
#注意git checkout命令后的参数为一个点(“.”)。这条命令最危险!会取消全部本地的修改(相对于暂存区)。至关于用暂存区的全部文件直接覆盖本地文件,不给用户任何确认的机会!
$ git checkout commit_id -- file_name #检出指定commit_id的文件到工做区和暂存区的filename。至关于恢复到某一次提交前时的状态。
$ git checkout branch -- filename #维持HEAD的指向不变。用branch分支所指向的提交中filename替换暂存区和工做区中相应的文件。注意会将暂存区和工做区中的filename文件直接覆盖。
有些时候咱们不想把某些文件归入版本控制中,好比数据库文件,临时文件,设计文件等
在主目录下创建".gitignore"文件,此文件有以下规则:
#为注释 *.txt #忽略全部 .txt结尾的文件 !lib.txt #但lib.txt除外 /temp #仅忽略项目根目录下的文件,不包括子目录temp build/ #忽略build/目录下的全部文件 doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
经过add只是将文件或目录添加到了index暂存区,使用commit能够实现将暂存区的文件提交到本地仓库。
# 提交暂存区到仓库区 $ git commit -m [message] # 提交暂存区的指定文件到仓库区 $ git commit [file1] [file2] ... -m [message] # 提交工做区自上次commit以后的变化,直接到仓库区,跳过了add,对新文件无效 $ git commit -a -m [message] # 提交时显示全部diff信息 $ git commit -v
# 使用一次新的commit,替代上一次提交 # 若是代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重作上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
原理就是放弃工做区和index的改动,同时HEAD指针指向前一个commit对象
# 撤销上一次的提交 $ git reset --hard HEAD~1
#另外一个用法
$ git reset --hard HEAD^
$ git reset --hard commit-id
#在Git中有一个HEAD指针指向当前分支中最新的提交。当前版本咱们使用"HEAD^",那么再前一个版本可使用"HEAD^^",若是想回退到更早的提交,可使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)
撤销提交:(使用这条语句提示冲突,后面再找缘由)
git revert <commit-id>
这条命令会把指定的提交的全部修改回滚,并同时生成一个新的提交
恢复被撤销的提交可用"git reflog"查看仓库中全部的分支的全部更新记录,包括已经撤销的更新,撤销方法与前面同样。
$ git reset --hard HEAD@{3}
--hard:撤销并删除相应的更新
--soft:撤销相应的更新,把这些更新的内容放到Stage中
#查看提交日志
git log [<options>] [<revision range>] [[\--] <path>…?]
"git log --graph"以图形化的方式显示提交历史的关系,这就能够方便地查看提交历史的分支信息,固然是控制台用字符画出来的图形。
"git log -1"则表示显示1行。
"git reflog"中会记录这个仓库中全部的分支的全部更新记录,包括已经撤销的更新。
使用git ls-files指令能够查看指定状态的文件列表,格式以下:
#查看指定状态的文件
git ls-files [-z] [-t] [-v] (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])* (-[c|d|o|i|s|u|k|m])*
基本语句:
# 列出全部本地分支 $ git branch # 列出全部远程分支 $ git branch -r # 列出全部本地分支和远程分支 $ git branch -a # 新建一个分支,但依然停留在当前分支 $ git branch [branch-name] # 新建一个分支,并切换到该分支 $ git checkout -b [branch]
# 切换到指定分支,并更新工做区
$ git checkout [branch-name]
# 合并指定分支到当前分支
$ git merge [branch]
# 删除分支
$ git branch -d [branch-name]
#其余用法 $ git branch [branch] [commit] # 新建一个分支,指向指定commit $ git branch --track [branch] [remote-branch] # 新建一个分支,与指定的远程分支创建追踪关系 $ git checkout [branch-name] # 切换到指定分支,并更新工做区 $ git checkout - # 切换到上一个分支 $ git branch --set-upstream [branch] [remote-branch] # 创建追踪关系,在现有分支与指定的远程分支之间 $ git cherry-pick [commit] # 选择一个commit,合并进当前分支
git merge [branch]
先建立一个新的分支,进行修改后提交
回到主分支,查看源文件,此时是没有更新的,合并分支后再查看,新作的修改就更新到主分支
masters分支对文件filell.txt进行操做后提交
切换到dev6分支,修改文件filell.txt后进行提交
切换到主分支,进行合并分支。提示存在冲突
查看文件filell.txt在分支master中的状态
Git用<<<<<<<,=======,>>>>>>>标记出不一样分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>dev6 是指dev6上修改的内容
修改冲突文件后从新提交,请注意当前的状态产master | MERGING:
语句:
git branch -d [branch] # -D(大写)是强制删除
建立一个新的分支dev7
切换到其余分支执行删除语句,不能在当前分支执行删除当前分支
删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
比较推荐Coding.net、GItHub。
#添加远程主机,主机名为origin 地址为https://git.coding.net/zhangguoGit/project7.git git remote add origin https://git.coding.net/zhangguoGit/project7.git #本地的master分支推送到origin主机,同时指定origin为默认主机,后面就能够不加任何参数使用git push了,-u 参数指定一个默认主机 git push -u origin master
# 下载远程仓库的全部变更 $ git fetch [remote] # 显示全部远程仓库 $ git remote -v # 显示某个远程仓库的信息 $ git remote show [remote] # 增长一个新的远程仓库,并命名 $ git remote add [shortname] [url] # 取回远程仓库的变化,并与本地分支合并 $ git pull [remote] [branch] # 上传本地指定分支到远程仓库 $ git push [remote] [branch] # 强行推送当前分支到远程仓库,即便有冲突 $ git push [remote] --force # 推送全部分支到远程仓库 $ git push [remote] --all #简单查看远程---全部仓库 git remote (只能查看远程仓库的名字) #查看单个仓库 git remote show [remote-branch-name] #新建远程仓库 git remote add [branchname] [url] #修改远程仓库 git remote rename [oldname] [newname] #删除远程仓库 git remote rm [remote-name] #获取远程仓库数据 git fetch [remote-name] (获取仓库全部更新,但不自动合并当前分支) git pull (获取仓库全部更新,并自动合并到当前分支) #上传数据,如git push origin master git push [remote-name] [branch]
克隆:
远程操做的第一步,一般是从远程主机克隆一个版本库,这时就要用到git clone
命令。
#在本地主机生成一个目录,与远程主机的版本库同名 $ git clone <版本库的网址> #要指定不一样的目录名,能够将目录名做为git clone命令的第二个参数 $ git clone <版本库的网址> <本地目录名> #克隆版本库的时候,所使用的远程主机自动被Git命名为origin。若是想用其余的主机名,须要用git clone命令的-o选项指定。 $ git clone -o WeUI https://github.com/Tencent/weui.git