Git

行万里路,破万卷书

Git官网

ali下载

1.概述

  1. 定义

开源的分布式版本控制系统

  1. 常见版本控制器
  • Git

  • SVN(SubVersion)

  • CVS(Concurrent Versions System)

  • VSS(Micorosoft Visual SourceSafe)

  • TFS(Team Foundation Server)

  • Visual Studio Online

  1. 版本控制产品
  • Perforce
  • Rational ClearCase
  • RCS(GNU Revision Control System)
  • Serena Dimention
  • SVK
  • BitKeeper
  • Monotone
  • Bazaar
  • Mercurial
  • SourceGear Vault
  1. 历史
  • Linux和Git之父李纳斯·托沃兹(Linus Benedic Torvalds)1969,芬兰
  • 2002 年破解研究 BitKeeper
  • 2005 年,收回了 Linux 内核社区免费使用 BitKeeper 的权力,开发出自己的版本系统,就是后来的Git

2.分类

  1. 本地版本控制

记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。

  1. 集中版本控制 SVN

所有的版本数据都保存在中央服务器上,协同开发者从服务器上同步更新或上传自己的修改,如SVN、CVS、VSS,不连网的话,用户就看不到历史版本,也无法切换版本验证问题

  1. 分布式版本控制 Git

每个人都拥有全部的代码!安全隐患,工作的时候不需要联网了,因为版本都在自己电脑上

3.命令

  1. 目录操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 文件夹【目录】操作
# 创建文件夹,新建一个目录,[-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
  1. 文件操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 文件操作
# 新建一个文件[-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] [文件名]
  1. 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#查看系统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. 工作原理

  1. 工作区域
  • Workspace:工作区,就是你平时存放项目代码的地方

  • Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息

  • Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

  1. 工作命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 创建一个版本库
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


  1. 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)
  1. 忽略文件
  • 在主目录下建立”.gitignore”文件,此文件有如下规则:
  • 忽略文件中的空行或以井号(#)开始的行将会被忽略。
  • 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,…})代表可选的字符串等。
  • 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
  • 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
  • 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。

5. Git分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 列出所有本地分支
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的使用方法,对以后工作会有很大的帮助。