Git 指令

设置用户名与邮箱

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

生成 SSH Key 密匙

cd 到 ~/.ssh 目录下查看是否存在 id_rsa.pub 文件

1
2
3
$ cd ~/.ssh
$ ls
id_rsa id_rsa.pub

若不存在,执行

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

// 若涉及权限
sudo ssh-keygen -t rsa -C "emai<自己的邮箱>"

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

绑定远程仓库

1
2
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 // 克隆

git clone --depth=1 git@github.com:username/blog.git // 只下载减小克隆的深度来加速克隆,只下载最新的commit

git clone --depth=1 --jobs=4 git@github.com:username/blog.git // --jobs=4 告诉 Git 使用 4 个线程下载,加快下载速度

git fetch --unshallow // 当--depth之后,希望获取完整的仓库历史

- 创建分支

1
git checkout -b <分支名>

- 切换分支

1
git checkout <分支名>

- 拉取合并

1
2
3
4
git fetch origin // 获取远程分支/标签等到本地暂存区
git merge origin/<分支名>

git pull origin <分支> // 产生新的合并commit ID

- rebase 合并

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

git rebase --abort // 取消rebase操作

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

- 添加暂存区

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

- commit

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

- 创建 Tag

1
2
3
4
git tag  // 查看所有tag
git tag v0.0.1 // 创建 v0.0.1 的标签
git push origin tag v0.0.1 // 将 tag v0.0.1 推送到远程
git push --tag // 推送所有标签到远程

- 提交远程

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

- 查看分支

1
2
git branch  // 查看本地
git branch -a // 查看远程

- 删除分支

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

撤销

1
2
3
4
5
git reset <文件名> // 文件取消暂存区
git reset HEAD // 取消所有暂存取

git checkout -- <file> // 丢弃工作区的修改
git checkout -- . // 丢弃所有工作区

本地暂存

1
2
3
4
5
6
7
8
9
10
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}> // 删除指定一条暂存记录
git stash apply // 也是提取暂存记录,与pop不同的时,apply会保留stash记录,所以建议用pop
git stash apply <stash@{id}> // 也是提取暂存记录,与pop不同的时,apply会保留stash记录,所以建议用pop

回滚

1
2
3
4
5
6
7
8
9
10
11
12
// 1、会删除代码,commit 记录不保留
git reset —-hard <commit id> // 回滚到指定 commit
git push -f // 强制提交,远程仓库将回滚

// 2、会删除代码,回滚到上一个 commit
git reset --hard HEAD^

// 3、会覆盖代码,commit 记录保留
git revert <commit id> // 用新的 commit 来回滚之前的 commit

// 4、不会删除代码
git reset --soft HEAD^ // 撤销上一次 commit,并且可以重新 commit

找回丢失的提交

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

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

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

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

1
2
3
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