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
查看密匙,如下图。
绑定远程仓库
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 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
会造成的问题如下:
参考: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 似乎也对文件名大小写不敏感。
解决方案
创建别名
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 乱码
- 输出结果为空,执行
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
|
其他
1
| git shortlog -sn --since="1 months ago"
|
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
|