git使用
# 当前配置
git config --list
user.email=[email protected]
user.name=jcleng
i18n.commitencoding=utf-8
i18n.logoutputencoding=utf-8
core.quotepath=false
credential.helper=store
# 设置
git config core.filemode true
# 添加全局用户和邮箱
git config --global user.name "你的名字或昵称"
git config --global user.email "你的邮箱"
# 方法1,使用远程仓库
git clone https://gitee.com/users/HelloGitee.git workplace
cd workplace
## 将当前目录所有文件添加到git暂存区
git add .
## 提交并备注提交信息
git commit -m "my first commit"
## 将本地提交推送到远程仓库
git push origin master
# 方法2,本地新仓库
git init
git remote add origin https://gitee.com/用户个性地址/HelloGitee.git
# 拉取远端地址
git pull origin master
# 或者commit之后强推
git push origin master --force
# 或者强拉, 如果本地有修改,需要先stash: git add --all && git stash
git fetch --all
git reset --hard origin/master
git pull
# 查看分支
git branch -a
# 创建分支
git branch lxx
# 推送到远程分支
git push origin test
# 切换分支
git checkout lxx
git push -f origin master
git reset --hard ac73f0
# 恢复到对应文件(需要修改再提交就变化了)
git reset --hard 12137c
# 撤销上次的commit并保留变更
git reset --soft HEAD~1
# 查看日志
git reflog
# 将当前分支重置为远程的master分支
git reset --hard origin/master
# 然后强推一下
git push -f origin feature/ljc
# 同步远程分支到本地
# 需要确保./.git/config配置文件这个是*,为而不是单独的分支
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
# 同步
git fetch origin 远程分支名称:本地分支名称
git fetch --all
# 如果当前仓库是浅clone需要执行, 以同步所有提交
git fetch --unshallow
使用 全局代理
git config --global http.proxy http://127.0.0.1:5555
取消 全局代理
git config --global --unset http.proxy
提交时处理换行符
# 文件权限,不检查
git config --global core.filemode false
# [推荐,使用wsl系统时,保持边3一致]文件换行,换行符转换设置为 input,即提交时把 CRLF 转换成 LF,检出时不转换。
git config --global core.autocrlf input
# 推送(push)分支时自动设置远程追踪关系(本地新分支推送到远程是无须--set-upstream,自动映射并创建远程分支)
git config --global push.autoSetupRemote true
# 注意,需要把编辑器的默认文档的换行服修改为LF
# vscode
"files.eol": "\n",
# 检查两边文件是否状态一致
git status
# .git/config原文
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
ignorecase = true
autocrlf = input
# 代理
[https]
proxy = http://www.leng2011.icu:7892
[http]
proxy = http://www.leng2011.icu:7892
[https]
proxy = socks5://jcleng:[email protected]:7890
[http]
proxy = socks5://jcleng:[email protected]:7890
记住密码
# 永久记住密码
git config --global credential.helper store
# 创建密码保存文件
touch ~/.git-credentials
nano ~/.git-credentials
# 添加如下(coding)
https://j.c.leng%40foxmail.com:密码@git.coding.net
# 连接加密码
https://用户名:密码@github.com/jcleng/finalshell-linux-flatpak.git
清除掉缓存在git中的用户名和密码
https://git-scm.com/docs/git-credential-cache
# 或者变更记住密码时间,秒
git config --global credential.helper 'cache --timeout=10'
还原修改的文件
# 针对新文件
# Would do...
git clean -n demo.txt
# force执行
git clean -f demo.txt
# 针对已经存在的文件,且修改过
git restore demo.txt
# 比较2次间文件的变化, 区间是左开右闭 (x,z]
git diff a934057480a39ea1ede349c9efcdb9d237878c83 32b57833f960ca1237bf85c515532fa982f7352e --name-only | xargs zip update_pack.zip
# 单次提交的文件
git show ef287aaf18dfc822d512e52397383d498b0cb30 --name-only | xargs zip update_pack.zip
# windows安装7z和busybox, 放到变量环境
git diff fbf602529fa39078469ef1267904d11c6b1beae1 0f2bda6b5bfd506cb808edc7e19840fde65b1ee3 --name-only | busybox xargs 7z a update_202205132.zip
# 使用tar
git diff b810452c1c820f19bc6f789f34cbb2ed7448589f 0ec8a6fe8a3d59fe56f4f7008d34acb78ad13608 \
--name-only | xargs tar zcvf update_pack.tar
# 解压
tar xvf update_pack.tar
# 更新到线上
dd if=./update_pack.tar | ssh [email protected] "dd of=/tmp/update_pack.tar && tar -xzvf /tmp/update_pack.tar -C /www/wwwroot/admin"
配置中文不显示
git config --global core.quotepath false
git config --global i18n.commitEncoding utf-8
git config --global i18n.logOutputEncoding utf-8
修改commit编辑器
git config --global core.editor vim
# vscode
git config --global core.editor "code --wait"
区分大小写
# 查看默认配置
git config --get core.ignorecase
# 设置为区分大小写
git config core.ignorecase false
线上有分支,本地无法同步和切换
git branch -a
# 本地只有master,fetch也无效
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/test
# 手动创建即可
git checkout -b test remotes/origin/test
git获取最近提交的日期
# 包含了取第一行,替换-字符串,获取第一个列
git show --pretty=format:"%ci %cr" | head -1 | sed -s 's/-//g'|awk '{printf $1}'
新增.gitignore之后需要清楚缓存之后才会生效
git rm -r --cached ./.vscode/
统计信息
git log --author="jcleng" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'
# 使用 gitstats 生成统计报表, 进入git项目目录
gitstats . ./.vscode/gitstats
php -S 0.0.0.0:12345 -t ./.vscode/gitstats
# 查询今日0点到当前时间commit message的信息(过滤)
git log --since=midnight --until=now --pretty=tformat:%s|grep -iE "Add:|Update:|Fix:"
异常处理
# 索引异常, 删除索引,然后重新同步并重置分支
# error: bad signature 0x00000000
# fatal: index file corrupt
rm -f .git/index
git reset
git fetch --all
git reset --hard origin/master
# git 提示 ENOENT, 无法输入密码
cat ~/.gitconfig
env | grep "vscode" | grep "git"
unset GIT_ASKPASS
unset VSCODE_GIT_IPC_HANDLE
unset VSCODE_GIT_ASKPASS_MAIN
git-lfs
# 安装
apt install git-lfs
git lfs install
使用脚本更新git部署docker容器
#!/usr/bin/env sh
NowPath=$(pwd)
cd /www/wwwroot/Central-Platform-Management
git add --all && git stash
git fetch --all
git reset --hard origin/develop
rm -rf ./runtime/*
docker restart management && sleep 6
# 把日志写到docker logs
docker exec -d management bash -c "cd /www/wwwroot/Central-Platform-Management && php ./bin/hyperf.php server:watch > /proc/1/fd/1"
# ! 既写到docker logs又打印到终端控制台
docker exec -d management bash -c "cd /www/wwwroot/Central-Platform-Management && php ./bin/hyperf.php server:watch | tee /proc/1/fd/1"
cd $NowPath
# 删除线上分支
git push origin --delete test
# 删除本地分支
git branch -D test
stash本地暂存的使用
# 加入变更文件到暂存
git stash
# 暂存并注释
git stash push -m ok
# 查看暂存列表和ID
git stash list
# 恢复上次暂存并删除(如果有冲突, 先git add .)
git stash pop
# 恢复指定,但是不删除
git stash apply stash@{0}
# 恢复指定,并删除
git stash pop stash@{0}
git操作日志
reflog
# 查看操作日志,会精确到本地每一次变更
git reflog
# 每一个哈希以及每一个HEAD@{}都是一次本地代码的操作变更
# pull拉取线上代码,结果是9cf35389回退上一个版本就是49677edf
9cf35389 (HEAD -> master, origin/v1.1.0.6, origin/master, origin/HEAD) HEAD@{0}: pull: Fast-forward
# checkout切换分支
49677edf (v1.1.0.6) HEAD@{1}: checkout: moving from v1.1.0.7 to master
5931edf2 (origin/v1.1.0.7, v1.1.0.7) HEAD@{2}: checkout: moving from v1.1.0.8 to v1.1.0.7
# commit提交代码,实际所在分支是22的v1.1.0.8
dd50ac75 HEAD@{21}: commit: Fix: 修正回收 变更用户资金
7d3088f8 HEAD@{22}: checkout: moving from v1.1.0.8 to v1.1.0.8
# fetch同步不会操作文件, 所以没得记录