Git 常用指令 | 系统开发

本文最后更新于:2023年8月31日

[TOC]

开发过程中常用的 Git 指令总结。

全局设置用户名和邮箱

git config --global user.name "your_name"
git config --global user.email "your_email@email.com"

协作开发

# 拉取远程分支代码
git clone -b https://github.com/xxx/yyy.git

# 创建自己的本地开发分支
git checkout -b dev_branch

# 提交代码
git add .
git commit -m "完成开发"

# 合并分支最新代码
# 方法 1
git pull origin dev_branch # 相当于 fetch + merge
# 方法 2
git pull --rebase origin dev_branch # 相当于 fetch + rebase

# 解决冲突
# merge 引起的,处理完冲突后
git add .
git commit -m "合并分支"
# rebase 引起的,处理完冲突后
git add .
git rebase --continue

# 推送到远程仓库
git push origin dev_branch

撤销修改

  • 恢复删除但是未 add 到缓存区的文件
git reset HEAD filename
git checkout filename
  • 本地修改尚未 add 到缓存区

    git checkout -- filename # 单个文件/文件夹
    git checkout . # 所有文件/文件夹
  • 本地修改已经 add 到缓存区

    git reset HEAD filename # 单个文件/文件夹
    git reset HEAD . # 所有文件/文件夹
  • 本地新增尚未 add 到缓存区

    rm filename# 单个文件
    rm -r dir # 单个文件夹
    git clean -xdf # 所有文件/文件夹
  • 本地新增已经 add 到缓存区

    git rm --cached filename/dir # 单个文件
  • 修改最后一次 commit

    git commit -m "xxxxx" --amend
  • 回到某个 commit,保留未 add、commit 的内容,并将已经 commit 的内容变为已 add 未 commit 的状态

    git reset --soft xxxxx
  • 回到某个 commit,保留未 add、commit 的内容,并将已经 add、commit 的内容变为未 add 的状态

    git reset (--mixed) xxxxx
  • 回到回到某个 commit,放弃所有修改

    git reset --hard xxxxx

  • 撤销 pull
git reflog # 查看变更历史记录
git reset --hard xxx

恢复被删的文件

git reset HEAD ${deleted_file_or_folder}

git checkout ${deleted_file_or_folder}

子模块

创建

如果想要将一个已存在的仓库添加为当前仓库的子模块,可以通过下面的命令来添加新的子模块。

git submodule add https://github.com/xxx.git path/to/dir

注意:

  • 路径不能以 / 结尾(会造成修改不生效)
  • 不能是现有工程已有的目录

使用

  • 方法一:

    git clone --recursive https://github.com/xxx.git
  • 方法二:

    git clone --recursive https://github.com/xxx.git
    git submodule init
    git submodule update

修改

  1. 更新 .gitmodules 中对应 submodule 的条目 URL
  2. git submodule sync

更新

  1. 进入到字模块目录 git pull
  2. 在项目根目录 git push

删除

git submodule deinit ${module_name}
git rm --cached ${module_name}
rm -rf ${module_name}

重命名

删除后重新添加

仓库/分支管理

  • 取消关联远程仓库

    git remote remove origin
  • 关联远程仓库

    git remote add origin https://github.com/xxx/yyy.git
  • 关联本地分支与远程分支

    git push origin local_branch:remote_branch # local_branch 必须为你本地存在的分支,remote_branch 为远程分支,如果 remote_branch 不存在则会自动创建,local_branch 留空的话则是删除远程 remote_branch 分支
  • 合并远程分支,以远程/本地为准

    git fetch
    git merge origin/target_branch --strategy-option theirs # 以远程为准
    git merge origin/target_branch --strategy-option ours # 以本地为准
  • 重命名分支

    git branch -m old_name new_name # 本地分支重命名
    git push origin :branch_to_be_deleted # 删除远程分支
    git push origin 本地分支名:远程分支名
  • 查看分支关系图

    git log --graph --decorate --oneline --simplify-by-decoration --all
    # --decorate 标记会让 git log 显示每个 commit 的引用(如分支、tag 等)
    # --oneline 一行显示
    # --simplify-by-decoration 只显示被 branch 或 tag 引用的 commit
    # --all 表示显示所有的 branch,这里也可以选择,比如我指向显示分支 ABC 的关系,则将 --all 替换为 branchA branchB branchC

标签管理

  • 添加标签

    git tag tag_name
  • 推送标签

    git push origin tag_name # 单个标签
    git push --tags # 所有标签
  • 删除标签

    git tag -d tag_name # 本地标签
    git push --delete origin tag_name # 远程标签
    git push origin :refs/tags/tag_name # 远程标签

大文件

yum install git-lfs # 安装
git lfs install # 初始化
git lfs track xxx # 跟踪特定文件,提交代码需要将 .gitattributes 文件提交至仓库,它保存了文件的追踪记录
git add .
git lfs ls-files # 获取 git lfs 管理的所有文件列表
git commit -m "xxx"
git push

合并提交记录

git rebase -i HEAD~n

n 是包括最新提交在内的需要合并的记录的条数,此时会自动打开一个文本文件,注意这个文本文件中从上到下显示的提交顺序是从旧到新。从第二行开始将记录前面的 pick 改成 squash,然后保存退出。如果合并成功会打开另外一个文件文件,在这里输入这次合并时的提交记录信息。

如果需要合并远端仓库的提交记录,则在 push 的时候需要加上 -f 选项。

强制更新为远端代码

git fetch --all
git reset --hard origin/${target_branch}

允许合并无关的历史

git pull origin master --allow-unrelated-histories

拉取单独某个分支

git clone -b ${branch} --single-branch ${repo}

仓库瘦身

导出 stash 内容

git stash show "stash@{0}" -p > stash_0.patch

参考

7.11 Git 工具 - 子模块
git submodule 的简单介绍