pr 的时候遇到了分支合并的种种问题, 延申出了一些常用命令, 之前也有总结过, 今天抽空汇总一下.

更新


[2019-3-16]

Added

  • 新增创建本地二层分支命令
  • 新增git stash储藏命令
  • 新增源仓库与fork仓库合并命令

[2019-3-24]

Added

  • 新增撤销merge命令
  • 新增合并merge冲突命令
  • 新增新建并关联origin分支命令
  • 新增查看commit历史命令

[2019-3-30]

Added

  • 新增查看本地分支和远程分支的关联

[2019-4-11]

Added

  • 新增删除origin中的某个文件

[2019-4-12]

Added

  • 新增clone远程仓库的指定分支

[2019-5-14]

Added

  • 新增合并两个没有关联的分支

[2019-6-16]

Added

  • 新增git loggit reflog的区别

[2019-8-19]

Added

  • 新增查看本地分支的标签
  • 新增查看远程分支的标签
  • 新增给当前分支打标签, 并添加自定义信息
  • 新增删除本地的某个标签
  • 新增删除远程的某个标签
  • 新增将本地的所有标签推送至远程

[2019-12-13]

Added

  • 新增 删除origin仓库的深层文件夹
  • 新增 git push -f强制推送到 Gitlab 出错

[2019-12-19]

Added

  • 新增 Fatal: out of memory, malloc failed (tried to allocate 1514190 bytes)
  • 新增 Fatal: another git process seems to be running in this repository

[2019-12-20]

Added

  • 新增命令: 重命名本地分支的标签

Changed

  • 更新 区块新增区块折叠, 避免篇幅过长

[2020-2-20]

Added

  • 新增命令: git打印文件夹结构

[2020-3-2]

Changed

  • 更新命令: git打印文件夹结构

[2020-4-14]

Added

  • 新增命令: 强制覆盖本地分支

[2020-12-25]

Changed

  • 更新命令: git 打印文件夹结构

[2021-1-2]

Added

  • 新增命令: git pull 自动化拉取子模块

【2021-1-13]

Changed

  • 优化文章格式,li 列表下的子元素统一缩进处理,增强可读性

[2021-1-14]

Added

  • 新增命令:更新远程分支

[2021-1-27]

Added

  • 新增命令:合并本地commit记录

[2021-2-23]

Added

  • 新增命令:取消某个本地分支与远程分支的关联

[2021-2-25]

Added

  • 新增命令:拉取一个具有子模块的项目的大致流程
  • 新增命令:拉取远程的所有分支到本地的大致流程

[2021-3-17]

Added

  • 新增命令:合并分支,产生新的提交并保留

[2021-3-18]

Added

  • 新增命令:更改最近一次commit的用户名和邮箱

[2021-4-23]

Added

  • 新增命令:图解git-merge策略

[2021-7-29]

Added

  • 新增命令:根据commit-message查找commit记录

[2022-8-8]

Added

  • 新增命令:查看当前分支是从哪个分支创建出来的

记录


  • 提交操作

    1
    2
    git add .
    git commit -m "xxx"
  • 撤销某次 push

    1
    2
    3
    git reset [id]
    git pull origin master
    git push origin master
  • 回退到指定版本

    1
    2
    git reset --hard [id]
    git push -f
  • 撤销某次 add

    1
    git reset HEAD
  • 撤销某次 commit

    1
    2
    git reset --hard [id]
    git pull
  • 查看远程仓库地址

    1
    git remote -v
  • 查看提交记录

    1
    git log
  • 查看指定版本

    1
    git checkout id
  • 删除本地分支

    1
    git branch -D [xxx]
  • 创建本地分支

    1
    git branch [xxx]
  • 切换本地分支

    1
    git checkout [xxx]
  • 推送当前所在分支到远程分支

    1
    git push origin [xxx]
  • 查看本地分支

    1
    git branch
  • 查看全部分支

    1
    git branch -a
  • 查看远程分支地址

    1
    git remote -v
  • 创建本地分支并推送到远程分支

    1
    2
    3
    git checkout -b [dev]
    git pull origin [dev]
    git push origin [dev]
  • 创建远程分支

    1
    2
    git checkout -b [本地分支名]
    git push origin [本地分支名]:[远程分支名]
  • 删除远程分支

    1
    2
    git push origin :[远程分支名]
    git push origin --delete [远程分支名]
  • 创建本地二层分支

    1
    git checkout -b [new branch] [base branch]
  • 暂存当前工作状态(切换分支之前使用)

    • git stash list

    • git stash save “”

    • git stash apply | pop

    • git stash drop stash@{index}

      1
      2
      3
      4
      git stash save ""
      git checkout [another branch]
      git stash list
      git stash pop
  • 原仓库与 fork 仓库合并

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 同步原仓库与本地仓库
    git remote -v
    git remote add upstream [原仓库地址]
    git checkout (master | branch/docs | xxx)
    git fetch upstream (master | branch/docs | xxx)
    git diff upstream/(master | branch/docs | xxx)
    git merge upstream/(master | branch/docs | xxx)

    # 同步本地仓库和fork仓库
    git push origin (master | branch/docs | xxx) -f
  • 撤销 merge

    1
    2
    git [reflog | log]
    git reset --hard [id]
  • 合并 merge 冲突

    1
    2
    3
    4
    5
    git fetch upstream [xxx]
    git merge upstream [xxx]
    # vscode手动合并冲突, 或者使用mergetool
    git add .
    git commit -m [xxx]
  • 新建并关联 origin 分支

    1
    2
    git checkout -b [xxx]
    git push --set-upstream origin [xxx]
  • 查看 commit 历史

    1
    2
    3
    4
    # 当前分支
    git log
    # 所有分支
    git reflog
  • 查看本地分支和远程分支的关联

    1
    git branch -vv
  • 删除 origin 中的某个文件

    1
    2
    3
    4
    5
    6
    7
    # 忘记加入.gitignore
    # 已push到远程仓库的文件

    git pull origin [xxx]
    git rm -r --cached [x]
    git commit -m
    git push origin [xxx]
  • clone 远程仓库的指定分支

    1
    git clone -b [xxx] [remote address]
  • 合并两个没有关联的分支

    1
    2
    3
    # 解决`fatal: refusing to merge unrelated histories`的错误

    git merge --no-ff [another branch] --allow-unrelated-histories
  • git loggit reflog的区别

    1
    2
    3
    4
    5
    # git log只查看当前分支的commit历史
    git log

    # git reflog查看当前项目的所有分支的提交历史
    git reflog
  • 查看本地分支的标签

    1
    git tag
  • 查看远程分支的标签

    1
    git ls-remote --tag
  • 给当前分支打标签, 并添加自定义信息

    1
    git tag v1.0.0 -m "release v1.0.0"
  • 重命名本地分支的标签

    1
    2
    git tag oldTagName newTagName
    git tag -d oldTagName
  • 删除本地的某个标签

    1
    git tag -d v1.0.0
  • 删除远程的某个标签

    1
    git push origin -d v1.0.0
  • 将本地的所有标签推送至远程

    1
    git push origin --tag
  • 删除 origin 仓库的深层文件夹

    原本使用比较熟悉的 git rm -r --cached xxx 来删除, 但是发现并不能删除文件, 报 fatal: pathspec 'xxx/xxx' did not match any files 的错误, 也就是说远程的文件夹不存在, 这不可能啊??? 于是改用另一个命令:

    1
    git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch xxx/xxx' --prune -empty --tag-name-filter cat -- --all

    但是随即出现了 fatal: bad revision 'rm' 错误, 原因是 Windows 系统下要使用双引号, 将其改为:

    1
    git filter-branch --force --index-filter "git rm -r --cached --ignore-unmatch xxx/xxx" --prune -empty --tag-name-filter cat -- --all
  • git push -f 强制推送到 Gitlab 出错

    使用 git filter-branch --force ... 命令删除 origin 仓库的无用文件夹之后, 想强制推送并覆盖 Gitlab 的远程分支, 出现了 remote: GitLab: You are not allowed to force push code to a protected branch on this project 的错误.

    原因是: master 分支被保护了, 处于 protected 状态.

    解决办法是: 接触保护, 并将其置为 unprotected 状态.

  • Fatal: out of memory, malloc failed (tried to allocate 1514190 bytes)

    问题背景: 想将本地的文章推送到 github 仓库, 执行完 hexo g -d 命令之后, 出现了这样的错误.

    产生原因: 文件大小超出了 git 传输的最大限制.

    解决办法: 既然超出了, 那就调大一些呗, 使用 git config http.postbuffer 88888888 来设置即可.

  • Fatal: another git process seems to be running in this repository

    问题背景:

    VS Code 突然崩溃, 打开新的 git 进程准备推送代码的时候出现这个问题

    解决办法:

    .git 或者 .deploygit 文件夹下的 index.lock 文件删除即可

  • git 打印文件夹结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 安装依赖项
    https://www.cnblogs.com/elian/p/10083317.html

    # 对照各个参数即可
    tree --help

    # 推荐使用
    $ tree -L 2 -I "node_modules" -o ./result.txt --dirsfirst
    # 排除多个文件夹
    $ tree -L 2 -I "node_modules|dist|xxx" -o ./result.txt --dirsfirst
  • 强制覆盖本地分支

    问题背景: 使用 jenkins 作自动化部署时, 本地回退了一次 commit, jenkins 构建报错, 提示 git pull 失败.

    解决办法: 自动化部署的时候, 可以直接使用远程分支覆盖本地分支:

    1
    2
    3
    4
    git fetch --all
    # 强制覆盖
    git reset --hard origin/master
    git pull
  • git pull 自动化拉取子模块

    1
    git pull --recurse-submodules
  • 更新远程分支

    1
    git remote update
  • 合并本地commit记录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 参考:https://zhuanlan.zhihu.com/p/87318673
    # 假设有三个commit
    # 这是 commit3
    # 这是 commit2
    # 这是 commit1 => HEAD

    # 需求是将 commit3 合并到 commit2

    git rebase -i <commit1-id>

    # pick => 使用提交
    # reword => 使用提交,但修改该提交的说明
    # edit => 使用提交,进入 shell 以便进行提交修补
    # squash => 使用提交,但合并到上一个提交
    # fixup => 与 squash 类似,但会丢弃 commit message
    # drop => 删除提交
    # reset => 将 HEAD 指向到该标记
    # merge => 创建一个合并提交,并使用原始的 commit message(如果没有指定原始的 commit message,使用注释部分的 oneline 作为 commit message),使用 -c <提交> 可以编辑提交说明
  • 取消某个本地分支与远程分支的关联

    1
    git branch --unset-upstream
  • 拉取一个具有子模块的项目的大致流程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    git clone https://github.com/ddzy/blog.git

    cd blog/themes/Nlvi

    git submodule update --init --recursive

    cd ../..

    npm install

    [npm cache clean --force]
  • 拉取远程的所有分支到本地的大致流程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 默认情况下,只能 clone 单个分支
    git clone https://github.com/ddzy/blog.git

    # 可以通过 `-b` 来拉取指定分支
    git clone -b dev https://github.com/ddzy/blog.git

    # git 不能一次性拉取所有分支
    # origin 分支(dev、release、fixbug)
    # 第一步:默认处于 master 分支
    git checkout -b dev origin/dev
    # 第二步:此时处于 dev 分支
    git checkout -b release origin/release
    # 第三步:此时处于 fixbug 分支
    git checkout -b fixbug origin/fixbug

    # 实际上,处于哪个分支无所谓,只需要遵循如下规范就可以了
    git checkout -b xxx origin/xxx
  • 合并分支,产生新的提交并保留

    1
    2
    3
    4
    5
    6
    7
    8
    # 比如有两个分支:dev 和 master
    # 当发布新版本的时候,需要将 dev 合并到 master,可以直接使用 `git merge`
    git merge dev

    # 但是假如我并不想在 master 上看到 dev 的历史 commit 记录,可以使用 `git merge --squash` 来产生一次新的提交
    git merge --squash dev
    git add .
    git commit -m "release: 发布新版本"
  • 更改最近一次commit的用户名和邮箱

    1
    git commit --amend --author='duanzhaoyang<duanzhaoyang@96966.com>'
  • 图解git-merge策略
    git-merge策略

  • 根据commit-message查找commit记录

    1
    2
    3
    4
    5
    # 在全部分支中查找
    git log -g --grep=内容

    # 只在当前分支中查找
    git log --grep=内容
  • 查看当前分支是从哪个分支创建出来的

    1
    git reflog --date=local | grep <分支名>