Git

git config

# 查看git信息
git config --list
git config --global user.name
git config --global user.email
# 配置git信息
git config --global user.name xxx
git config --global user.email xxx@xxx.xx

# git 忽略 crlf / lf 自动转换
git config --global core.autocrlf false

git 常用命令

git status

git clone [-b branch-name] https://xxx  [dir-name]

git add .

git commit -m xxx

git pull origin xxx

git push origin xxx

git tag v1.0.2  # 为当前分支打标签

git pull --rebase origin xxx 

# 解决冲突后
git add .
git rebase --continue
git rebase --abort

# 设置 git pull 以 rebase 模式进行
git config --global branch.autosetuprebase always

# 修改 ignore 清理缓存
git rm -r --cached .

git 分支操作

git branch

git checkout -b xxx

git checkout xxx

git branch -v      # 查看最后一次commit信息

git branch -d xxx  # 删除分支, -d 会检查 merge 状态, -D 强制删除

git cherry-pick 4c805e2 # 拉取一个特定的 commit,会自动生成一个新的 commit

git branch -m <oldbranch> <newbranch>  # 重命名本地分枝

git 远程分支

git branch -r      # 查看远程分支

git fetch --all    # 将本地所有分支与远程保持同步

git fetch -p       # 清理本地无效分支(远程已删除但是本地没删除的分支)

git push origin --delete xxx  # 删除远程分支

git remote update origin -p   # 更新远程分支列表

git remote -v      # 查看当前仓库 git 远程地址

git 恢复操作

git log
# 1、在工作区的代码
git checkout -- .         # 不会影响暂存区(add .)和 commit 之后的代码
# 2、代码git add到缓存区,并未commit提交
git reset HEAD .          # 将暂存区的代码恢复
git reset HEAD a.txt
# 3、git commit到本地分支、但没有git push到远程
git reset --hard HEAD^    # 重置工作区,回到上一次提交,会清空本次的所有更改,注意尽量避免使用
git reset --hard d9e0ed0  # 撤回到指定提交
git reset --soft d9e0ed0  # 撤回到指定提交并将变动恢复到工作区
# 4、git push把修改提交到远程仓库
git reset --hard HEAD^
git push origin dev -f    # 强制提交一次,之前错误的提交就从远程仓库删除
# 或
git revert HEAD           # 撤销最近的一个提交
git revert 6047c4ea3      # 会建立新的commit
git revert -n 6047c4ea3   # 不自动建立新的commit

暂存

git stash                      # 没有在 git 版本控制中的文件,是不能被 git stash 存起来的
git stash --include-untracked  # 暂存包含没有被追踪的的文件
git stash list
git stash pop                  # 应用并删除最近一次暂存
git stash pop stash@{1}
git stash clear                # 删除所有缓存的stash

fork 操作

git remote add upstream https://github.com/B/B.git # 关联其他远程仓库

git remote -v      # 查看远程仓库地址
git branch -vv     # 查看本地分支对应的远程分支

git pull upstream  # 同步上游代码

其他命令

git rm -r --cached . # 清理缓存

linux - centos 安装 git

# 下载安装包
wget https://github.com/git/git/archive/v2.8.0.tar.gz

# 解压
tar -xvf v2.8.0.tar.gz

# 下载依赖
yum -y install zlib-devel openssl-devel cpio expat-devel gettext-devel curl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

# 首先 cd 到 git 解压后到目录  然后  编译并安装Git
./configure prefix=/usr/local/git
make 
make install

linux - ubuntu 安装 git

apt update
apt install git

git fetch

git fetch  # 拉取所有更新到本地远程分支上(只是到本地的远程分支上,通过 origin/xxx 访问)
git fetch -p  # 拉取所有更新到本地远程分支上,并且删除不存在的远程跟踪分支(只是删除 origin/xxx 分支)
git fetch origin master
git pull origin master  # 可以将下列命令合并为一步

# 第一种方式,当前处在 master 分支
git fetch origin master
git merge origin/master

# 第二种方式,当前处在 master 分支
git fetch origin master:localBranch
git merge localBranch

# 第三种方式,当前处在 master 分支
git fetch origin master:temp
git merge temp
git branch -D temp

git merge

git merge targetBranch  # 合并 targetBranch 分支到当前分支
git merge --no-commit targetBranch  # 不要自动生成 commit

git rebase targetBranch  # 将当前分支的起始 commitId rebase 到 targetBranch 分支顶端

# 解决冲突时
# ====== 标记之前的内容来自于接收合并的分支,而在这之后的内容来自于要合并的分支

git 代码行数统计

# 所有人
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log  --since=2023-03-01 --until=2023-5-31 --author="$name" --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 }' -; done
# 单人
git log --since=2023-03-01 --until=2023-5-31 --author="wudandong" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s", add, subs, loc }'
# 忽略文件夹
git log --since=2023-03-01 --until=2023-5-31 --author="wudandong" --pretty=tformat: --numstat -- . ":(exclude)app/public" | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s", add, subs, loc }'

# -- . ":(exclude)folderName" 排除文件夹

# -- . ":(exclude)folderName1" ":(exclude)folderName2" 排除多个文件夹

get 切换仓库

cd existing_repo
git remote rename origin old-origin
git remote add origin git@gitlab.hollysys.net:hsm-os/code-lab/fex/hsmos-event-bus.git
git push -u origin --all
git push -u origin --tags