相信每一个CS专业的学生都听说过这么一个网站, 全球最大的同性交友网站–GitHub, 也知道git这么一个词, 他们究竟是干嘛的呢? 且听我娓娓道来

版本控制

版本控制是一种再开发过程中用于管理我们对于文件, 目录或工程等内容的修改历史, 方便查看更改历史记录, 备份以及恢复以前版本的软件工程技术.

作用
  • 实现跨区域多人协同开发
  • 追踪和记录一个或多个文件的历史记录
  • 组织和保护代码和文档
  • 统计工作量
  • 并行开发, 提高开发效率
  • 等等

如果多人开发必须要使用版本控制, 否则容易管理混乱.

主流的版本控制器
  • Git
  • SVN
  • CVS
  • VSS
  • TFS
  • BitKeeper
  • 等等
三种分类
  1. 本地版本控制, 代表:RCS, 本地进行记录
  2. 集中版本控制, 代表:SVN, 版本信息保存在服务器上, 本地只有旧的版本, 需要联网去服务器请求, 最大的缺点是服务器坏了大家就没法工作了.
  3. 分布式版本控制, 代表:GIT, 每个人都有一个版本控制中心, 有全部的代码, 缺点是一个人可以全偷走, 优点是不会因为服务器损坏而不能工作.

Git和SVN的区别

SVN需要有中央服务器, 必须联网从服务器获取最新版本后, 才能工作.
Git没有中央服务器, 每个人的电脑就是一个完整的版本库, 工作的时候不需要联网了, git可以直接看到别人更改的东西.
Git是最先进的分布式版本控制工具.

Git的发展历史

Git和Linux是分不开的.
Linux之父linus创造了Linux之后, 全球有大量的程序员为其贡献了代码, 整整十年linus没有版本控制工具, 在系统维护和归档上花费了大量时间, 2002年开始使用BitKeeper, 但是很快在2005, 人家要收费了.
linus可谓是天才, 总结经验, 吸取教训, 一怒之下, 花了两周时间, 开发了Git??????
Git和linus一样, 免费, 开源.

git的安装

问度娘吧.
毁灭吧

linux基本命令

平时一定要多使用这些基础的命令!

  • cd: 改变目录。
  • cd ..: 回退到上一个目录,直接cd进入默认目录
  • pwd: 显示当前所在的目录路径。
  • ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。
  • touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
  • rm: 删除一个文件, rm index.js 就会把index.js文件删除。
  • mkdir: 新建一个目录,就是新建一个文件夹。
  • rm -r: 删除一个文件夹, rm -r src 删除src目录
  • mv: 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。
  • reset: 重新初始化终端/清屏。
  • clear: 清屏。
  • history: 查看命令历史。
  • help: 帮助。
  • exit: 退出。
  • #: 表示注释

git必要配置

查看配置:
git config -l: 本文件下配置
git config --system -l: 系统配置 git根目录/etc/gitconfig
git config --global --list: 当前用户配置 文档/.gitconfig

git config --global user.name "XXX": 配置用户名
git config --global user.email "XXX": 配置邮箱

git基本理论

Git本地有三个工作区域:

  1. 工作目录
  2. 暂存区Stage, 只是一个文件
  3. 资源库
    W8NgCd.png

基本命令

  • git add .: 将所有文件提交到暂存区.
  • git commit: 将文件提交到本地仓库
  • git push: 提交到远程仓库

W8UjWd.md.png

本地仓库搭建:
git init: 初始化本地仓库
git clone: 克隆远程仓库到本地

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.
1
2
3
4
5
6
7
8
9

#查看指定文件状态
git status [filename]

#查看所有文件状态
git status

# git add . 添加所有文件到暂存区
# git commit -m "消息内容" 提交暂存区中的内容到本地仓库 -m 提交信息

忽略文件

有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等.
在主目录下建立”.gitignore”文件,此文件有如下规则:

  • 忽略文件中的空行或以井号(#)开始的行将会被忽略。
  • 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,…})代表可选的字符串等。
  • 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
  • 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
  • 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
1
2
3
4
5
*.txt        #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt #但lib.txt除外
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 列出所有本地分支
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]

如果同一个文件在合并分支时都被修改了则会引起冲突:解决的办法是我们可以修改冲突文件后重新提交!选择要保留他的代码还是你的代码!