作为一个嵌软工程师, GIT 是要必备的技能之一, 以下内容将带你熟悉 git 常用的基础的操作
0.规范
1.环境管理
-
当你使用
ssh链接
时, 注意要生成自己的ssh公钥
, 否则无法推送, 报错权限不够# 生成ssh公钥方式 ssh-keygen -t rsa -C "e-mail" # 一路回车 cat ~/.ssh/id_rsa.pub # 查看ssh公钥
需要使用密钥时可以了解如下链接
-
本地分支就好与远程分支名字一样, 便于管理
-
如果不想使用
CLI
, 这里有几款优质的GUI GIT -
关于
git签名
的GPG了解一下
2.分支管理
git branch -a
- 查看仓库所有分支
2.1.拉取
2.1.1.普通拉取
# 新拉取特定远程分支
git clone -b 分支名 url
# 一步拉取全部分支
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
# 补充拉取远程远程分支内容(建立新分支)
git checkout -b 分支名 origin/分支名
# 将远程分支与本地分支进行关联
git branch --set-upstream-to=origin/远程分支 本地分支
# 同步远程内容 https://www.runoob.com/git/git-fetch.html
2.1.2.拉取子模块 - (CBB)
其他关于删除, 修改, 更新子模块操作, 可参考链接Git submodule 子模块的管理和使用
# 克隆项目时递归克隆所有模块
git clone 地址 文件夹名 --recursive(--recurse-submodules)
# 后补充子模块部分
git submodule update --init --recursive
# 创建子库
git submodule add -b master [URL]
# 更新子库
git submodule update --init
# 帖子
https://blog.csdn.net/yjkhtddx/article/details/108527042
2.2.推送
# 新推送到远程一个新分支
git push origin 本地分支名:远程分支名
# 强制推送分支: 强制推送且检查该分支是否单人开发
git push origin --force-with-lease master
2.3.删除
git push -d origin 远程分支名
git branch -d 本地分支名
3.内容管理
git status
查看当前暂存区状态git reflog
查看所有的提交git log --all --decorate --oneline --graph
可视化观察分支记录
3.1.删除文件
# 仅删除工作区, 未提交到暂存区
rm
# 一并提交到暂存区
git rm
3.2.add到暂存区
git add . # 所有变化提交暂存, 包括内容修改(modified)以及新文件(new)
git add -u # 仅监控已被 add的文件, 不包括新文件, --update
git add -A # 以上功能合集
3.3.内容的暂存-stash
当你出现需要临时切换分支工作时, 若当前分支已近有部分修改, 不要直接切换, 未经过版本管理的内容, 不会跟随转变, 若你还不想提交
commit
, 可以使用git stash
# 保存快照
# 此时工作空间内容会复位
git stash save ""
# 显示快照差异
git stash show stash@{1}
# 恢复快照1
git stash list
git stash apply stash@{0} # 不会删除堆栈内容, 可重复恢复
# 恢复快照2
git stash pop # 只能恢复一次
# 删除快照
git stash drop 名称 # 堆栈中移除某个指定的stash
git stash clear # 清除堆栈中的所有内容
3.4.内容撤销
撤销中间的某次提交,
git revert 6545689
, 其他内容不变, 且生成一次新提交
-
commit
到了版本库git reset --hard HEAD^ # 舍弃之前commit的修改, 恢复到当前commit最新状态 git reset --soft HEAD^ # 暂存区保留之前的commit修改
-
add
或其他修改, 已提交到暂存区git reset HEAD <file> # 撤销暂存区
-
工作区修改的内容撤销
git checkout -- <file> # 撤销工作区
3.5.git merge使用的优秀文章
4.其他有趣的操作
4.1.一次push到两个仓库
当你想每次将一个工作空间, 上传到两个仓库中时, 又不想每次
push
两次, 你可以
git remote add origin-all 仓库1链接
git remote set-url origin-all --push --add 仓库1链接
git remote set-url origin-all --push --add 仓库2链接
git push origin-all master # 一次推送到两个仓库
4.2.可视化冲突解决工具P4Merge
关于P4merger软件布局说明
关于合并冲突时的几个文件说明
# 工具下载链接 https://www.perforce.com/downloads/visual-merge-tool
# 下载安装好P4Merge之后, 将软件绝对路径添加到环境变量中
# 打开git bash运行如下6条指令
git config --global diff.tool p4merge
git config --global difftool.p4merge.path "软件绝对路径"
git config --global difftool.prompt false
git config --global merge.tool p4merge
git config --global mergetool.p4merge.path "软件绝对路径"
git config --global mergetool.prompt false
# 开始合并目标分支到当前分支时
# 做好目标分支更新
git checkout -b 目标分支 origin/目标分支
git pull origin 目标分支
git checkout 操作分支
# --no-ff好处细看文章https://blog.csdn.net/zombres/article/details/82179122
git merge --no-ff 目标分支
# 当不想保留分支的历史提交时, 可以使用--squash, 保证主分支代码整洁
git merge --squash 目标分支
# 当你使用git diff查看不同或解决冲突时使用如下命令代替
git difftool
git mergetool
# 取消本次合并
git merge --abort
# 合并完成后, 直接commit
# 合并成功后会有残留文件, 使用如下命令删除之一
rm *.orig
find . -name '*.orig' -type f -print -exec rm -rf {} \;
(1) “.” 表示从当前目录开始递归查找
(2) “ -name ‘.’ "根据名称来查找,要查找所有以.*结尾的文件夹或者文件
(3) " -type f "查找的类型为文件
(4) “-print” 输出查找的文件目录名
(5) "-exec"选项后边跟着一个所要执行的命令,表示将find出来的文件或目录执行该命令。
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,最后是一个分号
4.3.标签tag
Tag推荐两条链接 搞懂git标签的使用, 更细的参数节内容可跳转 - 实践
# 创建标签
git tag -a 标签名称 -m 附注信息 # 当前commit
git tag -a 标签名称 提交版本号 -m 附注信息
# 查看标签注释
git tag -n # 看到对应tag的信息, 没有注释则显示为commit信息
git tag --list
git tag -l
git tag
# 推送标签
git push origin 标签名称 # 将指定的标签上传到远程仓库
git push origin --tags # 将所有不在远程仓库中的标签上传到远程仓库
# 删除本地标签
git tag -d 标签名称
# 删除远程标签
git push origin :regs/tags/标签名称
git push origin --delete 标签名称
# 检出标签做事
git checkout -b 分支名称 标签名称 # 创建新分支对应标签开发
4.4.修改commit提交信息
5.必看文章
- Merge vs Rebase - 权衡好merge的可追溯性及rebase的简洁性