Git使用笔记
Git使用笔记
AlanGit的介绍
[toc]
1.1、什么是Git
Git 是一个开源的分布式版本控制系统。
分布式 :
- 你的文件可以存放在多个不同的系统(或者位置),相互之间来自于一个 原本,单个副本修改,不影响其他副本。
- 但是可以通过从一个指定地方(比如Github,或者自己构建的gitlab)上传与拉取来获得更新。
版本控制系统: 顾名思义
- 相比于 集中式版本控制系统,他更小巧,更快捷,更方便。
- 不依赖中央服务器,本质上继承了他的创造者的 一切皆文件的想法。
- 其实他就是你随处可以带走的文件,只不过加了一套逻辑,可以配合Git来控制,从而进行版本控制。
1.2、Git的安装
Linux下安装
1 | Linux 下使用如下命令安装 |
一般情况下当下的Linux都自带了 git
对于更多Linux的安装方法参考 http://git-scm.com/download/linux
Mac下安装
- 使用homebrew安装
1 | brew install git |
- 二进制安装程序。
官方维护的 OSX Git 安装程序可以在 Git 官方网站下载,网址为 http://git-scm.com/download/mac
Windows下安装
请直接前往 git官网 下载,辅之以图形界面工具(可以考虑fork),另外终端操作以后值得学习。
在win10 1709版本以上的,可以辅之使用 windows subsystem的Linux来配合使用
1.3、查看是否有git或者安装是否成功
查看git版本
1 | git --version |
Git的配置
[toc]
2.1、单词
config
: 设置与查看 Git 外观和行为的配置变量--system
:- 对应
/etc/gitconfig
文件,包含系统上每一个用户及他们仓库的通用配置。
- 对应
--global
:- 对应
~/.gitconfig
或~/.config/git/config
文件,只针对当前用户。
- 对应
--local
:- 对应
.git/config
,即当前使用仓库的 Git 目录中的config
文件
- 对应
--list
: 列举配置- 每一个级别会覆盖上一级别的配置
2.2、语法
1 | git config --local //当前Git工作区的配置 |
2.3、语义
Git最小化配置
- 配置用户名与邮箱
1 | git config --global user.name 'name' //配置全局的 名称 |
- git 的 配置 分为
- 当前工作区
--local
- 当前工作区只对 单个Git工作区 有效
- 全局
--global
- 全局配置,对当前所有 Git有效,
- 但是当工作区本身有 local 配置时,以 local 为准
- 系统
--system
- 当前工作区
一般为了方便都是配置的 全局(global)配置,若没有配置,后期用户在使用git 时会提示要求你配置
Git 配置查看
1 | git config --list |
查看配置及所在的文件
1 | git config --list --show-origin |
配置默认文本编辑器
1 | git config --global core.editor vim |
获取Git仓库
3.1、单词
clone
3.2、语法
1 | git clone <address> |
3.3、语义
克隆一个仓库
- 最简洁指令
1 | git clone https://gitee.com/leobod/GitGuide.git |
- 克隆并指定文件名
1 | git clone https://gitee.com/leobod/GitGuide.git GGuide |
git理解图示
Git 基础
5.1、单词
- init
- add
- commit
5.2、语法
Git的初始化
1 | git init //将当前目录 初始化成 Git仓库 |
Git添加文件到暂存区
1 | git add <path/file> //Git 初始化后 使用 add 来 将file添加到暂存区 |
Git 提交文件到 版本库
1 | git commit -m 'tips_message' //Git 将暂存区修改 提交到版本库 并给commit标识 提示语 |
5.3、语义
创建一个Git仓库,初始化并提交一些commit
1 | cd /path/……/project_01 //shell 下切换到 指定目录(根据具体情况) |
1 | 或者 |
Git 状态查看
6.1、单词
- version
- status
- log
6.2、语法
查看Git版本
1 | git --version |
查看 工作区 暂存区文件状态
1 | git status |
查看 commit 历史记录
1 | git log |
6.3、语义
查看 本机git 版本号
1 | git --version |
结果:
git version 2.17.1
查看 工作区 暂存区文件状态
1 | git status |
结果1:
On branch master
Your branch is up to date with ‘origin/master’.
nothing to commit, working tree clean
// 当前 处于 master 分支。分支具体请查看分支管理
// 你的分支 已经是最新的了, 包含了远端分支,若未连接Github 一般无这条提示
// 没有什么克提交的, 工作区 暂存区 无变化
结果2:
On branch master
No commits yet
Untracked files:
(use “git add
README.md
nothing added to commit but untracked files present (use “git add” to track)
// 当前分支 master
// 还没有 commit
//为追踪的文件 有 README.md 可以使用 git add
结果3:
On branch master
No commits yet
Changes to be committed:
(use “git rm —cached
new file: README.md
// 当前分支 master
// 还没有 commit
//新的改变 等待提交, 如果想 取消,可以使用 git rm —cached
// 若没有问题 在合适的时候 可以 使用 git commit 来提交到 版本库
查看 commit 的日志 方式1
1 | git log |
结果:
commit 58a8145557cab8a08eedc0877f6fabe419fa84d9 (HEAD -> master, origin/master, origin/c1, origin/HEAD, c1)
Author: leobod 13952348337@sina.cn
Date: Fri Feb 8 20:56:01 2019 +0800
Git的介绍与安装,以及简单配置
commit efddeada1f93ba9a822ac208cfdf4915b6d406c2
Author: leobod 13952348337@sina.cn
Date: Fri Feb 8 19:10:43 2019 +0800
修改GitGuide的README.md,来说明如如何学习与记录Git的使用
commit 920f45c5909c33b49f0da5eba413c02d8d85faee
Author: leobod 13952348337@sina.cn
Date: Fri Feb 8 15:52:09 2019 +0800
Git 使用指南的 书写格式
commit cb5b26d8271c1fe4871094b66b8f7469e3c59859
Author: 差三岁Lee 13952348337@sina.cn
Date: Thu Jan 10 13:54:05 2019 +0800
Initial commit
// commit 后跟 提交的 hash 值,后期可以 使用 前 7位值来定位, 也可以多选 几位, 一般 7位就够
//Author 显示 commit 的提交是谁,以及邮箱号,用于对 commit 有问题 或疑问时,责任到人,一般在本机都是 用户 在 git config 处设置的值,如果没有设置,每次提交时 都会 提示要求输入
// Date 后跟 这个提交的日期
查看 commit 的日志 方式2
1 | git log --oneline --graph |
结果:
- 58a8145 (HEAD -> master, origin/master, origin/c1, origin/HEAD, c1) Git的介绍与安装,以及简单配置
- efddead 修改GitGuide的README.md,来说明如如何学习与记录Git的使用
- 920f45c Git 使用指南的 书写格式
- cb5b26d Initial commit
//一条 commit 缩在 一行 前7位显示 commit的 hash值,后面跟 <分支名称> 在跟
号 其实 在终端一般 显示为 * ,在图形端一般是 平滑的线条连接,
此处 分支都在一条线上,理论上多分支时,可以向树 (或者 森林)一样延展,多数情况下是树,一般不建议搞成 <森林>
何为 树 何为 森林 请 查看数据结构 树的相关内容。
Git 状态重置 或者 回滚
7.1、单词
- reset
- checkout
- HEAD HEAD^ HEAD~n
7.2、语法
git 工作区还原到 暂存区的状态,也就是说 取消最近新添加的文件修改
1 | git checkout . //还原工作区 <所有> 文件 为暂存区状态暂存区状态 |
git暂存区 恢复到 commit 状态
1 | git reset HEAD // 恢复暂存区到 HEAD 指针指向的位置 |
git reset 后 git log 只显示到 HEAD commit 处,以往的不显示,但是 可以到 项目的 .git/logs/refs
中去寻找 一般记录保存 30天
找到后可以 使用 git reset
7.3、语义
单线型 版本迭代演进 与回滚演示
演示前的准备
git init Test
初始化 一个Test 用于 git 演示建立
hello.c
文件 用于版本迭代git ad hello.c
且git commit -m ‘Write a Hello World C Language file'
git log --oneline
结果:1
b2e1368 Write a Hello World C Language filWrite a Hello World C Language fil
vi hello.c
在文件里面 return 0 前 补充 getchar() 并提交git log --oneline
结果:eb96dee At the end insert getchar() to make a wait b2e1368 Write a Hello World C Language fil
vi hello.c
在文件里面 补上 // Author: XXXX 提交git log --oneline
结果:
1 | 550f417 (HEAD -> master) insert author information into the file |
修改开始
代码最初为:
1 | #include 'stido.h' |
当前 hello.c 源码 如下:
```
include ‘stido.h’
// Author: Leobod
int main() {printf('Hello World! \n'); getchar(); return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
3. 修改后
4. ```
#include 'stido.h'
// Author: Leobod
// Description: A C language demo
int main() {
printf('Hello World! \n');
getchar();
return 0;
}情况1
若 使用
git checkout .
或者git checkout -- Hello.c
后 恢复到 2处样式情况2
若 使用
git reset --hard b2e1368
恢复到 代码最初样子 且 工作区 暂存区代码都一样git log
为1
b2e1368 Write a Hello World C Language fil
可以使用
git reset --hard 550f417
返回 最后一次修改状态找不到 hash 请前往
.git/logs/refs
中寻找情况3
若使用
git reset b2e1368
工作区 代码 仍为 4处 样式, 暂存区与版本库为 代码最初样式此时 使用
git status
可以发现提示若想 工作区也 还原 多执行一步
git checkout .
回到 最新状态 依然是
git reset 550f417
此处
550f417
对应最后一次commit的 hash 值
本文部分内容参考引用了 Domon-Git Reset 三种模式
Git Diff 差异分析
虽然命名交 Git diff 但是实际上 diff 可以是一个单独的工具,专门用来进行 文本比较
diff 是Linux 自带的命令,同样 git 中也集成了这个命令
命令格式:
diff <参数> <文件1或目录1> <文件2或目录2>
详情可以参考 菜鸟教程—Linux diff 或者参考 博客园中的信息
git 的 diff
1 | git diff 谁 与 谁 比较 |
具体可以参考 Git-diff
Git 文件删除、重命名
9.1、单词
- rm
- mv
9.2、语法
1 | git rm file //删除指定文件,同时 实现 rm |
.gitignore
的使用
[toc]
.gitignore配置文件规则
在 .gitingore 文件中,遵循相应的语法,在每一行指定一个忽略规则。如:
1 | *.log |
定义全局的 .gitignore 文件
除了可以在项目中定义 .gitignore 文件外,还可以设置全局的 git .gitignore 文件来管理所有Git项目的行为。
1 | git config --global core.excludesfile ~/.gitignore |
Git 忽略规则优先级
在 .gitingore 文件中,每一行指定一个忽略规则,Git 检查忽略规则的时候有多个来源
优先级如下(由高到低):
- 从命令行中读取可用的忽略规则
- 当前目录定义的规则
- 父级目录定义的规则,依次地推
- $GIT_DIR/info/exclude 文件中定义的规则
- core.excludesfile中定义的全局规则
Git 忽略规则匹配语法
在 .gitignore 文件中,每一行的忽略规则的语法如下:
空格
不匹配任意文件,可作为分隔符,可用反斜杠转义# 开头
的模式标识注释,可以使用反斜杠进行转义! 开头
的模式标识否定,该文件将会再次被包含,- 如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义
/ 结束
的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件/ 开始
的模式匹配项目跟目录- 如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录
**匹配
多级目录,可在开始,中间,结束?
通用匹配单个字符[]
通用匹配单个字符列表
.gitignore常用规则
常用匹配示例:
1 | bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件 |
.gitignore常用规则-JAVA
1 | # Operating System Files |
.ignore规则配置-C++
1 | # User ================================ |
Git 分支管理
10.1、单词
- branch
- checkout
- merge
10.2、语法
Git 分支建立与切换
1 | git branch <branch_name> //建立分支 |
Git 已有分支查看
1 | git branch //查看分支 |
Git分支删除
1 | git branch -d <branch_name> //删除 指定分支 |
Git 分支合并
1 | git checkout master //切换到分支 master |
情景1: Git的常见分支处理方案
前置状态
现在有一个 Git仓库, 里面有 README.txt 文件 和 description.txt 文件
README.txt 文件内容
1 | This is the first line in the README.txt |
description.txt 文件为空
有如下分支
- master
- feature
- develop
11.1、操作方案1—不同分支处理了同一个文件,合并时产生冲突的处理
开始时 master <==> feature <==> develop (3个分支处于同一处)
切换到 feature 分支
修改 read.txt 文件为
1 | This is the first in the read.txt |
commit 2
commit1 commit2
修改后 init —————> master(develop)—————> feature
切换到 develop 分支,并保证工作区 与 初始状态一样
修改 read.txt 文件为
1 | This is the first in the read.txt |
commit3
commit1
修改后 init ————> master————> feature[处于commit2]
|
|
----------------> develop[处于commit3]
最后 切换到 master分支,并保证 工作区与 版本库一致(也就是最初始状态)
此处先 合并 develop 后合并feature (也可以 先合并feature后合并 develop 效果一样)
git merge feature
git merge develop
出现冲突,处理冲突文件 read.txt
同一个文件合并时的冲突都合并到了文件中,git不辅助做修改,需要自行修改,修改文件后重新commit
1 | This is the first in the read.txt |
方案1
修改后,假设此处2句都要可以改成
1 | This is the first in the read.txt |
git commit
方案2
修改后,假设此处可以改成 master
1 | This is the first in the read.txt |
git commit
11.2、操作方案2—不同分支处理了不同文件,各分支间的修改相互独立没有修改到同一个文件
正常合并 (merge) 不会报出 冲突异常(conflict)。
11.3、操作方案3—不同分支修改了同一 文件的文件名
合并时报出 冲突异常
比如 read.txt 在分支 develop 改成 read1.txt
而另外一个人 操作 分支feature 时 将read.txt 改成了 read2.txt
这时 master 合并2个分支时 会出现异常,结果导致出现 read1.txt 与read2.txt 需要合理甄别,或者讨论后决定是 留住哪一个文件,还是都留下来,在 add 以及commit
Git 远程分支管理
12.1、单词
- remote
- clone
12.2、语法
git remote 操作
1 | git remote -v //查看远程信息 |
git clone 操作
1 | git clone [url/path] |
12.3、语义
不同克隆方法
1 | git clone /path/…………/project.git //哑协议 克隆 |
克隆一个 github项目
1 | git clone https://github.com/leobod/GitGuide.git //克隆当前项目到本地 |
使用远程自己 连接github项目
1 | git remote add github https://github.com/leobod/GitGuide.git |
使用远端一般 需要提前配置好 SSH 密钥 并将公钥 放置于GitHub 中使得GitHub放行
更对内容请参考 GIt 官网 3.5 Git 分支 - 远程分支
git 本地远程同步操作
13.1、单词
- fetch
- pull
- push
13.2、语法
1 | git fetch //从指定 远程 拉取文件到版本库 |
13.3、语义
在c0分支上做修改,并提交到远端,之后切换到master 合并c0分支的修改,再次提交
1 | git clone https://github.com/leobod/GitGuide.git |
当其他人修改了 文件,或者当远端 fast-forword(快过本地时,也就是commit 在上一回基础上有变更而本地 还没获取远端更新时)
方案1:
1 | git fetch origin |
方案2:
1 | git pull origin |
远程分支与本地分支映射关联
14.1、单词
- —set-upstream-to
- -u
- —unset-upstream
- -vv //此处是2个v
14.2、语法
添加本地与远程映射
1 | git branch --set-upstream-to=origin/remote_branch local_branch |
14.3、撤销分支关联
1 | git branch --unset-upstream local_branch |
查看所有分支的映射关系
1 | git branch -vv //此处是2个v |
查看所有分支(本地加远端)
1 | git branch -av |
删除远程分支
1 | git push origin --delete <remote_branch_name> |
14.4、Git对版本库的文件取消track
取消track方法
1 | git rm --cached file/dir |
14.5、GIt远程其他操作
[toc]
14.5.1、Git远程仓库
此处关注的是remote,而不太侧重clone
添加远程
1 | git remote add <name> <url> //添加 远程 同时可以指定 branch 以及其他 |
查看远程
1 | git remote -v |
远程仓库的重命名
1 | git remote rename <name> <new_name> |
远程仓库的移除
1 | git remote remove origin |
pull与push
1 | git fetch //从指定 远程 拉取文件到版本库 |
14.5.2、分支手动关联
1 | git branch --set-upstream-to=origin/remote_branch local_branch |
- 0鼓励
- 0菜狗
- 0正确
- 0错误
- 0思考
- 0无聊