git的基础使用
Git的下载安装
我直接下载64位安装程序了,按需求下载。
之后就一直next就好了。
Git初始化配置
配置用户名和邮箱
1 | git config (可选) user.name "your name" |
可选选项指定了配置的范围:
省略(Local):本地配置,只对本地仓库有效
—global:全局配置,对所有仓库有效
—system:系统配置,对所有用户有效(一般不会使用这个)
保存用户名配置
1 | git config --global credential.helper store |
列出配置信息
1 | git config --global --list |
Git新建仓库
本地创建
选择一个空的文件夹来创建本地仓库:
(可以在命令末尾指定仓库名字,会新建一个文件夹来存放.git)
1 | git init |
回显:
1 | Initialized empty Git repository in D:/learn-git/.git/ |
这里的.git是一个隐藏目录,用普通的ls命令无法查看到,添加参数-a就能查看到。
进去之后能查看到git仓库的重要组成部分。
1 | D:\learn-git\.git>ls -altr |
远程克隆
1 | git clone 仓库地址 |
从github上克隆仓库到本地
Git工作区域和文件状态
工作区域
工作区working directory : 实际操作的目录,工作的目录。(.git所在的目录)
暂存区 staging area : 临时存储区域,用于保存即将提交到git仓库的内容。(.git/index)
本地仓库 Local respository : 包含完整代码和版本信息。(.git/objects)
1 | git add 工作区 -> 暂存区 |
文件状态
未跟踪untrack
还未被git管理起来的文件,通过add指令可以管理到暂存区
未修改unmodified
已经被git管理起来的文件,rm指令可以删除。
已修改modified
被git管理起来后,修改的文件,通过add指令可以添加到暂存区,可以用checkout恢复文件
已暂存staged
已经到暂存区的文件,通过commit能更新到本地仓库,reset指令能重置暂存区(使用默认参数)。
添加和提交文件
查看当前状态,添加-s参数能查看简略状态
1 | git status |
在工作区新建一个文件,然后添加到暂存区
查看暂存区内容
1 | git ls-files |
git add命令支持通配符,诸如 . * 之类
1 | git add |
提交暂存区的所有文件到仓库,用-m参数指定提交信息
1 | git commit -m " " |
最后可以用log命令查看提交记录信息。可以使用—oneline来参看简洁的提交记录
1 | git log |
如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步。命令格式如下:
1 | git commit -a |
git回退版本
1 | git reset 版本号 |
git回退版本有三个参数可以选择:
—soft:回退版本并保存所有工作区和暂存区的所有修改内容
—hard:回退版本并丢弃所有工作区和暂存区的所有修改内容
—mixed:回退版本,但保留工作区的修改内容,不保存暂存区的内容
假如我们的回退操作是误操作,可以参看操作记录并回退到操作前的版本
1 | git reflog |
但我们想要回退到之前的版本时,可以使用reset命令,或者时当你觉得多个操作可以统一成以此commit时,可以用混合或软回退版本,然后一次性提交工作区的文件。
git比较文件差异
比较工作区与暂存区的文件差异
1 | git diff |
比较工作区与版本库的文件差异
1 | git diff HEAD |
比较暂存区和版本库的
1 | git diff --cached |
比较两个特定版本之间的差异
1 | git diff 两个版本库的id(可以使用HEAD) |
HEAD是git里面一个重要的概念,他指向分支的最新提交节点(最晚提交的)
特定的,我们经常比较当前版本和上一个版本的差异,git有特定的方式
1 | git diff HEAD~ HEAD |
额外的,波浪线后面添加数字n可以指定前n个版本
命令后还能添加特定的文件名字,比较特定的文件之间差异
命令后添加两个分支名比较分支之间的差异。
git从版本库中删除文件
直接删除文件后提交
直接删除工作区中的文件,然后更新到暂存区再提交
1 | rm file1.txt |
检查当前状态,提示你将工作区的修改更新到暂存区并提交
1 | git add/rm file1.txt |
git rm命令来删除文件
1 | git rm filename |
git rm命令能一次性将文件从工作区和暂存区中同时删除,记得要提交到版本库。
1 | git rm --cached filename |
添加—cached参数能够将文件仅从版本库中删除。
.gitignore文件
忽略特定文件
作用:忽略掉不应该被加入到版本库中的文件,使得仓库体积更小。只要被该文件过滤的文件,将不会再被git检测到,并纳入版本控制中。
一般情况下,应该忽略以下这些文件:
1、系统或者软件自动生成的文件
2、编译产生的中间文件和结果文件
3、运行时产生的日志文件、缓存文件和临时文件
4、涉及身份密码等敏感文件
如何使用?
我们只要在该文件中列出需要忽略的文件的模式。
忽略某类文件的全部,一般都是使用通配符,比如忽略所有的.txt文件,只要在.gitignore文件里添加*.txt就好了。
注意:.gitignore文件对于已经存在于版本库中的文件是没有忽略作用的!!!!
忽略文件夹
附:git默认不会将空的文件夹纳入到版本控制中
.gitignore文件还能忽略特定的文件夹,文件夹的格式是以斜线结尾的。
.gitignore的匹配规则’
1、#开头的表示注释
2、使用Blob模式匹配(简化的正则表达式)
3、感叹号!表示取反
4、**代表任意的中间目录
远程仓库github
配置SSH公钥
通过在github上配置本地的SSH公钥,能够实现从本地push代码到github仓库的操作。
在用户的文件夹,输入以下命令生成rsa密钥:
1 | ssh-keygen -t rsa -b 4096 |
指定生成4096字节大小的rsa密钥。
注意:之后系统会提示你输入文件名称,如果你是第一次配置,可以直接跳过,文件名字默认是id_rsa;如果不是,输入特定的名称防止覆盖掉之前的密钥!!!
之后cd进.ssh文件,会有id_rsa和id_rsa.pub两个文件,第一个文件是私钥文件,第二个是公钥,复制公钥文件内容。
之后打开github的settings -> SSH and GPG keys,配置一个新的SSHkeys。
之后可以用git clone来克隆github上的仓库到本地了。(第一次clone会提示你这是一个未知的用户的密钥,需要你确认,输入yes就好了,然后你的.ssh文件夹会生成两个known_hosts文件)
配置config文件
在.ssh文件夹中创建一个config文件输入以下内容
1 | # github |
意思是,当我们访问githu.com时,指定使用.ssh文件夹下的id_rsa这个密钥。(之前电脑没配置好像也能用)
提交到远程仓库
推送本地仓库到远程仓库
1 | git push <remote> <branch> |
拉取远程仓库到本地仓库(省略分支名就默认拉main分支)
1 | gti pull <shortname> <远程分支名>:<本地分支名> |
关联本地仓库和远程仓库
先在github上创建一个空的仓库。
在本地仓库的终端输入(github中有提示):
1 | git remote add <shortname> <url> |
指定分支的名称为main
1 | git branch -M main |
关联本地仓库的main和远程仓库的main
1 | git push -u <shortname> main:main |
查看远程仓库:
1 | git remote -v |
git与vscode
将vscode配置到系统或者用户环境变量中后,可以在终端的任何地方使用以下命令来进入vscode代码编辑器
1 | code . |
在vscode中打开git管理的仓库后,点击侧边栏的源代码管理,可以看到仓库当前的状态。只要工作区的文件发生了修改,源代码管理就能检测到更改,在这里可以比较修改前后的代码(打开工作树),放弃修改(返回图标),添加到暂存区(加号图标),commit文件,还有查看文件的状态,以下列出各种状态的缩写:
??
(Untracked):未跟踪
M
(Modified):已修改
A
(Added):已添加到暂存
D
(Deleted):已删除
R
(Renamed):已重命名
U
(Updated):已更新未合并
vscode还能同步本地仓库和远程仓库,在源代码管理里都能查看到。
git与branch
git仓库里的分支是为了集成开发而存在的,在共同管理的项目中,每个人负责某个分支的开发,最终再集成到main中,高效且不会互相干扰。
以下命令创建分支:
1 | git branch 分支名 |
查看分支状态:
1 | git branch |
切换分支:
1 | git switch 分支名 |
这些新建的分支是独立于main分支而存在的,本身的修改不会影响到main分支。
合并分支merge
假如我们处在main分支,要将dev分支合并到main分支时:
1 | git merge dev |
我们当时所处在的复制为目标分支,merge后面的分支名为将要合并到目标分支的分支。
合并后git会默认产生一次提交,需要输入提交的消息。
查看分支图:
1 | git log --graph --oneline --decorate --all |
删除已经完成合并的无用分支:
注意:一定是合并后的分支
1 | git branch -d 分支名 |
我们也可以强制删除任意分支,包括未合并的:
1 | git branch -D branch_name |
合并分支时的冲突
当我们合并的两个分支之间修改了同一份文件,会发生合并分支冲突。
这时我们需要手工编辑这个文件之后再重新提交。提交之后会自动完成合并的过程。
如果我们在编辑过程时不想合并了,我们可以终止合并:
1 | git merge --abort |
回退和rebase
rebase也能进行合并操作,但不同于merge,我们可以在任意分支上进行合并操作。
当我们在main分支上时:
1 | git rebase dev |
当我们在dev分支上时:
1 | git rebase main |
rabase 的原理是变基:
每个分支的最新提交记录都有一个HEAD指针,rebase操作会先找到这两个分支的共同祖先,然后把当前分支上HEAD指向的最新提交记录到共同祖先之间的所有提交移动到目标分支的最新提交后面。
由此可见,上面两种操作虽然都能够将两个分支的文件合并,但是顺序略有不同,直观反映为HEAD指针的指向。
假如一个分支已经删除,可以使用checkout命令回退到分支存在时:
1 | git checkout -b <branch_name> <commit-hash> |
如果不写入提交记录的哈希值,这个指令默认创建一个新分支。
合并方法之间的差异
Merge
优点:不会破坏原分支的提交历史,方便回溯和查看
缺点:会产生额外的提交节点,分支图变得复杂
Rebase
优点:不会新增额外的提交记录,形成线性历史,比较直观和干净
缺点:会改变提交历史,避免在公共的分支使用(一般在集成开发不使用)。
git分支的工作流
给提交记录打标签
附注标签,包含具体的信息
1 | git tag -a -a <tag_name> -m <tag_message> |
轻量标签,本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。 创建轻量标签,不需要使用 -a
、-s
或 -m
选项,只需要提供标签名字:
1 | git tag <tag_name> |
后期打标签
1 | git tag -a <tag_name> <commit_hash> |
默认情况下,git push
命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样——你可以运行 git push origin <tagname>
。
分支命名规范
版本发布分支:使用tag来区分
功能分支:feature
修复bug分支:hotfix
开发分支:develop
……
分支管理
1、定期合并已经成功验证的分支,及时删除已经合并的分支
2、保持合适的分支数量
3、为分支设置合适的管理权限