git常用命令
基础
在 Git 中,用 HEAD 表示当前分支&&版本
所以上一个版本就是 HEAD^, 上上一个版本就是 HEAD^^, 上 n 个版本的话也可以 HEAD~n
版本操作
回退到上一个版本
git reset --hard HEAD^
回退到指定版本
git reset --hard <commit id>
回退远程版本
# 带上-u 参数其实就相当于记录了push到远端分支的默认值# 这样当下次我们还想要继续push的这个远端分支的时候# 推送命令就可以简写成git push即可git push -u origin master -f
分支相关
切换分支
git switch <name># orgit checkout <name>
创建并切换分支
git switch -c <name># orgit checkout -b <name>
因为 git checkout 不仅仅只可以操作分支, 甚至还可以操作文件, 所以尽量不要用 git checkout 来操作分支(会很危险)
合并指定分支到当前分支
开启zdiff3
Git 早在 2008 年就提供 diff3,用于冲突展示时额外提供该区域的原始内容(两个分支公共祖先节点在此区域的内容),帮助更好的合并冲突。在 2022 年 Q1 发布的 Git 2.35 ,提供了一个新的选项 zdiff3,进一步优化了diff3 的展现。
# 项目配置git config merge.conflictstyle zdiff3# 删除项目配置git config --unset merge.conflictstyle# 使用默认配置git config merge.conflictstyle merge# 全局配置git config --global merge.conflictstyle zdiff3# 删除全局配置git config --global --unset merge.conflictstyle
git merge <name>
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而 fast forward 合并就看不出来曾经做过合并
删除本地分支
# 参数为-D 则为强制删除git branch -d <name>
删除远程分支
git push origin --delete <name>
删除远程仓库的叫 name 的分支,同名的本地分支并不会被删除,所以还需要单独删除本地同名分支
重命名分支
git branch -m <oldName> <newName>
强制 push
git push -f origin
更推荐用安全版本的强制 push
加了-with-lease
之后, 如果远端有其他人推送了新的提交, 那么推送将被拒绝, 这种拒绝和没有加 --force
参数时的拒绝是一样的
git push --force-with-lease
操作文件
恢复暂存区的指定文件到工作区
# -- 是可选参数# 用于指定后面跟着的参数只是文件路径, 而不是branch分支名或者commit信息git checkout HEAD [--] <file>
恢复某个 commit 的指定文件到暂存区和工作区
git checkout <commit> <file>
恢复暂存区的所有文件到工作区
git checkout .
git的配置解决windows和linux的换行符不共通问题
core.autocrlf
git config --global core.autocrlf [true | input | false] # 全局设置git config --local core.autocrlf [true | input | false] # 针对本项目设置
- 标准化 指在提交代码到git数据库(本地库) 中将文本文件中的换行符CRLF转为LF的过程
- 转换 指在检出Git数据库代码过程中将文本文件中的换行符LF转换为CRLF的过程
.gitattributes 文件
- 优先级高于core.autocrlf的设置,所以能够避免每个开发人员配置不同的问题
- text 设置的时候,转换自动转换到对应平台的换行符
- 行号高的设置会覆盖行号低的设置
- text
- text 自动完成标准化与转换
- -text 不执行标准化与转换
- text=auto 根据 Git 决定是否需要执行标准化与转化
- 不设置 使用core.autocrlf配置决定是否执行标准化与转换
- eol
- eol=lf 强制完成标准化,不执行转换(相当于指定转换为LF格式)
- eol=crlf 强制完成标准化,指定转换为CRLF格式
- binary
- binary 二进制文件不参与标准化与转换
- 不设置 由 Git 决定是否为二进制文件
每行基本形式:
filter attr1 attr2 ....
filter 代表匹配文件的通配符,在它后面跟着相应的属性,用空格间隔。
例:
* text=auto*.js eol=lf*.jsx eol=lf*.ts eol=lf*.tsx eol=lf*.css eol=lf*.json eol=lf*.yml eol=lf*.yaml eol=lf*.svg eol=lf*.md eol=lf*.mdx eol=lf*.png binary
团队合作
各自在各自分支写代码, 写完之后往 dev 分支上合并
发布的时候再把 dev 分支合并到 master 分支上就可以了