用户设置

设置提交用户识别

1
2
3
4
5
6
7
8

#local设置当前项目

#global全局用户设置,在用户家目录下,一般以项目优先

# 不加local其实也是默认为local设置
git config --local user.name "*"
git config --local user.email "*"

查看当前库情况

1
cat .git/config

免密登入

使用ssh密钥

需要创建ssh密钥

1
ssh-keygen -t rsa -C "[email protected]"

t 指定加密形式,这里使用了rsa加密,C为comment,可以不需要,类似于git中提示。
上述命令会在 .ssh 文件下生成一对rsa的公私密钥,之后只需要将公钥发送到指定的服务器即可。

手动

直接拷贝pub公钥中的内容到指定服务器 .ssh 文件下的authorized_keys里即可。

ssh-copy-id

1
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server

会自动将公钥复制到服务器的authorized_keys中。

配置config

上述就已经能够完成免密登入,但是还需要输入ssh user@server的方式进行登入。为了简化登入过程,可以配置.ssh/config文件

1
2
3
4
5
Host 18
HostName [ip]
Port 22
User admin
IdentityFile "/home/admin/.ssh/id_rsa"

https

通过存储密码的形式
暂时存储密码

1
git config --global credential.helper cache

自定义时间

1
git config credential.helper 'cache --timeout=3600'

长期存储

1
git config --global credential.helper store

使用远程库直接实现
增加远程地址的时候带上密码

1
http://yourname:[email protected]/name/project.git

直接作为远程库

提升访问速度

来源
GitHub 镜像访问
这里提供两个最常用的镜像地址:
https://github.com.cnpmjs.org
https://hub.fastgit.org
也就是说上面的镜像就是一个克隆版的 GitHub,你可以访问上面的镜像网站,网站的内容跟 GitHub 是完整同步的镜像,然后在这个网站里面进行下载克隆等操作。
GitHub 文件加速
利用 Cloudflare Workers 对 github release 、archive 以及项目文件进行加速,部署无需服务器且自带CDN.
https://gh.api.99988866.xyz
https://g.ioiox.com
以上网站为演示站点,如无法打开可以查看开源项目:gh-proxy-GitHub(https://hunsh.net/archives/23/) 文件加速自行部署。
Github 加速下载
只需要复制当前 GitHub 地址粘贴到输入框中就可以代理加速下载!
地址:http://toolwa.com/github/
加速你的 Github(有问题)
https://github.zhlh6.cn
输入 Github 仓库地址,使用生成的地址进行 git ssh 等操作,最好不要用自己的库
谷歌浏览器 GitHub 加速插件(推荐-方便快捷)
如果可以直接访问谷歌商店,可以下载GitHub 加速工具,安装。
不方便的可以这里下载安装:
链接: https://pan.baidu.com/s/1rkSaN46THUlHYrjseSma-w
提取码: 8k1w
GitHub raw 加速
GitHub raw 域名并非 github.com 而是 raw.githubusercontent.com,上方的 GitHub 加速如果不能加速这个域名,那么可以使用 Static CDN 提供的反代服务。
将 raw.githubusercontent.com 替换为 raw.staticdn.net 即可加速。
通过 Gitee 中转 fork 仓库下载
不好用
修改hosts
有时候感觉也不快

基础使用方法

建议配合lazygit使用,快捷舒服。

除非提交或者清空缓冲池,否则在切换分支的时候缓冲池的内容会保留。

Name 功能 可选参数 参数解析
git clone 克隆远程库 o/master 表示远程分支,在克隆完成的时候自动完成HEAD分离,因为不能对远程直接操作,所以o/master不会随着HEAD移动
git status 状态查看
git add 将修改提交到缓冲池 . 全部文件
<文件名> 指定文件
git rm 删除 -cache 将缓冲池中的提交删除
-r 将本地文件和缓冲池中的文件一起删除,r表示全部文件,只能通过reset还原
-f <文件> 将记录中的文件删除,如果没有记录是无法删除的,但是如果提交到了缓冲区中,可以使用-f来进行删除
git commit 提交到本地库 -m 添加说明文档
–amend 能将当前次的提交归并到上一次提交中,避免生成一个新的节点
git log 版本提交记录,以当前HEAD的位置为最新(HEAD之后的不显示) –pretty=oneline
–oneline
git reflog 可以查看到所有的记录 –pretty=oneline
–oneline
[[git gc]] 清理不必要的文件并优化本地库
git diff 比较缓冲池中的文件和最近提交的差别 HEAD <文件> 和历史记录比较
<文件> 和缓冲池进行比较
None 比较所有文件
git clean 删除未被跟踪的文件 -n 先看看会删掉哪些文件
-f 删除 untracked files
-fd 连 untracked 的目录也一起删掉
-xfd 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)

冲突处理

标识符号

《表示当前分支
》表示合并分区
中间的内容就是不同,用===分割

远程

建立tracking关系

clone

默认建立master追踪origin/master分支。

branch方式

1
2
3
git branch --set-upstream master origin/next

#建立追踪关系之后可以直接使用git pull来更新

手动建立tracking

1
2
3
4

#建立跟踪分支,并进行拉取
git checkout -b foo o/master
git pull

或者通过如下建立:

1
2
3

#如果当前在foo分支上可以省略foo
git branch -u o/master foo

remote

远程管理。

参数 功能
-o git默认将远程主机命名为origin,通过该参数可以修改
show <主机名> 查看主机信息
add <主机名><网站> 添加主机
rm <主机名> 删除主机
rename <旧><新> 改名
-v 列出远程主机网站

fetch

获取更新但是不合并。只对o/master进行更新。不会影响本地的开发代码。

会移动o/master分支前进。

参数 功能
None 没有指定参数默认更新所有的分支,指定则更新指定分支
<主机名> 将远程的全部更新提取到本地
<主机名> <分支名> 取回的分支将以‘主机名/分支名’形式读取
git fetch origin :bugFix 会在本地新建一个bugFix分支获取

拉取更新pull

拉取远程分支并合并。

pull就是git fetch+git merge。

1
2
3
4
5
6
7

#与当前分支合并的时候可以省略:本地名
git pull <远程主机名> <远程分支名>:<本地分支名>

#等同于
git fetch origin
git merge origin/next

另一种方式

先fetch抓取然后就可以用分支名来进行合并。可以通过以下三种中的一种进行合并:

  1. git cherry-pick o/master
  2. git rebase o/master
  3. git merge o/master

推送更新push

除了更新远程也会将o/master更新到当前节点。

参数 功能
-u 用来设置第一次推送的默认主机
<远程主机名> <本地分支名>:<远程分支名> 将本地指定分支推送到远程指定分支
git push origin master 可以省略远程分支名
git push origin :master;或者使用:git push origin –delete master 省略本地分支名时表示删除指定的远程分支,等同于推送一个空的本地分支到远程
git push origin 分支名都可以省略
git push 直接追踪默认主机

指针

HEAD指针表示当前所在的位置,在提交的记录的时候必须要跟随分支名。

指针以HEAD为主,除非分离指针,不然分支名会跟随HEAD移动。

tag

固定不动的版本号。称为标签但是可以理解为静态的指针,不会随HEAD移动,起到锚点的作用。

describe

与tag相关,用来描述离你最近的锚点(也就是标签)。

1
2
3

#输出:最近的tag_距离_当前版本的hash值
git describe 版本号(未指定为当前HEAD位置)

分支操作

checkout

移动HEAD,既能实现分支的切换也可以实现将HEAD指针单独移动。
当使用分支名作为参数时,表示切换到指定分支,HEAD会跟随指针移动。
当使用节点标识作为参数时,会分离HEAD,HEAD将脱离具体分支进行操作。

branch

参数 功能
-v 查看本地分支
-r 查看远程分支
-a 查看所有分支
-f master HEAD~3 能不依靠HEAD指针进行分支回溯
name 创建分支
git branch -u o/master foo 建立远程track关系
-d 删除分支
-D 强制删除一个分支
git branch -m oldName newName 分支重命名

分支合并

merge

需要切换到要合并的分支,然后将指定的分支合并到该分支上。

分支名

merge <分支名>:将指定分支合并到当前分支,会保留合并分支等信息
image.png

冲突合并

两个分支上都对同一个文件进行了修改导致系统无法决定使用哪个修改结果,需要人为选择。两个文件的修改都会出现在当前的文件中,通过手动保留要修改的部分,删除掉表示来自于哪个分支的标志。之后通过git add+git commit合并。

rebase

rebase的合并方式是线性的。

分支名

**git rebase <分支名>**:会将2条分支的版本合并形成一条记录。将当前的分支按线性拼接到指定分支的之前。

merge不同,merge会创建一个新的节点作为合并的节点。

image.png

continue

git rebase continue: 出现冲突的时候代替commit命令使用。

-i

git rebase -i HEAD~4:图形化改变顺序,可以使用undo和reset撤销,不会计入节点

abort

git rebase abort:在任何时候都可以使用其来终止rebase的行为,回到rebase之前的状态。

cherry-pick

节点复制迁移指令,将提交的节点复制到指定的分支下。
举例来说,代码仓库有master和feature两个分支:

1
2
3
a b c d   Master
\
e f g Feature

现在通过在master分支下执行git cherry-pick f,将会将f提交到master分支下:

1
2
3
a b c d f   Master
\
e f g Feature

版本操作

每次提交记录或者对节点修改才会生成新阶段,移动指针不会。

reset

回溯操作。

hard

命令 功能
git reset hard 移动HEAD,重置暂存区,重置工作区
git reset hard HEAD^ 回退一格
git reset hard HEAD~1 回退一格
git reset hard HEAD 重置当前的修改

soft

仅仅在本地库移动HEAD指针

revert

撤销操作,会将指定的节点(指定的commit内容)从当前分支上撤销。这里有2种情况,多分支合并的节点和线性情况。

会生成一个新的节点,这个节点存了将某个节点撤销的操作,所以虽然指定的节点还在但是因为这个节点的原因无法被访问了。

1
git revert -m "" 标识

当是多分支的时候:
image.png

子模块

submodule

可以通过

1
2
3
git submodule add <url> <本地子库名>

# 通过上式可以会生成.gitsubmodule文件,会在当前的文件位置生成

的方式直接拷贝一个git库作为本库的一个依赖库,但是通过这种方式,会直接对子库进行git clone操作。

载入子库

方法一

可以在git clone的时候进行:

1
git clone <url> --recurse-submodules

进行同时克隆。

方法二

1
2
git submodule init
git submodule update

先克隆主库,然后单独对子库进行更新克隆操作。

recursive

循环克隆子库

当一个库还包含其他库的时候,使用这个命令可以将子库也都拷贝下来。

1
git --recursive <库>

gitignore

⚠️ 一定要在一开始就将不跟踪的对象写进入,不然后续无论在这里写啥都没有用了

基本使用

1
2
3
4
/文件 :只隔离根目标下的指定文件
文件/: 隔离所有指定文件
可以使用通配符
*文件 :所有指定名字的文件都不跟踪

高级操作

自动纠正输入错误

需要进行设置:

1
2
3
git config --global help.autocorrect 1

# 如果不想对全局生效的话,只需要去除-global

之后当输入错误的时候,Git 直接运行了它建议命令的第一个,也就是 git status,而不是给你展示它所建议的子命令。

给未追踪的文件来个备份

image.png

浏览另一个分支的文件

image.png

Git 中的搜索

用一个简单的命令你就能在 Git 中像专业人士一样搜索了。更有甚者,尽管你不确定你的修改在哪次提交或者哪个分支上,你依然能搜索。

1
git rev-list --all | xargs git grep -F ''

例如,假设你想在你的仓库中搜索字符串 “font-size: 52 px;” :

1
git rev-list –all | xargs git grep -F ‘font-size: 52 px;’F3022…9e12:HtmlTemplate/style.css: font-size: 52 px;E9211…8244:RR.Web/Content/style/style.css: font-size: 52 px;

git暂存修改不提交

当出现修改的内容还不想提交成为一次记录,但是又想要切换到其他分支进行作业的时候,很好用

命令 功能
git stash 将当前的修改暂存起来。经过这个操作修改的内容类似与被丢弃了,但是其实是存起来了。当前也是看不到的,所以git status会显示没有修改。
git stash list 展示暂存的信息
git stash pop 将暂存的结果取出来
git stash clear 将暂存丢弃
git help stash 查看git stash的可用命令