[Util]git使用简介


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.c
  • debug/*.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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值