【1】版本控制工具应该具备的功能
① 协同修改
多人并行不悖的修改服务器端的同一个文件。
② 数据备份
不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。
③ 版本管理
在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空
间,提高运行效率。这方面SVN 采用的是增量式管理的方式,而Git 采取了文
件系统快照的方式。
④ 权限控制
对团队中参与开发的人员进行权限控制。
对团队外开发者贡献的代码进行审核——Git 独有。
⑤ 历史记录
查看修改人、修改时间、修改内容、日志信息。
将本地文件恢复到某一个历史状态。
⑥ 分支管理
允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。
⑦ 版本控制工具
集中式版本控制工具:CVS、SVN、VSS……
分布式版本控制工具:Git、Mercurial、Bazaar、Darcs……
【2】Git 介绍与安装
① 官网地址:https://git-scm.com/。
② Git的优势
- 大部分操作在本地完成,不需要联网;
- 完整性保证;
- 尽可能添加数据而不是删除或修改数据;
- 分支操作非常快捷流畅;
- 与Linux 命令全面兼容。
③ Git的安装
- 从官网下载对应自己系统的安装程序,以管理员身份运行,安装在英文无空格目录下;
- next 下一步 安装选项
- next Git安装目录的名字–默认即可
- next 使用VIM编辑器作为默认编辑器–不需要更改
- next 选择如何使用Git 命令行
完全不修改Path环境变量,仅在Git bash中使用Git。
- next 选择Git使用的命令客户端程序–默认即可
- next 选择Git本地到远程连接所使用的SSL/TLS库–默认即可
- next 配置文档行末换行符转换风格–默认即可
- next 选择Git Bash使用的终端仿真程序–默认即可
- next 配置额外功能 --默认即可
- install --安装过程
右键–Git Bash Here,即可打开Git的命令终端:
【3】本地库和远程库
① Git的结构
② Git和代码托管中心
代码托管中心的任务:维护远程库。
局域网环境下:GitLab 服务器。
外网环境下:GitHub、码云。
③ 团队内部协作下本地库和远程库示意图
④ 跨团队协作下本地库和远程库示意图
【4】Git仓库初始化并设置签名
① 本地库初始化
在磁盘Git工作空间内创建firstDemo,然后执行命令git init.
12746@Janus MINGW64 ~/Desktop
$ cd D:/GitInstall/workspace
12746@Janus MINGW64 /d/GitInstall/workspace
$ mkdir firstDemo
12746@Janus MINGW64 /d/GitInstall/workspace
$ ls
firstDemo/
12746@Janus MINGW64 /d/GitInstall/workspace
$ cd firstDemo/
12746@Janus MINGW64 /d/GitInstall/workspace/firstDemo
$ ls
12746@Janus MINGW64 /d/GitInstall/workspace/firstDemo
$ git init
如图初始化了空的Git仓库在D:/GitInstall/workspace/firstDemo/.git/路径下。
创建的.git目录是隐藏资源,使用如下命令查看:
12746@Janus MINGW64 /d/GitInstall/workspace/firstDemo (master)
$ ll -lA
total 4
drwxr-xr-x 1 12746 197121 0 7月 29 15:50 .git/
查看git目录,内容如下:
注意:.git
目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
② 设置签名
形式:用户名:tom;Email 地址:goodMorning@atguigu.com。
作用:区分不同开发人员的身份。
辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关
系。
命令
项目级别/仓库级别:仅在当前本地库范围有效
git config user.name tom_pro
git config user.email goodMorning_pro@qq.com
# 信息保存位置:./.git/config 文件
系统用户级别:登录当前操作系统的用户范围
git config --global user.name tom_glb
git config --global user.email goodMorning_pro@qq.com
# 信息保存位置:~/.gitconfig 文件
- 级别优先级
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名。如果只有系统用户级别的签名,就以系统用户级别的签名为准。二者都没有不允许
【5】常用命令操作
如果某个命令不知道或者想要更多功能,试试如下命令:
git --help;
git help <command>;
git help -a;
git help -g;
① 状态查看
git status
查看工作区、暂存区状态。
② git add添加
git add [file name]
将工作区的“新建/修改”添加到暂存区,如下图创建一个good.txt并提交:
③ 提交文件
git commit -m "commit message" [file name]
# git rm --cached <file> 从暂存区移除指定文件
# git commit -a //提交所有文件
将暂存区的内容提交到本地库。
提交多个文件:
git commit -m "commit message" *
④ 文件覆盖与更新
如将good.txt进行了修改,查看状态:
此时直接添加将会将修改后的文件放到暂存区,如下图:
⑤ 查看历史记录
查看日志
git log
多屏显示控制方式:
空格向下翻页
b 向上翻页
q 退出
日志单行显示:
git log --pretty=oneline
git log --oneline
显示指针:
git reflog
HEAD@{移动到当前版本需要多少步}。
查看提交详情
git log --stat
查看最新的commit
git show
查看指定commit hashID的所有修改
git show commitId
查看某次commit中具体某个文件的修改
git show commitId fileName
⑥ 前进/后退当前所在版本
基于索引值操作[推荐]
git reset --hard [局部索引值]
# git reset --hard a6ace91
使用^符号:只能后退
git reset --hard HEAD^
# 注:一个^表示后退一步,n 个表示后退n 步
- 使用~符号:只能后退
git reset --hard HEAD~n
# 注:表示后退n 步
⑦ reset 命令的三个参数对比
- –soft 参数
仅仅在本地库移动HEAD 指针。
- –mixed 参数
在本地库移动HEAD 指针并重置暂存区。 - –hard 参数
在本地库移动HEAD 指针;重置暂存区;重置工作区。
⑧ 删除文件并找回
前提:删除前,文件存在时的状态提交到了本地库,如下图所示:
操作:git reset --hard [指针位置]
删除操作已经提交到本地库:指针位置指向历史记录,如下图:
删除操作尚未提交到本地库:指针位置使用HEAD。
如下图所示,此时删除操作还没有提交到本地库,只是到暂存区。
使用命令:
git reset --hard HEAD
⑨ diff比较文件差异
将工作区中的文件和暂存区进行比较:
git diff [文件名]
将工作区中的文件和本地库历史记录比较:
git diff [本地库中历史版本] [文件名]
# git diff HEAD apple.txt
# git diff HEAD^ apple.txt
不带文件名比较多个文件:
git diff
⑩ 拉取远程代码并且覆盖本地更改
git fetch origin && git reset –hard origin/master
(11)列出远程和本地所有分支
git branch -a
git branch -r
(12)强制更新远程分支
git push origin master -f
(13)回滚一个 merge
git revert -m 1 xxxx
(14) 修改之前的提交记录或者很久前提交的记录
git rebase –interactive ID^
将需要修改的记录的 pick 改成 edit
执行更改
git commit –all –amend
git rebase –continue
(15)使用多个远程代码库,并且使用多个不同的 SSH Key
修改 ~/.ssh/config
Host bitbucket.org
HostName bitbucket.org
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
User git
Host bitbucket.org-key2
HostName bitbucket.org
IdentityFile ~/.ssh/key2_id_rsa
User git
修改 .git/config
[remote “origin”]
url = git@bitbucket.org-key2:XXXX/yyyy.git
fetch = +refs/heads/*:refs/remotes/origin/*
(16)和外部团队协作需要的维护多个远程库,合并其他库的更新的过程
git remote rename origin upstream
git remote add origin URL_TO_GITHUB_REPO
git push origin master
git pull upstream master && git push origin master
(17)撤销 Git 的最后一次提交
git reset –soft HEAD~1