文章目录
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
.netrc
gitlab中同步时,有时需要.netrc配置来辅助(旧版中,当go的包名不是以.git结尾时)。
default login <loginname> password <password>
machine <domain-url> login <loginname> password <password>
在Windows下要配置.netrc需要:
- 在用户目录(
C:\User\{username}
)创建_netrc
文件; - 文件内容为登录的机器信息:
machine gitlab.mytest login alwaysrun password XXXXXXX
常用命令
命令 | 功能 |
---|---|
git init | 在本地的当前目录里初始化git仓库 |
git status | 查看当前仓库的状态 |
git add -A | 增加目录中所有的文件到缓存区 |
git add file | 增加相应文件到缓存区 |
git commit -m “信息” | 将缓存区中更改提交到本地仓库 |
git rm file | 删除文件 |
git log | 查看当前版本之前的提交记录 |
git reflog | 查看HEAD的变更记录,包括回退 |
git fetch | 获取所有分支信息(若切换分支时,看不到新的分支,需先执行此命令) |
git branch -b branch_name | 建立一个新的分支 |
git branch -a | 查看所有分支 |
git checkout -b dev origin/dev | 新建并切换到dev分支 |
git checkout dev | 切换到远程dev分支(远程要存在dev) |
git diff | 查看当前文件与缓存区文件的差异 |
git checkout – file | 取消更改,将缓存区的文件提取覆盖当前文件 |
git reset --hard 版本号 | 回退到相应版本号,同样也可以回退到未来的版本号 |
git clean -xf | 删除当前目录中所有未追踪的文件 |
git config --global core.quotepath false | 处理中文文件名 |
删除提交的文件:
git rm -r --cached {file}
git使用
创建分支
本地创建分支:
git branch dev # 创建分支
git checkout dev # 切换到分支
# git add .
# git commit -m ' '
# git remote add origin 远程仓库地址 # 本地创建的分支与远程仓库关联
git push -u origin dev # 上传到分支
远程创建分支:
# 在远程仓库gitlab上创建分支
git fetch # 同步分支信息
git checkout -b dev origin/dev # 切换到分支
# git add .
# git commit -m ' '
git push -u origin dev # 上传到分支
代码合并
把分支合并到master:
- 提交分支更新:git push -u origin dev
- 切换到master:
git checkout master
git pull origin master - 代码合并:git merge dev
- 查看是否有冲突:git status
- 推送代码:git push origin master
回滚操作
通过git status查看状态,然后确定如何撤销
直接撤销修改过的文件:
git checkout .
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
本地创建上传流程
先创建目录,并初始化:
-
git init
-
在目录中添加代码文件:
git add / git commit
-
添加到远程仓库:
# 添加关联的仓库 git remote add origin https://github.com/username/learngit.git # 首次推送时(-u 关联分支) git push -u origin master # 后续推送 git push origin 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
可定义的属性:
-
text:用于控制行尾的规范性;如果一个文本文件是规范的,则Git库汇总该文件(git 服务器上的文件)的行尾总是
LF
。 -
eol:设置行尾符号:
eol=lf:入库时将行尾规范为LF,检出时行尾不强制转换为 CRLF eol=crlf:入库时将行尾规范为LF,检出时将行尾转换为CRLF
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