Git 是目前流行的非常好用的版本控制工具,它采用了分布式版本库的方式,不必依赖服务器端软件支持;使源代码的发布和交流极其方便。
git简介
在linux下安装非常方便:
sudo apt update
sudo apt install git
通过version获取版本信息:
git --version
基本配置
git安装后需要配置用户名与邮件:
git config --global user.name "Your Name"
git config --global user.email "youremail@yourdomain.com"
查看配置信息:
git config --list
保存密码
要保存git用户名与密码:
-
在home目录下创建.git-credentials,输入形如https://{username}:{password}@github.com 的配置信息;若有多个则每行一个。 $ vim ~/.git-credentials
http://myname:mypass@192.168.1.100/8090
http://myname:mypass%40123@192.168.1.101/8090 # 密码为 mypass@123
若用户名或密码中含有像**@这样的特殊符号**,则要通过URL编码方式(即使用%40 替换@ 符号)。 删除此文件,则删除了所有已保存的密码。 -
设定保存密码:git config --global credential.helper store -
查看:cat ~/.gitconfig,存在如下内容即代表成功: [credential]
helper = store
常用命令
命令 | 功能 |
---|
git init | 在本地的当前目录里初始化git仓库 | git status | 查看当前仓库的状态 | git add -A | 增加目录中所有的文件到缓存区 | git add file | 增加相应文件到缓存区 | git commit -m “信息” | 将缓存区中更改提交到本地仓库 | git rm file | 删除文件 | git log | 查看当前版本之前的提交记录 | git reflog | 查看HEAD的变更记录,包括回退 | git branch -b branch_name | 建立一个新的分支 | git diff | 查看当前文件与缓存区文件的差异 | git checkout – file | 取消更改,将缓存区的文件提取覆盖当前文件 | git reset --hard 版本号 | 回退到相应版本号,同样也可以回退到未来的版本号 | git clean -xf | 删除当前目录中所有未追踪的文件 | git config --global core.quotepath false | 处理中文文件名 |
git使用
回滚操作
通过git status查看状态,然后确定如何撤销
1、撤销git add添加的多余文件:
git reset HEAD # 上一次add的全部撤销
git reset HEAD file # 对某个文件进行撤销
2、撤销commit过的:
git log # 查看提交节点ID(按q退出)
commit xxxxxxxxxxxxxxxxxx # 即为节点ID
git reset XXXX # 回退到上一个提交节点,代码还是修改后的
git reset --hard XXXX # 回退到上一个提交节点,代码也被还原
3、丢弃本地的所有改动与提交
git fetch origin
git reset --hard origin/master
回滚后本地可能会比远程版本旧,但还要提交,可:git push --force
撤销操作也可通revert,git revert 和 reset 最本质的区别:
- revert 使用一个新的commit 来回滚希望回滚到的commit;reset 是直接把HEAD 指向回退的commit;
- revert 只会回滚希望回滚的哪一个commit的操作,不会影响其他的;reset 由于指针回退了,因此这个commit 之后的commit都会消失。
一般情况下:如果已经push了,使用revert,如果没有,就用reset。
gitlab创建仓库流程
先在gitlab上创建一个仓库然后clone到本地,添加文件后,上传:
-
git clone https://github.com/XXX -
在目录中添加代码文件: git add <file> # 将文件加入本地暂存区
git add . # 将当前文件夹下所有文件添加至暂存区
git status # 查看状态(修改的文件信息)
-
提交:git commit -m "message" -
上传:git push origion master
本地创建上传流程
先创建目录,并初始化:
.gitignore
通过.gitignore文件文件,Git就会自动忽略指定的文件或目录:
-
.gitingore 文件中,每一行指定一个忽略规则 -
反斜杠进行转义(\ 空格,开头的\# ) -
! 开头:标识否定,该文件将会再次被包含;如果排除了该文件的父级目录,则使用 ! 也不会再次被包含; -
/ 结束:只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件; -
/ 开始:匹配项目根目录; -
** 匹配多级目录,可在开始,中间,结束位置; -
? 通用匹配单个字符 -
* 通用匹配零个或多个字符 -
[] 通用匹配单个字符列表 -
如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore文件所在目录;
示例说明:
bin/ :忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略bin文件/bin :忽略根目录下的bin文件/*.c :忽略cat.c,不忽略build/cat.cdebug/*.obj :忽略debug/io.obj,不忽略debug/common/io.obj和tools/debug/io.obj**/foo :忽略/foo,a/foo,a/b/foo等a/**/b :忽略a/b,a/x/b,a/x/y/b等!/bin/run.sh :不忽略bin目录下的run.sh文件*.log :忽略所有.log文件config.php :忽略当前路径的config.php文件
示例文件
run.sh
/build*
/install
.vscode
/cmake-build*
/.idea*
__pycache__
特殊处理
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
强制添加忽略的文件:
git add -f ignored.file
检查忽略规则:
$ git check-ignore -v ignored.file
.gitignore:3:*.class ignored.file
.gitattributes
.gitattributes 是一个文本文件,文件中的一行定义一个路径的若干个属性,主要用于定义每种文件的属性,以方便 git 帮我们统一管理;格式为:
要匹配的文件模式 属性1 属性2 ...
一个属性(以text属性为例)可能有4种状态:
- 设置text
- 不设置-text
- 设置值text=string
- 未声明,通常不出现该属性即可;但是为了覆盖其他文件中的声明,也可以!text
可定义的属性:
Git LFS(Large File Storage)是 Git 扩展,通过延迟地(lazily)下载大文件的相关版本来减少大文件对仓库中的影响;具体来说,大文件是在 checkout 的过程中下载的,而不是 clone 或 fetch 过程中下载。
示例:
*.json eol=lf
*.jpg filter=lfs diff=lfs merge=lfs -text
*.lib filter=lfs diff=lfs merge=lfs -text
*.so* filter=lfs diff=lfs merge=lfs -text
*.a filter=lfs diff=lfs merge=lfs -text
*.docx filter=lfs diff=lfs merge=lfs -text
*.xlsx filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.tar filter=lfs diff=lfs merge=lfs -text
*.tar.gz filter=lfs diff=lfs merge=lfs -text
|