Git 常用命令
config
git 全局配置文件在 ~ 目录下 .gitconfig 文件
git 项目配置文件在 项目目录下 .git 文件夹下 config 文件
remote 远程仓库
git 远程分支详解
查看本地关联的远程仓库
git remote -v
# 远程仓库名 远程仓库地址
# origin https://github.com/xxx/my-blog.git (fetch)
# origin https://github.com/xxx/my-blog.git (push)
本地设置远程仓库
# git remote add (添加远程仓库) origin(远程仓库名随便起) https://github.com/xxx/my-blog.git (远程仓库地址)
git remote add origin https://github.com/xxx/my-blog.git
# git push 推送代码 -u 同时为当前推送设置上游分支 origin master (origin 就是上面起的远程仓库名 master 分支名)
git push -u origin master
修改远程仓库地址
# git remote set-url origin(远程仓库名) https://github.com/xxx/my-blog1.git (远程仓库地址)
git remote set-url origin https://github.com/xxx/my-blog1.git
查看 GIT 未推送的提交记录
1 查看到未传送到远程代码库的提交次数
git status
显示结果类似于这样:
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
2 查看到未传送到远程代码库的提交描述/说明
git cherry -v
显示结果类似于这样:
+ afd5134be3bee5285d6c2ee2c82fc323012d74bb Update commit 1
+ 37a165ec0586f4af745bf538bc139fda6f1df672 Update commit 2
3 查看到未传送到远程代码库的提交详情
git log master ^origin/master
这是一个 git log 命令的过滤,^origin/master 可改成其它分支。
显示结果类似于这样:
commit 37a165ec0586f4af745bf538bc139fda6f1df672 (HEAD -> master)
Author: xxxx <xxxxx@163.com>
Date: Mon Jul 26 17:46:34 2021 +0800
Update commit 1
commit afd5134be3bee5285d6c2ee2c82fc323012d74bb
Author: xxx <xxxx@163.com>
Date: Mon Jul 26 09:54:24 2021 +0800
Update commit 2
总结
git status 只能查看未传送提交的次数
git cherry -v 只能查看未传送提交的描述/说明
git log master ^origin/master 则可以查看未传送提交的详细信息
Github 相关
新建仓库
echo "# test111" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/bitbw/test111.git
git push -u origin main
已有仓库
git remote add origin https://github.com/bitbw/test111.git
git branch -M main
git push -u origin main
git设置代理
设置局部代理
git config --local http.proxy 127.0.0.1:1080
端口要设置为本地代理的端口
设置全局代理
git config --global http.proxy 127.0.0.1:1080
为全局的 git 项目都设置代理
取消代理设置
git config --local --unset http.proxy
git config --global --unset http.proxy
git clone 同时设置代理
git clone -c http.proxy=http://127.0.0.1:1080 https://github.com/xxx.git
设置快捷别名
git config --global alias.cloneProxy = clone -c http.proxy=http://127.0.0.1:1080
git 大小写问题
问题复现:
- .新建一个 a.js 文件(大小写不敏感的状态下),并提交
- .修改本地 a.js 变为 A.js,文件内容无变更,无法提交
- 执行git config core.ignorecase false,修改 大小写敏感 规则,然后提交,查看结果,此时会存在 大小写 同时存在的文件
- 此时某种机缘下,再次执行 git config core.ignorecase true,大小写不敏感,
- 此时执行 git push , 即把最新的更新都更新到了 a.js 中
- 此时再修改 大小写敏感规则为敏感, 执行 git pull ,并不会拿到最新的更新。比如自己想要的是第一次修改后的 A.js ,但是服务器有一个没7. 有更新的 A.js 和 有更新的 a.js,而你只能拿到前者,所以就会遇到各种各样的坑……
解决办法
执行git config --global core.ignorecase false,全局设置 大小写敏感 。
- 文件变更比较少的情况
直接使用以下命令重命名文件,在 git 中不要直接修改文件名,最好的办法是使用下面的方式,
git mv -f [你想要删掉的文件] [你想要留下的文件]
git mv -f a.js A.js
## 等同于:
git rm a.js
git add A.js
这个命令的目的就是删除不需要的大小写同名文件,修改后 git push 提交变更即可。
- 变更比较多,并且拥有分支较高权限
- 在 github 删除该分支
- 本地执行 git rm -r --cached . (注意后面‘点号’)
- 然后重新 git push,就ok了
此法不太好,有点暴力,容易出问题,但适用于 变更发生于近期的情况。
总结:
其实看解决办法的话,只是一个很小的问题,但是出现的 bug 确实是让人很头疼的,因为 mac windows 在不设置大小写敏感规则的时候默认大小写是不敏感,项目部署的机器是 Linux 的,而 Linux 是大小写敏感的。所以这样的问题平时不易发现,本地调试的时候大部分时候并不会出错误,只有在项目部署的时候问题才会显示出来。
git push同时推送到两个远程仓库
进入你的项目目录,打开.git/config文件(.git是隐藏目录,需要打开显示隐藏文件…)
在url = xxx下再加一行其他远程库的路径,例如,开源中国的:
此后,你只需要git push origin master,即可同时推送到两个不同仓库的master。
git 别名配置
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git 根据用户名统和时间查看代码统计
参考:git 时间 查看代码统计
参考:gitlab代码查看行数
参考:git log排除文件
# 代码量统计
# 说明 ":(exclude)nouse" 为需要排除的文件 -- since开始时间 --until 结束时间 git log '分支名称'
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log 'bowen' --author="$name" --since=2022-02-07 --until=2022-8-15 --pretty=tformat: --numstat -- . ":(exclude)nouse_backup" ":(exclude)package-lock.json" ":(exclude)yarn.lock" | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
git worktree 的使用
工作模式
- worktree add 新的文件夹
- 打开的文件夹下载依赖后修改
- 测试没问题后 git push -u origin HEAD:目标分支
- 删除新的文件夹 git worktree prune 清理
注意事项
worktree 不允许两个 worktree 使用同一个分支。如果有这个需要怎么办?
- 新建一个分支,reset 到目标分支,再基于这个新分支工作,效果一样。
- 新建一个分支,使用 git push -u origin HEAD:目标分支, 目标分支再 pull
使用后不使再用的 worktree 删除后 ,运行 git worktree prune 清理