Git 指令

设置用户名与邮箱

1
2
git config --global user.name "name<自己的用户名>"
git config --global user.email "email<自己的邮箱>"

生成 SSH Key 密匙

1
ssh-keygen -t rsa -C "emai<自己的邮箱>"

执行成功后执行 cat ~/.ssh/id_rsa.pub查看密匙,如下图。
SSH KEY

绑定远程仓库

1
2
3
4
# 初次绑定
git remote add origin "https://github.com/xxx/xxx.git"
# 修改远程仓库
git remote set-url origin "new repository"

常用指令

基础

- 克隆

1
2
3
4
5
6
7
8
# 克隆
git clone git@github.com:username/blog.git
# 只下载减小克隆的深度来加速克隆,只下载最新的commit
git clone --depth=1 git@github.com:username/blog.git
# --jobs=4 告诉 Git 使用 4 个线程下载,加快下载速度
git clone --depth=1 --jobs=4 git@github.com:username/blog.git
# 当--depth之后,希望获取完整的仓库历史
git fetch --unshallow

- 创建分支

1
git checkout -b <分支名>

- 切换分支

1
git checkout <分支名>

- 拉取合并

1
2
3
4
5
# 获取远程分支/标签等到本地暂存区
git fetch origin
git merge origin/<分支名>
# 或 产生新的合并commit ID
git pull origin <分支>

- rebase 合并

1
2
3
4
5
6
7
8
9
10
# 不产生新的合并commit ID,合并远程代码
git pull origin <分支> --rebase
# 不产生新的合并commit ID,仅支持合并本地代码
git rebase <分支>
# 合并前十次commit
git rebase -i HEAE~10
# 合并指定多个commit,如果是中的commit,回发现HEAD指针是指向对应的commit,这时候可以基于这个Commit新建分支`rebase-branch`,切换回老分支,执行 git rebase rebase-branch
git rebase -i <start commit> <end commit>
# 取消rebase操作
git rebase --abort

rebase 实际效果如下:
rebase
rebase 会造成的问题如下:
参考:https://waynerv.com/posts/git-rebase-intro
参考:https://www.daolf.com/posts/git-series-part-2/

- 添加暂存区

1
2
3
4
# 添加所有到暂存区
git add .
# 添加指定分支到暂存取
git add <分支名>

- commit

1
2
3
4
# 仅暂存区代码 commit
git commit -m "提交日志"
# 添加所有文件到暂存区,并 commit
git commit -am ""

- 创建 Tag

1
2
3
4
5
6
7
8
# 查看所有tag
git tag --list
# 创建 v0.0.1 的标签
git tag v0.0.1
# 将 tag v0.0.1 推送到远程
git push origin tag v0.0.1
# 推送所有标签到远程
git push --tag

- 提交远程

1
2
3
git push
# 强制提交
git push -f

- 查看分支

1
2
3
4
# 查看本地
git branch
# 查看远程
git branch -a

- 删除分支

1
2
3
4
5
6
#  删除本地分支
git branch -d <分支名>
# 强制删除本地分支
git branch -D <分支名>
# 删除远程
git push origin -d <分支名>

撤销

1
2
3
4
5
6
7
8
# 文件取消暂存区
git reset <文件名>
# 取消所有暂存取
git reset HEAD
# 丢弃工作区的修改
git checkout -- <file>
# 丢弃所有工作区
git checkout -- .

本地暂存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 添加需要暂存的文件
git add <需要暂存的文件>
# "暂存日志"
git stash commit
# 查看所有暂存记录
git stash list
# 提取最新一条暂存记录并删除它
git stash pop
# 提取指定的一条暂存记录并删除它
git stash pop <stash@{id}>
# 删除所有暂存记录
git stash clear
# 删除最新的一条暂存记录
git stash drop
# 删除指定的一条暂存记录
git stash drop <stash@{id}>
# 提取暂存记录并保留记录(不同于pop,pop会删除暂存记录,apply会保留)
git stash apply
# 提取指定的一条暂存记录并保留记录(不同于pop,pop会删除暂存记录,apply会保留)
git stash apply <stash@{id}>

回滚

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 会删除代码,commit 记录不保留
# 回滚到指定的 commit,并删除回滚之后的所有更改
git reset --hard <commit id>

# 强制推送到远程仓库,将远程仓库的代码回滚到指定 commit
git push -f

# 2. 会删除代码,回滚到上一个 commit
# 回滚到上一个 commit,删除最新的 commit 及代码
git reset --hard HEAD^

# 3. 会覆盖代码,commit 记录保留
# 使用一个新的 commit 来撤销之前指定的 commit,保留之前的提交记录
git revert <commit id>

# 4. 不会删除代码
# 撤销上一次 commit,保留修改,但不删除代码,可以重新 commit
git reset --soft HEAD^

找回丢失的提交

1
2
git reflog
git log --graph --oneline --decorate $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > reflog.txt

:reflog 并不会永久保存,它有 90 天的过期时间。

1
2
# reflog 是 Git 用来记录本地仓库分支顶端的更新的一种机制,它会记录所有分支顶端曾经指向过的提交,因此 reflogs 允许我们找到并切换到一个当前没有被任何分支或标签引用的提交
git reflog

使用.gitignore 无效的解决方法【已托管在 git 上的文件,需要保持到本地仓库】

1
2
3
4
5
# 所有文件
git rm -r --cached .
# 指定文件
git rm -r --cached <文件名>
git add .

git 对文件夹名大小写不敏感

原因

  • Git 在默认情况下是对文件夹名大小写不敏感的,这种行为是因为 Git 的设计目标是要在不同的操作系统上工作,并且一些操作系统(如 Windows)对文件名大小写不敏感,而另一些操作系统(如 Linux 和 macOS)对文件名大小写敏感。
  • 默认情况下,Git 也会继承操作系统的行为。

实际

  • 实际操作发现,在 Mac 上操作 git 修改文件名大小写,并没有被识别到。意味着 Mac 上操作 git 似乎也对文件名大小写不敏感。

解决方案

  • 方式一:通过设置 core.ignorecae 为 false,实际效果,会在远程保留老的文件夹,并创建新的名称的文件夹。(不推荐)

    1
    git config core.ignorecase false
  • 方式二:分 2 个 commit 提交。修改原来文件名为其他名称,如你要把文件夹 abc 改为 Abc

    1
    2
    3
    4
    5
    # 第一步
    #abc -> new_abc,并提交远程

    # 第二步
    #new_abc -> Abc,并提交远程

创建别名

  • 帮助自己更简洁的使用 git
1
2
3
4
5
6
7
8
9
git config --global alias.sl "log --graph --decorate --pretty=oneline --abbrev-commit --all"
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset %C(bold blue)<%an>%Creset ---%C(yellow)%d%Creset %s %Cgreen(%cr)' --abbrev-commit"
git config --global alias.co checkout
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.df diff
git config --global alias.ig "update-index --assume-unchanged"
git config --global alias.ug "update-index --no-assume-unchanged"

Git 乱码

  • 先看下 LANG 环境变量是否为统一字符编码:
1
echo $LANG
  • 输出结果为空,执行 export LANG="zh_CN.UTF-8" 命令,问题能否解决?
1
export LANG="zh_CN.UTF-8"
  • 如果不能,再试下修改 git config, 这样应该就能解决了。
1
2
3
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8
export LESSCHARSET=utf-8

其他

  • git 近一个月提交排名
1
git shortlog -sn --since="1 months ago"
  • git 近一个月代码提交行数排名
1
2
git log --since=1.months --format='%aN' | sort | uniq -c | sort -rn | head -n 10 | while read count author; do echo -e "$author:\t$count"; git log --author="$author" --since=2.months --oneline --shortstat | grep "changed" | awk '{inserted+=$4; deleted+=$6} END {print "\tInserted lines:", inserted, "\n\tDeleted lines:", deleted}'; done

  • 查看当前目录下的代码行数
1
git ls-files | xargs wc -l