Git
行万里路,破万卷书
1.概述
- 定义
开源的分布式版本控制系统
- 常见版本控制器
-
Git
-
SVN(SubVersion)
-
CVS(Concurrent Versions System)
-
VSS(Micorosoft Visual SourceSafe)
-
TFS(Team Foundation Server)
-
Visual Studio Online
- 版本控制产品
- Perforce
- Rational ClearCase
- RCS(GNU Revision Control System)
- Serena Dimention
- SVK
- BitKeeper
- Monotone
- Bazaar
- Mercurial
- SourceGear Vault
- 历史
- Linux和Git之父李纳斯·托沃兹(Linus Benedic Torvalds)1969,芬兰
- 2002 年破解研究 BitKeeper
- 2005 年,收回了 Linux 内核社区免费使用 BitKeeper 的权力,开发出自己的版本系统,就是后来的Git
2.分类
- 本地版本控制
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。
- 集中版本控制 SVN
所有的版本数据都保存在中央服务器上,协同开发者从服务器上同步更新或上传自己的修改,如SVN、CVS、VSS,不连网的话,用户就看不到历史版本,也无法切换版本验证问题
- 分布式版本控制 Git
每个人都拥有全部的代码!安全隐患,工作的时候不需要联网了,因为版本都在自己电脑上
3.命令
- 目录操作
# 文件夹【目录】操作
# 创建文件夹,新建一个目录,[-m]【权限】、[-p]【递归创建】
mkdir [-mp] [目录名]
# 删除一个文件夹,删除目录 [-r]【递归】 、[-f]【强制】、[-i]【互动】
rm [-rif] [目录名]
# 删除一个空的目录 [-p] 【向上递归】
rmdir [-p] [目录名]
# 重命名一个目录 [-f]【强制】、[-i]【互动】、[-u]【较新升级】
mv [-fiu] [目录1] [目录2]
# 移动文件夹【剪切】
mv [目录1<相对路径>] [目录2<绝对路径>]
# 改变目录
cd [目录]
# 退回上一目录,直接cd是进入默认目录
cd ..
# 复制目录 [-a]【-pdr】、[-d]【若是link,则复制link】、[-f]【强制】、[-i]【互动】、[-l]【复制为硬连接】
# [-p]【连文件一起复制,备份】、[-r]【递归】、[-s]【复制为软连接,快捷方式】、[-u]【较新升级】
cp [-adfilprsu] [来源档(source)] [目标档(destination)]
# 搜索目录,例如 find . -name "*.txt"
find [路径] [表达式] [名字]
# 显示当前目录所在位置,[-p]【真实路径,不是link】
pwd [-p]
# 查看当前目录的文件和目录,ll更详细 [-a]【查看所有包括隐藏】、[-l]【列表查询】
ls [-aAdfFhilnrRSt]
ll
- 文件操作
# 文件操作
# 新建一个文件[-a]【改变读取时间记录】、[-c]【目的档案不存在就不建立】、[-f]【不使用,为了兼容】、[-m]【改变修改时间记录】
touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件]
# 删除一个文件,[-r]【递归】 、[-f]【强制】、[-i]【互动】
rm [-fir] [文件名]
# 重命名【去掉目录】,或者移动一个文件
mv [文件名1] [目录<绝对路径>] [文件名2]
# 编辑文件,命令模式-iao键-输入模式-Esc键-底线命令模式-:wq-保存退出-cat 文件名-查看
vim [文件名]
# 查看文件内容 [-A]【相当於-vET,列出特殊字符】、[-b]【列出行号】、[-E]【显示断行$】、[-n]【列出行号,包括空白行】、[-T]【[tab] 按键以 ^I 显示】、[-v]【列出看不出的特殊字符】
cat [-AbEnTv] [文件名]
# 倒序查看文件内容
tac [文件名]
# 显示行号查看文件 [-b]【a:空行也列出行号,t:空行不列出行号】、[-n]【ln:行号在最左方,rn:右方显示,且不加 0,rz:右方显示,且加 0】
# [-w]【行号栏位的占用的位数】
nl [-bnm] [文件名]
# 一页一页翻动
more [文件名]
less [文件名]
# 取出文件前面几行
head [-n number] [文件名]
# 取出后面几行
tail [-n number] [文件名]
- 配置
#查看系统config
git config --system --list
#查看当前用户(global)配置
git config --global --list
#名称
git config --global user.name "xxy"
#邮箱
git config --global user.email 11111@qq.com
# 查看历史
history
# 退出
exit
4. 工作原理
- 工作区域
-
Workspace:工作区,就是你平时存放项目代码的地方
-
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
-
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
-
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
- 工作命令
# 创建一个版本库
git init
# 或
git clone [url]
#查看指定文件状态
git status [filename]
#查看所有文件状态
git status
# 添加所有文件到暂存区
git add .
# "消息内容"提交暂存区中的内容到本地仓库 -m 提交信息
git commit -m
# 本地仓库提交到远程仓库
git push
# 进入 C:\Users\Administrator\.ssh 目录
# 生成公钥
ssh-keygen
#为注释
*.txt #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt #但lib.txt除外
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
- git管理文件状态
- 未跟踪(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
- 已提交(committed)
- 忽略文件
- 在主目录下建立".gitignore"文件,此文件有如下规则:
- 忽略文件中的空行或以井号(#)开始的行将会被忽略。
- 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,…})代表可选的字符串等。
- 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
- 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
- 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
5. Git分支
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 合并指定分支到当前分支,需要处理冲突
$ git merge [branch]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
6. 总结
这次系统的复习了Git的使用方法,对以后工作会有很大的帮助。