git教程
用户设置
设置提交用户识别
1 |
|
查看当前库情况
1 | cat .git/config |
免密登入
使用ssh密钥
需要创建ssh密钥
1 | ssh-keygen -t rsa -C "name@gmail.com" |
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 | Host 18 |
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:password@git.oschina.net/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 | git branch --set-upstream master origin/next |
手动建立tracking
1 |
|
或者通过如下建立:
1 |
|
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 |
|
另一种方式
先fetch抓取然后就可以用分支名来进行合并。可以通过以下三种中的一种进行合并:
- git cherry-pick o/master
- git rebase o/master
- 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 |
|
分支操作
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 <分支名>:将指定分支合并到当前分支,会保留合并分支等信息
冲突合并
两个分支上都对同一个文件进行了修改导致系统无法决定使用哪个修改结果,需要人为选择。两个文件的修改都会出现在当前的文件中,通过手动保留要修改的部分,删除掉表示来自于哪个分支的标志。之后通过git add+git commit合并。
rebase
rebase的合并方式是线性的。
分支名
**git rebase <分支名>**:会将2条分支的版本合并形成一条记录。将当前的分支按线性拼接到指定分支的之前。
merge不同,merge会创建一个新的节点作为合并的节点。
continue
git rebase continue: 出现冲突的时候代替commit命令使用。
-i
git rebase -i HEAD~4:图形化改变顺序,可以使用undo和reset撤销,不会计入节点
abort
git rebase abort:在任何时候都可以使用其来终止rebase的行为,回到rebase之前的状态。
cherry-pick
节点复制迁移指令,将提交的节点复制到指定的分支下。
举例来说,代码仓库有master和feature两个分支:
1 | a b c d Master |
现在通过在master分支下执行git cherry-pick f,将会将f提交到master分支下:
1 | a b c d f Master |
版本操作
每次提交记录或者对节点修改才会生成新阶段,移动指针不会。
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 "" 标识 |
当是多分支的时候:
子模块
submodule
可以通过
1 | git submodule add <url> <本地子库名> |
的方式直接拷贝一个git库作为本库的一个依赖库,但是通过这种方式,会直接对子库进行git clone操作。
载入子库
方法一
可以在git clone的时候进行:
1 | git clone <url> --recurse-submodules |
进行同时克隆。
方法二
1 | git submodule init |
先克隆主库,然后单独对子库进行更新克隆操作。
recursive
循环克隆子库
当一个库还包含其他库的时候,使用这个命令可以将子库也都拷贝下来。
1 | git --recursive <库> |
gitignore
⚠️ 一定要在一开始就将不跟踪的对象写进入,不然后续无论在这里写啥都没有用了
基本使用
1 | /文件 :只隔离根目标下的指定文件 |
高级操作
自动纠正输入错误
需要进行设置:
1 | git config --global help.autocorrect 1 |
之后当输入错误的时候,Git 直接运行了它建议命令的第一个,也就是 git status,而不是给你展示它所建议的子命令。
给未追踪的文件来个备份
浏览另一个分支的文件
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的可用命令 |