Git常用命令

如果您不能很好的应用 Git,那么这里为您提供一个非常棒的 Git 在线练习工具 Git Online,您可以更直观的看到您所使用的命令会产生什么效果。

安装

[mac] 通过 Homebrew 安装(推荐)

安装前检查:

检查本地是否自带 git。如果有,查看 git 安装路径,分析安装方式,选择性更新 git

1
git -v

检查本地 homebrew 是否自带。如果有,则更新下

1
brew -v

开始安装:

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安装完成后,根据提示将 Homebrew 添加到环境变量中(M 系列芯片需手动添加)

安装 git

1
brew install git

检查是否安装成功:

1
which git

更新 Homebrew 软件索引:

1
brew update

升级 Git:

1
brew upgrade git

其他安装方式,详见

Tips:

  • 系统自带的 Git 路径为 /usr/bin/git,Homebrew 安装的路径为:

    • Apple Silicon(M1/M2):/opt/homebrew/bin/git
    • Intel: /usr/local/bin/git
  • 如果你执行 which git 仍显示为 /usr/bin/git,说明未生效。请重新打开终端,或手动设置 PATH:

    1
    2
    echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.zshrc
    source ~/.zshrc

配置账号

1
2
git config --global user.name hua
git config --global user.email [your email]

生成的配置信息在用户根目录/.gitconfig

Tips:

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。这些变量存储再三个不同的位置:

  1. /etc/gitconfig 文件:包含系统上每一个用户及他们仓库的通用配置。如果在执行 git config 时带上 –system 选项,那么它就会读写该文件中的配置变量。(由于它是系统配置文件,因此您需要管理员吧或超级用户权限来修改它。)
  2. ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。您可以传递 –global 选项让 Git 读写此文件,这会对您的系统上所有的仓库生效。
  3. 当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。您可以传递 –local 选项让 Git 强制读写此文件,虽然默认情况下的就是它。(当然,您需要进入某个 Git 仓库中才能让该选项生效。)

每一个级别会覆盖上一个级别的配置,所以,**.git/config** 的配置变量会覆盖 /etc/gitconfig 中的配置变量。

日常技能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看分支合并图
git log --oneline --graph --decorate --all
# 删除暂存区
git rm -r -f --cached .
# 设置当前分支默认推送的远程分支
git push -u origin [match branch]
# 修改最近一次提交的备注信息
git commit --amend -m "update remark"
# 重复 fix bug,不更新提交信息
git commit --amend
# feature 分支(非主/公共分支),合并自身分支多个提交记录成一个有意义的提交记录,合理利用 fixup
git rebase -i HEAD~[number]
# 删除本地分支
git branch -d <branch name>
# 删除远程分支
git push -d origin <branch name>

查看提交记录

查看提交日志,会发现如下内容:

image-20230927165319670

commit 后面的那一串字符:sha1 计算的结果。

sha1、md5:加密算法、随机数,用于区分是哪一次提交。

自定义查看提交记录日志:

1
2
3
git log -2 // 2:指最近的2次提交
git log --pretty=online
git log --pretty=format:"%h -%an, %ar : %s"

文件名大小写

1
2
3
4
5
6
# 查看是否忽略文件名大小写
git config --global -l
git config <--local> -l
# 配置成不能忽略文件名大小写(windows系统下,安装git时会默认配置core.ignorecase=true,因为windows的文件名本身不区分大小写)
git config --global core.ignorecase false
git config <--local> core.ignorecase false

分支重命名

VSCode 中打开控制台,输入 git branch --help,弹出 branch相关网页,根据提示操作。

tops

安装 git 时,本地安装目录中会存在相关 git-doc 资料,路径如E:\Program Files\Git\mingw64\share\doc\git-doc
win 系列的系统,cmd 命令中输入 git branch --help也有效。

具体操作如下

1
2
3
4
5
6
7
8
# 本地分支重命名
git branch -m <old branch name> <new branch name>
# 删除远程需要重命名的分支
git push -d origin <old branch name>
# 推送新命名分分支
git push origin <new branch name>
# 修改本地分支与远程分支关联
git branch --set-upstream-to origin/<new branch name>

! 注意
当前本地分支与远程分支对应保持一致

打标签

记录项目的发版,常用附注标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 打附注标签
git tag -a <tag name> -m <"msg">
# 打附注标签(指定commit id)
git tag -a <tag name> -m <"msg"> <commit id>
# 推送本地仓库标签到远程仓库
git push origin <tag name>
# 列出所有标签
git tag -l
# 或者
git tag
# 列出标签(带匹配模式)
git tag -l 'v-*'
# 删除本地仓库标签
git tag -d <tag name>
# 再删除远程仓库标签
git push -d origin <tag name>

代码临时保存

如果你正在写开发新分支的需求,别的分支线上突然有 bug 需要修复,你或许只能被迫先提交写的代码,这种情况可以用以下命令操作:

1
2
3
4
5
# 工作区的代码临时保存
git stash
git status
# 恢复临时保存的代码到工作区(当你在切回自己的分支时,用指令恢复之前的代码就OK)
git stash apply

如果有未跟踪的文件,需要先git add <file>,再git stash。因为git stash只临时保存已跟踪的文件。

记录指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 保存未commit的代码
git stash
# 保存未commit的代码并备注
git stash save
# 查看stash所有列表
git stash list
# 删除所有记录
git stash clear
# 查看并应用最后一次的记录
git stash apply
# 删除记录并恢复到工作区
git stash pop
# 删除最近一次记录
git stash drop
# 删除指定记录
git stash drop stash@{<number>}

详见git stash更多信息

回退代码到指定版本

1
2
3
4
5
6
7
8
9
10
# 确定需要回退的分支,如 master
git branch
# 查看所有的历史版本,获取你 git commit 的某个历史版本的 id
git log
# 回退本地仓库(恢复上一次提交,保留暂存区的改动)
git reset --soft <commit id>
# 如果想丢掉工作区的改动,则用 --hard
git reset --hard <commit id>
# 推送到远程仓库某个分支
git push -f origin master

撤销指定的提交内容

1
2
3
4
git show <commit id>
git revert -m <number> <commit id>
# 如果需要回复之前撤销过的指定的提交内容,再次revert
git revert <commit id>

-m 选项接收的参数是一个数字,数字取值为 1 和 2,也就是 Merge 行里面列出来的第一个还是第二个,其含义用来保留某个分支。

git revert是用一次新的 commit 来回滚之前的 commit。

设置默认分支

一般不推荐全局设置默认分支,可根据项目需要设置默认分支。如 hexo + github 搭建的静态博客,静态资源所在的分支名一般命名为gh-pages,设置其为默认分支。

1
git config --local init.defaultBranch gh-pages

取消暂存区的更改

更改的文件不会还原到未更改的状态,只是把已更改的文件从暂存区移到了工作区,这个移到,美其名曰撤销。

1
2
3
4
# 撤销暂存区的某个文件到工作区
git restore --staged <file>...
# 取消暂存所有更改
git restore --staged .

恢复误删分支

1
2
3
4
5
# 结合工具GitLens过滤出误删分支的Author,找到最近的一次commit id
# 基于这个commit id,新建分支
git checkout -b <new branch> <commit id>
# 推到远程仓库
git push origin <new branch>

不用担心是谁创建的恢复分支,因为你并没有 commit,只是依赖指定的 commit id 创建分支,不会有个人信息记录。

git flow

一个成功的 Git 分支模型

GitLab 流程

Q & A

[mac] brew update 更新太慢

使用 USTC 国内镜像(推荐)

修改终端配置文件

1
vim ~/.zshrc

粘贴以下内容到文件末尾

1
2
3
4
5
6
# Homebrew 国内镜像加速(USTC)
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles"
export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api"
export HOMEBREW_NO_ENV_HINTS=1

保存并生效配置

1
source ~/.zshrc

[win] git status, git commit 等中文信息乱码问题

1
2
3
4
git config --global gui.encoding utf-8
git config --global i18n.commitencoding utf-8
git config --global core.quotepath false
git config --global svn.pathnameecoding utf-8

删除用户配置信息

  1. 找到 .gitconfig 文件直接删掉(最直接)

  2. 或通过命令删除

    1
    2
    git config --global(或 --system 或 --local) --unset user.name
    git config --global(或 --system 或 --local) --unset user.email

第一次发布项目(本地 -> 远程)

1
2
3
4
5
git init
git add . // 文件 -> 暂存区, "." 表示当前目录下的所有文件提交暂存区
git commit -m "第一次提交" // 暂存区 -> 本地分支(默认为master)
git remote add origin <远程项目所在的ssh地址(或http协议地址)>
git push -u origin master // 本地分支 -> 远程项目

本地 git 与远程 github 保持登录联通

git 的远程仓库托管网站,推荐 github

为了在本地和远程仓库之间进行操作, 可采取免密钥登录,配置 .ssh 先在本地配置, 然后把公钥发送给远程仓库 github

在本地 git 命令行中输入:

1
ssh-keygen -t rsa -C [email]

然后一直回车, 出现下图则表示成功

image-20230927165232917

发送给 github

  1. github -> settings -> SSH and … -> New SSH -> title & key

    image-20230927165251266

  2. 复制本地公钥(xx.pub)到 key 中,删掉最后的回车占位符

  3. 如果本地和远程成功通信,则在本地./ssh 目录中自动生成known-hosts文件

  4. 测试本地仓库与远程仓库的登录连通性

    1
    ssh -T git@github.com

本地创建 git 项目与远程项目进行关联

本地创建 git 项目与远程项目进行关联时,要保持本地电脑 PC 端 github 账号登录状态。(一般是本地电脑,这个跟 ssh 配置有关。ssh 配置指向其他地址,则其他地址上的 github 账号保持登录状态即可)参考本地 git 与远程 github 保持登录联通

  1. 先创建一个目录 demo

  2. 进入该目录,鼠标右键点击 git bash…, 打开 git 命令端, 输入 git init, 会自动在 demo 目录下生成 .git目录(该目录是隐藏的).

  3. github 上创建一个 Repository.

    image-20230927165301540

ssh: connect to host github.com port 22: Connection timed out

查看是否存在 id_rsa id_rsa.pun known_hosts 三个文件,如果没有则参考 ssh 本地关联远程 github

1
2
cd ~/.ssh
ls

继续使用 SSH,但换端口(443):

编辑 SSH 配置:

1
vim ~/.ssh/config

添加以下内容:

1
2
3
4
5
6
Host github.com
Hostname ssh.github.com
User git
Port 443
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa

测试连接:

1
ssh -T git@github.com

如果看到 Hi username! You've successfully authenticated... 就说明成功了

.gitignore 配置

使用场景:如 .gitignore 文件编写需要排除的文件。以下是常见的通配符:

  1. *:匹配任意字符。
  2. *.xxx:匹配后缀 .xxx的文件中。
  3. !xx.xxx:在后缀 .xxx 的文件中,排除 xx.xxx 文件,结合 *.xxx 使用。
  4. dir(目录)/:忽略 dir 中的所有文件。
  5. dir(目录)/*/*.xxx:能够忽略如 dir/t1/a.xxx, dir/t2/b.xxx,但不能忽略含 2 级以上的目录中的 *.xxx(如:dir/a/b/j.xxx)文件,这跟通配符 * 有关。
  6. dir/**/*.xxx:忽略任意级别目录中的 *.xxx文件。
  7. git 项目中创建的空目录,默认自动忽略,git status 查不到此目录信息。

文件名过长导致的错误

1
2
3
4
5
# 先查看默认的配置
git config --global -l
git config <--local> -l
# 如果没查到core.longpaths配置项或core.longpaths=false时,需要如下配置
git config --global core.longpaths true

怎么比较优雅的获取远程仓库

1
2
3
4
5
6
7
# clone 远程仓库的默认分支到本地
git clone <ssh:git url>
git checkout -b <branch a>
git pull origin <branch a>
# 上2行命令结果与下面一样
git fetch origin <branch a>:<branch a>
git checkout <branch a>

相关链接

[1] A successful Git branching model

[2] Introduction to GitLab Flow

[3] git 速查清单

[4] git reset

[5] git 备忘单

[6] git 中 tag 和 release 的区别

[7] Git 之 revert