Git 学习笔记

1. 什么是 Git

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

2. 为什么要学 Git

你是否经常因为修改文件而烦躁,
你是否经常因为误删文件而原地爆炸,
你是否经常因为创建过多副本而找不到自己想要的文件,
你是否经常因为删除可能会用到的文件而犹豫不决,
你是否经常因为协同办公的低效而浪费大量时间,
试试 git 吧,它会让你的人生更加精彩~

OK,言归正传,Git 的优点如下:
高效
它运行命令时间很短,可以极大效率的提升我们的工作效率,让我们可以把更多的时间用在别的地方。
离线工作
Git 支持离线操作,Git 可以在本地完成所有的操作(提交、合并、查看历史记录等),无需网络连接。
后悔药
俗话说:世上没有后悔药。但是 Git 却有,几乎无论什么错误,我们都可以通过 Git 的命令来挽回。
团队协作更流畅
Git 使得团队的工作更加顺利。Git 可以给团队提供分支来便于对项目进行延伸的操作,使得团队之间的相互工作既独立又紧密结合。
Fashion & 装 X
当别人还在不断创建副本、误删文件等原因低效工作的时候,你可以轻松的敲着代码来工作。可谓是低调中带着奢华,装得一手好 X 。

3.Git 简明语法

3.1 Git 安装完成后的设置

1
2
$ git config --global user.name "Your Name" ——设置你的名字
$ git config --global user.email "email@example.com" ——设置你的邮箱

3.2 创建版本库

① 选择一个合适的地方,创建一个空的目录【确保目录名(包括父目录)不包含中文】

1
2
3
$ mkdir xxx(目录名) ——创建目录xxx【可使用c/文件名/目录名的格式创建到你想要的地方】
$ cd xxx(目录名) ——切换工作目录至xxx
$ pwd ——以绝对路径方式显示当前工作目录

② 使这个目录变成 Git 可以管理的仓库

1
$ git init ——创造一个 git 目录,初始化仓库

如果你没有看到 .git 目录,那是因为这个目录默认是隐藏的,用 ls -ah 命令就可以看见。

3.3 添加文件到 Git 仓库【只能跟踪文本文件的改动】

① 用命令 git add 告诉 Git,把文件添加到仓库

1
$ git add xxx(文件名 + 后缀) ——添加文件,可一次添加多个文件

② 用命令 git commit 告诉 Git,把文件提交到仓库

1
$ git commit -m "xxx"[提交说明] ——将文件提交,可一次提交多个文件

3.4 文件状态查看 & 修改后的文件提交

1
2
$ git status ——查看文件当前状态
$ git diff xxx(文件名 & 后缀) ——显示改动的区别

提交修改:① git add ② git commit

3.5 查看历史修改状况 & 版本回退

1
2
$ git log ——显示提交的更改记录
$ git log --pretty=oneline ——显示简化后提交的更改记录

HEAD表示当前版本,上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ ,当然往上 100 个版本写 100 个 ^ 比较容易数不过来,所以写成 HEAD~100

1
2
3
4
$ git reset --hard HEAD^ ——回退到上一版本
$ git reset --hard 版本号 ——回退到指定版本
$ git reflog ——查看每次的操作记录
$ cat xxx(文件名 & 后缀) ——查看文件内容

3.6 工作区和暂存区

① 工作区(Working Directory):编辑文档的地方,电脑里能看见的目录
② 版本库(Repository):工作区中的一个隐藏目录 .git,其中最重要的就是称为 stage(或者叫index)的暂存区,还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。

1
2
`git add`作用是将文件添加进去,实际上就是把文件修改添加到暂存区;
`git commit`作用是提交更改,实际上就是把暂存区的所有内容提交到当前分支。

注:必须先 git addgit commit ,否则文件的修改情况不会添加到版本库里。

1
$ git diff HEAD --xxx(文件名 & 后缀) ——查看工作区和版本库里面最新版本的区别

3.7 撤销修改

1
2
$ git checkout -- xxx(文件名&后缀) ——丢弃工作区的修改
$ git reset HEAD xxx(文件名&后缀) ——将暂存区的修改撤销

总结:
① 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout -- file
② 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,第一步用命令 git reset HEAD file,然后执行 git checkout -- file
③ 已经提交了不合适的修改到版本库时,想要撤销本次提交,用命令 git reset --hard HEAD^ 或者 git reset --hard 版本号来进行版本回退

3.8 删除文件

1
2
$ rm xxx(文件名&后缀) ——删除工作区里的文件
$ git checkout -- xxx(文件名&后缀) ——恢复工作区的修改或删除(实质上是用版本库中的替换工作区的文件)

从版本库中移除文件分为两步:

1
2
$ git rm xxx(文件名&后缀) ——移除版本库中的文件
$ git commit -m "xxx"[提交说明] ——提交该请求,完成删除

PS:上述移除文件可以通过 git reset --hard 版本号 实现撤回

3.9 远程仓库

(1) 准备工作:
① 创建 SSH Key。
在用户主目录下,看看有没有 .ssh 目录,如果有,再看看这个目录下有没有 id_rsa 和 id_rsa.pub 这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开 Shell(Windows下打开Git Bash),创建 SSH Key

1
$ ssh-keygen -t rsa -C "youremail@example.com" 一直按回车即可

②登陆 GitHub,打开「Account settings」—「SSH Keys」—「Add SSH Key」粘贴 id_rsa.pub 的内容,完成远程仓库工作前的设置。

(2) 添加远程库:
① 首先在 GitHub 上创建一个新的仓库(注意输完名称后直接点击创建按钮!)
② 将新建的仓库与本地的仓库相关联

1
$ git remote add origin git@github.com:(your name)/(rep name).git

③ 将本地库的内容推送至远程库上

1
$ git push -u origin master

此时,只要对本地修改文件进行了 git commit,就可以使用 git push origin master 进行同步。

(3) 从远程库克隆:
① 首先在 GitHub 上创建一个新的仓库(注意勾选 Initialize this repository with a README 按钮!)
② 克隆出一个本地库

1
2
$ git clone git@github.com:(your name)/(rep name).git
$ ls ——查看库中有哪些文件

3.10 分支管理

(1) 创建 & 合并分支:

1
2
3
4
5
$ git checkout -b 分支名 ——创造并切换至新分支【$ git branch 分支名(创建分支)+$ git checkout 分支名 】
$ git branch ——查看当前分支
$ git checkout master/分支名 ——切换分支
$ git merge 分支名 ——合并指定分支到当前分支
$ git branch -d 分支名 ——删除分支

(2) 解决冲突:
当 master 与分支都进行过修改时,合并分支会发生冲突,解决冲突之后,可以再次提交进行合并。

1
$ git log --graph --pretty=oneline --abbrev-commit ——查看分支合并图

(3) 分支管理策略:
合并分支时,加上 --no-ff 参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并。

1
$ git merge --no-ff -m "merge with no-ff" 分支名

(4) Bug 分支:
我们可以通过一个新的临时分支来修复产生的 bug,修复后,合并分支,然后将临时分支删除即可。
① 若你有正在进行的工作又不想提交可以通过 stash 功能使现有的工作暂时隐藏起来

1
$ git stash ——储藏你当前的工作内容

② 若没有的话,直接在 master 上新建一个分支进行 bug 的修复,修改完之后直接合并即可
③ 恢复你正在进行的工作

1
2
3
$ git stash list ——查看被储存工作的列表
$ git stash pop ——恢复工作内容并删除 stash 中的内容
$ git stash apply stash@{序号} ——恢复工作内容但不删除 stash 中的内容

(5) Feature 分支:
开发一个新的 feature,最好新建一个分支,以防止中途 feature 取消。

1
$ git branch -D 分支名 ——强行删除未合并的分支

(6) 多人协作:

1
2
$ git remote -v ——获取远程库抓取或获取 origin 的地址
$ git push origin master/分支名 ——推送分支

① master 分支是主分支,因此要时刻与远程同步;
② dev 分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
③ bug 分支只用于在本地修复 bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个 bug;
④ feature 分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

3.11 标签管理

(1) 创造标签:

1
2
3
4
5
6
7
$ git branch ——查看分支状态
$ git checkout master ——切换至需要打标签的分支上
$ git tag <name> ——给当前版本打一个标签
$ git tag <name> 版本号 ——给某版本打一个标签
$ git tag ——查看所有标签
$ git show <tagname> ——查看标签信息
$ git tag -a <tagname> -m "xxx[说明文字]" 版本号 ——给某版本打一个带说明的标签

(2) 操作标签:

1
2
3
$ git tag -d <tagname> ——删除标签
$ git push origin <tagname> ——推送标签至远程库
$ git push origin --tags ——推送所有标签

(3) 删除远程库标签

1
2
$ git tag -d <tagname>
$ git push origin :refs/tags/<tagname>

3.12 使用 Github

参加开源项目

① Fork 一个项目
② $ git clone git@github.com:(your name)/(rep name).git
③ 可以修改提交自己的见解
④ 发起一个 pull request 来参与项目

参考文档

如果想要了解更多,可以参阅下列文档。
[1] 廖雪峰学习网站Git教程(主要学习文档)
[2] Git官方Git 参考手册