Git 常用指令 | 系统开发

[TOC]

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

全局设置用户名和邮箱

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

协作开发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 拉取远程分支代码
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 到缓存区的文件
1
2
git reset HEAD filename
git checkout filename
  • 本地修改尚未 add 到缓存区

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

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

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

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

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

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

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

    1
    git reset --hard xxxxx

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

恢复被删的文件

1
2
3
git reset HEAD ${deleted_file_or_folder}

git checkout ${deleted_file_or_folder}

子模块

创建

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

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

注意:

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

使用

  • 方法一:

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

    1
    2
    3
    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

删除

1
2
3
git submodule deinit ${module_name}
git rm --cached ${module_name}
rm -rf ${module_name}

重命名

删除后重新添加

仓库/分支管理

  • 取消关联远程仓库

    1
    git remote remove origin
  • 关联远程仓库

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

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

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

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

    1
    2
    3
    4
    5
    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

标签管理

  • 添加标签

    1
    git tag tag_name
  • 推送标签

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

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

大文件

1
2
3
4
5
6
7
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

合并提交记录

1
git rebase -i HEAD~n

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

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

强制更新为远端代码

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

允许合并无关的历史

1
git pull origin master --allow-unrelated-histories

拉取单独某个分支

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

仓库瘦身

导出 stash 内容

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

cherry-pick

  • pick 单个 commit

    1
    git cherry-pick ${commit_id}
  • pick 单个 merge commit

    1
    git cherry-pick -m 1 ${commit_id}
  • pick 多个 commit

    1
    git cherry-pick ${commit_id_0} ${commit_id_1}
  • pick 范围 commit

    1
    git cherry-pick ${commit_id_earlier}^..${commit_id_later}

参考

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

Git 常用指令 | 系统开发

http://www.zh0ngtian.tech/posts/62f5606e.html

作者

zhongtian

发布于

2020-07-09

更新于

2024-01-09

许可协议

评论