Git学习笔记
系统学习 Git 0 311

参考:

结构图示

  • Workspace: 工作区
  • Index/Stage: 暂存区
  • Repository:仓库区(本地仓库)
  • Remote: 远程仓库(Gitea或Github之类)

常规操作

新建代码库

  1. 创建仓库
    git init
  2. 下载一个项目的全部内容
    git clone url

配置

.gitignore

举例说明:

#注释           .gitignore的注释
config.js       忽略当前路径的config.js文件
*.txt           忽略所有.txt后缀的文件
!src.a          忽略除src.a外的其他文件
/todo           仅忽略项目根目录下的todo文件,不包括src/todo
build/          忽略build/目录下的所有文件,过滤整个build文件夹;
doc/*.txt       忽略doc目录下所有.txt后缀的文件,但不包括其子目录的.txt的文件
/*.c:           忽略/cat.c,不忽略 build/cat.c
debug/*.obj     忽略debug/io.obj,不忽略debug/common/io.obj
**/foo          忽略/foo, a/foo, a/b/foo等
a/**/b          忽略a/b, a/x/b, a/x/y/b等
!/bin/run.sh    不忽略bin目录下的run.sh文件

.gitconfig

  1. 显示当前的Git配置
    git config --list
  2. 编辑Git配置文件
    git config -e [--global]
  3. 设置提交代码时的用户信息
    git config [--global] user.name name
    git config [--global] user.email emailAddress

修改相关

  1. 增加文件/目录到暂存区
    git add file/dir
  2. 增加当前目录的全部文件/目录到暂存区【不包括已经删除的】
    git add .
  3. 增加项目中的全部被修改文件到暂存区
    git add -A
  4. 删除暂存区中的文件
    git rm --cached file
  5. 删除暂存区中的目录
    git rm --cached -r dir

提交相关

  1. 提交暂存
    git commit -m message
  2. 重写上一次的提交信息
    git commit --amend

对比相关

  1. 工作区与暂存区对比
    git diff file
  2. 暂存区与仓库区对比
    git diff --cached file
  3. 工作区与仓库区对比
    git diff HEAD file

记录相关

  1. 检查文件状态
    git status
  2. 查看当前分支的版本历史
    git log    # 完整
    git reflog # 简洁
    git log --graph # 图形
  3. 显示某个文件的版本历史
    git log --follow file
    git log -p file # 显示更改内容
  4. 显示某次提交的元数据和内容变化
    git show commit
  5. 显示某次提交时,某个文件的内容
    git show commit:file

回退相关

  1. 恢复暂存区的文件到工作区
    git checkout file # 指定文件
    git checkout . # 所有文件
  2. 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
    git reset file
  3. 重置HEAD【commit可以用HEAD^^HEAD~10或者版本号格式】
    git reset commit # 同时重置暂存区,但工作区不变
    git reset --hard commit # 暂存区和工作区都变 
    git reset --keep commit # 暂存区和工作区都不变
  4. 新建一个commit,用来撤销指定commit,后者的所有变化都将被前者抵消(工作区也变)
    git revert commit
  5. 暂时将未提交的变化移除,稍后再移入
    git stash
    git stash pop

分支相关

  • 创建分支
    git branch branchName # 新建一个分支,但依然停留在当前分支
    git branch branchName commit # 新建一个分支,指向指定commit
  • 查看分支
    git branch # 列出所有本地分支
    git branch -r # 列出所有远程分支
    git branch -a # 列出所有本地分支和远程分支
  • 切换分支
    git checkout branchName # 切换到指定分支,并更新工作区
  • 合并分支
    git merge branchName # 合并指定分支到当前分支
    • cherry-pick: 将一个或多个提交从一个分支应用到另一个分支
      • 这在需要将特定的更改应用到不同的分支时非常有用,但有时也会引入一些复杂性,特别是在处理冲突时。
      • 如果选择为每个任务创建分支,可以减少合并和冲突的概率,也更容易追踪和管理。
  • 删除分支
    git branch -d branchName
    git branch -dr remote/branchName
  • 清理分支(变基)
    git rebase

同步相关

  1. 关联远程仓库
    git remote add remoteName url    
  2. 拉取远程仓库,并与本地分支合并
    git pull remoteName branchName [--allow-unrelated-histories]
    --allow-unrelated-histories用于合并不相关的历史,一般用于初次pull
  3. 推送远程仓库
    git push [-u] [-f] remoteName branchName/--all
    • -u参数用于建立本地分支与远程分支之间的关联,以便在以后的操作中更加方便地管理分支,单远程仓库时可以使用-u选项
    • -f参数用于强制推送
    • 使用--all会推送所有分支
  4. 克隆远程仓库(整个版本库)
    git clone <url> <dirname>
  5. 下载远程仓库的所有变动
    git fetch remoteName

标签相关

  1. 列出所有tag
    git tag
  2. 新建一个tag在当前commit
    git tag tagName
  3. 新建一个tag在指定commit
    git tag tagName commit
  4. 删除本地tag
    git tag -d tagName
  5. 查看tag信息
    git show tagName
  6. 删除远程tag
    git push origin :refs/tags/tagName
  7. 提交指定tag
    git push remoteName tagName
  8. 提交所有tag
    git push remoteName --tags

发布相关

  1. 生成一个可供发布的压缩包
    git archive --format=tar main | gzip >release/main_$(date "+%Y-%m-%d").tar.gz

Git子模块简易操作

  • 子模块的git地址为: https://github.com/HenryJi529/OpenMorningstar.wiki.git
  • 大项目的git地址为: https://github.com/HenryJi529/OpenMorningstar.git

  • 添加子模块

    $ git submodule add https://github.com/HenryJi529/OpenMorningstar.wiki.git wiki/

  • 查看子模块
    $ git submodule
  • 删除子模块
    # 删除子模块内容
    $ git rm --cached wiki/ # 删除缓存区中的子模块
    $ rm -rf wiki/          # 删除工作区中的子模块
    还需要清理子模块信息:
    • .gitmodules
    • .git/config
    • .git/modules/wiki/
  • 克隆含子模块的项目
    1. 递归克隆
      $ git clone https://github.com/HenryJi529/OpenMorningstar.git --recursive
    2. 分步克隆
      # 克隆大项目
      $ git clone https://github.com/HenryJi529/OpenMorningstar.git 
      # 初始化子模块
      $ git submodule init
      # 更新子模块
      $ git submodule update
编写
预览