Git使用与配置
v2.0 20201229
-
reference
-
一些概念
- HEAD:指向正在工作中的本地分支,可以理解为本地当前分支的别名;Git中的‘HEAD’是什么?- Git名词解释 - 简书
- branch:除了理解为“分支”,branch本质上是——每个branch在某个时刻体现为一个版本,这一行为的实现表现为branch对应的指针,指向一个commit;
安装git
略
git用户配置
设置git commit的身份和邮箱
git config 配置有三个级别:
- system(系统,相当于系统环境变量级别)
- global(用户,相当于用户环境变量级别)
- local(当前仓库)
由于底层配置会覆盖顶层配置,应依照system->global->local的顺序设置;
# 对当前用户进行配置:
git config --global user.name $用户名
git config --global user.email $邮箱
# 查看配置:
git config --system --list
git config --global --list
远程仓库(Github、GitLab)认证
git SSH签名
参考:Git-设置SSH Key - Grace - CSDN博客
ssh-keygen -t rsa -C # 生成ssh私钥和公钥
ssh-keygen -t rsa -b 4096 -C "email@example.com" # 按照需要设置rsa选项生成
cat ~/.ssh/id_rsa.pub # 查看公钥;复制到github设置里
# linux ~/.ssh/id_rsa.pub
# Windows C:Users<username>.sshid_rsa
ssh -T git@github.com # 测试连接
记录:创建私人项目A后,重置系统,使得.ssh目录下的私钥被删除后,私人项目A不能push,这时重新生成并添加ssh key。
git GPG签名
略
(有一些情况不设置这个也可以显示)
基本命令
git init # 将当前文件夹建立为一个 git repo
git clone -b $branchName $URL $localRepoName # 通过-b指定要克隆的分支,同时也可指定 clone 下来的本地 repo 文件夹名称
git status # 查看当前更改
git diff $file
git restore . # 丢弃(当前文件夹下的全部)修改
git add . # 添加(当前文件夹下的全部)文件到缓冲区
git reset HEAD # 撤销上一次add的操作
git commit # 不加-m,用vim写msg,第一行是标题,后面是备注
git commit -m "信息"
git commit -m `...`
git commit --amend # 更改刚刚提交的commit
git fetch # 默认 track origin(?)的指定分支,这个分支在clone 下来的时候指定了,或者在添加 remote 源的时候通过 -t 指定要 track 哪个分支;(这个分支必须要指定,否则虽然可以 fetch 但 pull 的时候不知道把哪个分支 merge 进来,不会默认 track master 分支或者同名分支;会提示使用 git branch --set-upstream-to=origin/master 这样指定)
git merge xxx # 合并xxx分支(的指定commit)到当前分支
# 从目标 commit 和当前 commit (即 HEAD 所指向的 commit)分叉的位置起,把目标 commit 的路径上的所有 commit 的内容一并应用到当前 commit,然后自动生成一个新的 commit。——即merge会进行这样的动作:S1施加当前分支落后的那些commit;S2生成一个新的commit;
git merge --abort # merge冲突待解决状态下,使用--abort放弃这次merge
git pull # pull 相当于先fetch再merge
git log # 查看当前分支提交历史
#####远程库#####
git remote -v # 列出远程仓库地址
git remote rm upstream # 删除远程仓库源地址
git remote add upstream [需要更换远程仓库的git地址] # 添加源
git push upstream dev # 把本地仓库地址 提交到新的远程仓库
git push -u upstream dev -f # 如果我们是迁移仓库,想用原有仓库覆盖远程仓库的代码
分支
git branch $newBranchName # 创建新Branch
git checkout $branchName # 切换到新分支
git checkout -b $newBranchName # 如果没有会创建这个新分支
git branch -d $branchToDelete # 删除分支
- ref
Commit流程
- 从公共代码库 clone 代码;
- 使用本地 git repo 查看代码;
- 若有编辑代码进行调试的需求,则签出到新分支;
3.1 编辑和调试代码;
3.2 暂存代码更改;
3.3 提交 commit ; - 若有并入公共代码库的需求;
4.1 fork 创建所属的 project
4.2 在本地 git repo 添加自己的 fork 作为 remote;
4.3 确认要 push 的 remote;
4.4 进行 push;
高级操作1.缩减commit次数,节省空间
- Gitlab - 清除commit节省空间 - 简书
另建一个孤儿分支,或者在某个稳定版本的基础上建立分支,再将一系列commit的更改全都添加到一个commit中;
假设现有一个项目Proj,其主分支为master,处于v1版本;我在master v1版本的基础上fork出了我的项目Proj1,并在Proj1 br1分支施加了更改v1.1, v1.2, v1.3..., v2.0;现在我希望将我的Proj1 v2.0的版本merge到Proj master上,但不希望保存v1.1...等等这些中间版本;那么我可以这样做:
- 将更改提交到 Proj1 br1分支上;
- 在Proj1 br1 v1.0的基础上创建一个分支new;
- 将当前的更改add和commit作为Proj1 new v2.0;【这样行不通】
- 可以将Proj1 new提起一个Request来merge到Proj master上;
rebase
rebase到某次commit,以后的更改会保留吗?——可以选择squash
使用rebase缩短Git提交历史的线
- (Git)合并多个commit - 我的分享 - SegmentFault 思否
让Git提交历史的几条线变成一条直线 - Rebase - 廖雪峰的官方网站
高级操作2.配置远程库的SSH v2
注:
- 注意路径“C:Users<username>/.ssh/id_rsa”中是Users不是User。
- 如果提示“unable to start ssh-agent service, error :1058”;则Win+R启动services,将OpenSSH Authentication Agent服务设为自动
- win10 unable to start ssh-agent service, error :1058 解决办法_qq_19926599的博客-CSDN博客_unable to start ssh-agent service, error :1058
用同一台电脑登录不同域名下的远程仓库
git 配置多个SSH-Key - stefanzhlg的博客 - OSCHINA
用同一台电脑登录同一域名下的远程仓库
多台电脑登录同一域名的远程仓库
拷贝原来的sshkey,可以在多台电脑上使用:同一个ssh key用在多台电脑上_澜临一-CSDN博客_二台电脑可以用一个ssh?
附录:config文件
# NAME1([NAME1@gitee.com](mailto:NAME1@gitee.com))
Host [NAME1.gitee.com](http://NAME1.gitee.com/)
HostName [gitee.com](http://gitee.com/)
PreferredAuthentications publickey
IdentityFile C:\Users\<username>\.ssh\id_rsa_gitee1
User git
Host [NAME2.gitee.com](http://NAME2.gitee.com/)
HostName [gitee.com](http://gitee.com/)
PreferredAuthentications publickey
IdentityFile C:\Users\<username>\.ssh\id_rsa_gitee2
User git
.ssh目录
id_rsa
id_rsa.pub
id_rsa_gitee1
id_rsa_gitee1.pub
id_rsa_gitee2
id_rsa_gitee2.pub
known_hosts