这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
基本概念
- 版本库.git文件:当我们使用git管理文件时,一般会有一个git文件,叫做版本库
- 工作区:本地项目存放文件的位置
- 暂存区:通过add命令可以将工作区文件添加到暂存区,相当于缓冲区的一个概念
- 本地仓库:我们可以使用commit将暂存区的文件添加到本地仓库
- 远程仓库:比如我们使用Github来托管我们的项目,它就是一个远程仓库
查看文件状态
git status
常见状态
- Changes not staged for commit 表示暂存区没有内容,需要通过git addi添加
- Changes to be committed 文件已经在暂存区了,需要我们提交到本地仓库
- nothing to commit, working tree clean 这时,可以通过push,将代码提交到远程仓库
配置命令
git config --list // 列出当前配置
git config --local --list // 列出本地仓库配置
git config --global --list // 列出全局配置
git config --system --list // 列出系统配置
配置全局用户名和邮箱
git config --global user.name "name"
git config --global user.email "xxx@xxx.com"
为单个仓库配置用户名和邮箱
git config user.name "name"
git config user.email "xxx@xxx.com"
查看用户名和邮箱
git config user.name
git confit user.email
分支管理
查看本地分支
git branch
查看远程分支
git branch -r
查看本地和远程分支
git branch -a
切换分支
git checkout branch-name
创建并切换分支
git checkout -d branch-name
将指定分支合并到当前分支
git merge branch-name
删除远程分支
git push origin -d branch-name
分支重命名
git branch -m orderName newName
基本操作
git init // 初始化
git add <filename> // 将文件添加到暂存区
git commit -m "message" // 将暂存区文件提交到本地仓库
git push <远程主机名> <本地分支名>:<远程分支名> // 拉取远程仓库到本地
git fetch <远程主机名> <分支名> // 拉取远程仓库到本地
git fetch <远程主机名> <远程分支名>:<本地分支名> // 拉取远程仓库到本地
查看历史记录
git log
多屏显示的控制方式 空格向下翻页 b 向上翻页 q退出
git log --pretty=oneline
将一条记录显示在一行
git log --oneline
比git log --pretty=oneline更简洁
git reflog
HEAD@{移动到当前版本需要多少步}
版本前进后退
git reset --hard 哈希值
其他方式(只能后退)
git reset --hard HEAD^[几个异或向后退几步]
git reset --hard HEAD~[后退几步]
reset命令的三个参数对比
--soft参数
仅仅在本地库移动HEAD指针
--mixed参数
在本地库移动HEAD指针
重置暂存区
--hard参数
在本地库移动HEAD指针
重置暂存区
重置工作区
.gitignore
如果我们有不需要进行版本控制的文件,可以将文件路径写入.gitignore文件,git会将.gitignore中的文件忽略
# 忽略code目录下所有文件
code/
# 忽略所有.txt结尾的文件
*.txt
# 但不忽略a.txt
!a.txt
# 会忽略 doc/*.txt 但不会忽略doc/**/*.txt
doc/*.txt
# 忽略 doc/ 目录下所有扩展名为txt文件
doc/**/*.txt
比较文件差异
git diff[文件名]
将工作区中的文件和暂存区进行比较
git diff[本地库中历史版本] [文件名]
将工作区中的文件和本地库历史记录比较
cherry-pick
对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。
基本用法
git cherry-pick命令的作用,就是将指定的提交应用于其他分支
// 这条命令会将commitHash对应的提交,用应用于当前分支,并在当前分支上产生一个新的提交
git cherry-pick <commitHash>
举例来说,代码仓库有master和feature两个分支。
a - b - c - d Master
\
e - f - g Feature
现在将提交f应用到master分支。
# 切换到 master 分支
$ git checkout master
# Cherry pick 操作
$ git cherry-pick f
上面的操作完成以后,代码库就变成了下面的样子。
a - b - c - d - f Master
\
e - f - g Feature
从上面可以看到,master分支的末尾增加了一个提交f。
cherry-pick可以一次转移多个提交
git cherry-pick <commitHashA> <commitHashB> ... // 将A B两个提交应用到当前分支
转移一串的提交
git cherry-pick A..B
// 可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。
但上面的命令不会包含A,如果需要包含A,则需要使用以下命令
git cherry-pick A^..B
可选项
git cherry-pick命令的常用配置项如下。
-e,--edit
打开外部编辑器,编辑提交信息。
-n,--no-commit
只更新工作区和暂存区,不产生新的提交。
-x
在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。
-s,--signoff
在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。
-m parent-number,--mainline parent-number
如果原始提交是一个合并节点,来自于两个分支的合并,那么 Cherry pick 默认将失败,因为它不知道应该采用哪个分支的代码变动。
-m配置项告诉 Git,应该采用哪个分支的变动。它的参数parent-number是一个从1开始的整数,代表原始提交的父分支编号。
git cherry-pick -m 1 <commitHash>
上面命令表示,Cherry pick 采用提交commitHash来自编号1的父分支的变动。
一般来说,1号父分支是接受变动的分支,2号父分支是作为变动来源的分支。