Git
关于Git的一些总结, 持续更新中……
git 配置
配置Git
# 配置全局用户
$ git config --global user.name "用户名"
$ git config --global user.email "git账号"
# 删除全局配置
$ git config --global --unset alias.xxx
$ git config --global --unset user.xxx
查看Git
# 查看系统配置
$ git config --list
# 查看用户配置
$ cat ~/.gitconfig
# 查看当前项目的 git 配置
$ cat .git/config
# 查看本地 git 命令历史
$ git reflog
# git 中 D 向下翻一行 F 向下翻页 B 向上翻页 Q 退出
git 常用命令
Git 常用命令
# 查看工作区和暂存区的状态
$ git status
# 将工作区的文件提交到暂存区
$ git add fileName OR git add *
# 提交到本地仓库
$ git commit -m "本次提交说明"
# 将本地分支和远程分支进行关联
$ git push -u origin branchName
# 将本地仓库的文件推送到远程分支
$ git push
# 拉取远程分支的代码
$ git pull origin branchName
# 合并分支
$ git merge branchName
# 查看本地拥有哪些分支
$ git branch
# 查看所有分支(包括远程分支和本地分支)
$ git branch -a
# 切换分支
$ git checkout branchName
# 临时将工作区文件的修改保存至堆栈中
$ git stash
# 将之前保存至堆栈中的文件取出来
$ git stash pop
# 分支创建同步
$ git push --set-upstream origin branch_name
# 远程创建 与 本地对着
$ git checkout --track origin/branch_name
$ git checkout --track origin/20200710-pre
# 创建本地分支 并切换
$ git checkout -b branch__name
# 提交本地分支到远程分支上
$ git push origin branch__name
--soft 参数用于回退到某个版本
git reset --soft HEAD
--hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
git reset --hard HEAD
$ git reset –hard HEAD~3 # 回退上上上一个版本
$ git reset –hard bae128 # 回退到某个版本回退点之前的所有信息。
$ git reset --hard origin/master # 将本地的状态回退到和远程的一样
Pull Request(PR)操作
PR(Pull Request)通常是指:从自己的功能分支向
main/master发起合并请求。
# 1. 从主分支拉取最新代码
$ git checkout main
$ git pull origin main
# 2. 创建功能分支并开发
$ git checkout -b feat/login
# 3. 提交代码
$ git add .
$ git commit -m "feat: 登录功能优化"
# 4. 推送到远程分支
$ git push -u origin feat/login
# 5. 到 Gitee / GitHub 页面发起 PR
# 源分支:feat/login
# 目标分支:main
# 6. 如果 PR 期间主分支有更新,先同步主分支再继续提交
$ git fetch origin
$ git rebase origin/main
# 7. rebase 完成后,因为提交记录变了,需 要强制推送
$ git push --force-with-lease
# 8. PR 合并后,删除本地分支
$ git branch -d feat/login
# 9. 删除远程分支
$ git push origin --delete feat/login
PR 常见建议
- 开发新功能时,不要直接在
main/master上改代码,先切功能分支 - PR 前先同步目标分支,减少冲突
- 如果已经发起 PR,又同步了主分支并做了
rebase,推送时使用git push --force-with-lease --force-with-lease比--force更安全,推荐优先使用
Tag 操作
Tag 常用于版本发布,比如
v1.0.0、v1.2.3。
# 查看所有 tag
$ git tag
# 查看 tag 详情
$ git show v1.0.0
# 创建轻量 tag
$ git tag v1.0.0
# 创建附注 tag(推荐,用于正式发布)
$ git tag -a v1.0.0 -m "release: v1.0.0"
# 给指定提交打 tag
$ git tag -a v1.0.0 commitId -m "release: v1.0.0"
# 推送单个 tag
$ git push origin v1.0.0
# 推送全部 tag
$ git push origin --tags
# 删除本地 tag
$ git tag -d v1.0.0
# 删除远程 tag
$ git push origin :refs/tags/v1.0.0
# 基于某个 tag 检出代码(此时通常是 detached HEAD 状态)
$ git checkout v1.0.0
# 基于 tag 新建分支
$ git checkout -b hotfix/v1.0.1 v1.0.0
Tag 使用建议
- 正式版本发布建议使用附注 tag:
git tag -a - 打完 tag 后,记得执行
git push origin --tags,否则远程仓库看不到 - 如果 tag 已经推送到远程,删除时要同时删本地和远程
git rebase
git rebase用来“变基”,可以把当前分支的提交,重新接到目标分支的最新提交之后,让提交记录更线性。
# 先拉取远程最新代码
$ git fetch origin
# 切到自己的功能分支
$ git checkout feat/login
# 将当前分支变基到最新 main
$ git rebase origin/main
rebase 解决冲突
# 发生冲突后,先手动修改冲突文件
# 标记冲突已解决
$ git add .
# 继续 rebase
$ git rebase --continue
# 如果想放弃本次 rebase
$ git rebase --abort
# 跳过当前冲突提交(不常用)
$ git rebase --skip
交互式 rebase
# 合并最近 3 次提交
$ git rebase -i HEAD~3
常见指令:
pick:保留该提交reword:保留提交,但修改 commit messagesquash:将该提交合并到上一个提交,并合并提交说明fixup:将该提交合并到上一个提交,丢弃当前提交说明drop:删除该提交
rebase 注意事项
rebase会改写提交历史- 已经推送给别人共同开发的公共分支,尽量不要随意
rebase - 自己的功能分支在合并前使用
rebase很常见,可以让提交记录更整洁 rebase后再次推送,通常需要:git push --force-with-lease
git 快捷指令设置
git config --global -e 或者 cd ~ 然后 vi ./.gitconfig 进行编辑,将一下缩写放到【user】下
粘贴之后保存,开启新的命令行,就可以使用了,例如:
`gst` 命令行输入之后,就会出现当前项目下的git status。
- 以下为粘贴内容:
g = 'git'
ga = 'git add'
gaa='git add --all'
gapa='git add --patch'
gb='git branch'
gba='git branch -a'
gbl='git blame -b -w'
gbnm='git branch --no-merged'
gbr='git branch --remote'
gbs='git bisect'
gbsb='git bisect bad'
gbsg='git bisect good'
gbsr='git bisect reset'
gbss='git bisect start'
gc='git commit -v'
gca='git commit -v -a'
gcam='git commit -a -m'
gcb='git checkout -b'
gcf='git config --list'
gcl='git clone --recursive'
gclean='git clean -fd'
gpristine='git reset --hard && git clean -dfx'
gcm='git checkout master'
gcmsg='git commit -m'
gco='git checkout'
gcp='git cherry-pick'
gcs='git commit -S'
gd='git diff'
gdca='git diff --cached'
gdct='git describe --tags `git rev-list --tags --max-count=1`'
gdt='git diff-tree --no-commit-id --name-only -r'
gdw='git diff --word-diff'
gf='git fetch'
gfa='git fetch --all --prune'
gl='git pull'
glg='git log --stat'
glgp='git log --stat -p'
glgg='git log --graph'
glgga='git log --graph --decorate --all'
glgm='git log --graph --max-count=10'
glo='git log --oneline --decorate'
glol="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
glola="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --all"
glog='git log --oneline --decorate --graph'
gloga='git log --oneline --decorate --graph --all'
gm='git merge'
gmom='git merge origin/master'
gmt='git mergetool --no-prompt'
gmtvim='git mergetool --no-prompt --tool=vimdiff'
gmum='git merge upstream/master'
gp='git push'
gpd='git push --dry-run'
gpoat='git push origin --all && git push origin --tags'
gpu='git push upstream'
gpv='git push -v'
gr='git remote'
gra='git remote add'
grb='git rebase'
grba='git rebase --abort'
grbc='git rebase --continue'
grbi='git rebase -i'
grbm='git rebase master'
grbs='git rebase --skip'
grh='git reset HEAD'
grhh='git reset HEAD --hard'
grmv='git remote rename'
grrm='git remote remove'
grset='git remote set-url'
grt='cd $(git rev-parse --show-toplevel || echo ".")'
gru='git reset --'
grup='git remote update'
grv='git remote -v'
gsb='git status -sb'
gsd='git svn dcommit'
gsi='git submodule init'
gsps='git show --pretty=short --show-signature'
gsr='git svn rebase'
gss='git status -s'
gst='git status'
gsta='git stash save'
gstaa='git stash apply'
gstd='git stash drop'
gstl='git stash list'
gstp='git stash pop'
gsts='git stash show --text'
gsu='git submodule update'
gup='git pull --rebase'