跳到主要内容

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.0v1.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 message
  • squash:将该提交合并到上一个提交,并合并提交说明
  • 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'