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>
# or
git checkout <name>

创建并切换分支


git switch -c <name>
# or
git 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] # 针对本项目设置

  • true 自动完成标准化转换
  • input 只做标准化操作,不做转换操作
  • false 提交与检出的代码都保持文件原有的换行符不变
  1. 标准化 指在提交代码到git数据库(本地库) 中将文本文件中的换行符CRLF转为LF的过程
  2. 转换 指在检出Git数据库代码过程中将文本文件中的换行符LF转换为CRLF的过程

.gitattributes 文件

  1. 优先级高于core.autocrlf的设置,所以能够避免每个开发人员配置不同的问题
  2. text 设置的时候,转换自动转换到对应平台的换行符
  3. 行号高的设置会覆盖行号低的设置
  • 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 分支上就可以了 图片