何以解忧
何以解忧
发布于 2024-05-30 / 152 阅读
0
0

Git教程-操作手册(个人笔记)

安装git

1,下载Git

2,Git配置

# git提交代码需要设置名字和邮箱:
git config --global user.name "Your Name"     # 设置全局用户名
git config --global user.email "email@example.com" # 设置全局邮箱

# 其他配置
git config --global alias.co checkout        # 创建命令别名
git config --global core.autocrlf input       # 统一换行符设置(跨平台)
git config --list                    # 查看所有配置

常用操作

创建操作

# 初始化新仓库
git init                            # 在当前目录创建新的 Git 仓库
git init <directory>               # 在指定目录创建新仓库

# 连接到远程仓库
git remote add origin <url>        # 添加远程仓库地址(首次关联)
git remote set-url origin <new-url> # 修改已关联的远程仓库地址

克隆操作

# 克隆完整仓库
git clone <url>                    # 克隆远程仓库到当前目录
git clone <url> <dirname>          # 克隆到指定目录

# 克隆特定分支
git clone -b <branch> <url>        # 只克隆指定分支

# 克隆优化选项
git clone --depth 1 <url>          # 浅克隆(仅最新提交历史)
git clone --single-branch <url>    # 仅克隆默认分支

提交操作

# 基础提交
git add .                          # 添加所有修改到暂存区
git commit -m "feat: add feature"  # 提交暂存区内容

# 跳过暂存区提交(仅限已跟踪文件)
git commit -a -m "fix: update"     # 自动添加修改并提交

# 修改提交
git commit --amend                 # 修改最后一次提交(可改描述/内容)
git commit --amend --no-edit       # 修改提交内容但保留原描述

# 部分提交
git add -p                         # 交互式选择要暂存的代码块
git add filename.txt               # 添加指定文件

推送操作

# 基础推送
git push                           # 推送当前分支到默认远程分支
git push origin main               # 推送到指定远程分支

# 强制推送(谨慎使用!)
git push -f origin main            # 覆盖远程提交历史

# 删除远程分支
git push origin --delete <branch>  # 删除指定的远程分支

# 推送所有分支
git push --all origin              # 推送本地所有分支到远程

# 关联并推送
git push -u origin main            # 首次推送并设置上游分支

标签操作

# 创建标签
git tag v1.0.0-beta #轻量标签(仅指向某个提交,不存储额外信息)
git tag -a v1.0.0 -m "Release version 1.0.0" #附注标签(包含作者、日期、描述等元数据)
git tag -a v0.9.0 abc1234 -m "Historical release" #为历史提交打标签(指定提交的哈希值)

# 查看标签
git tag #列出所有标签
git show v1.0.0 #查看标签详细信息
git tag -l "v1.*" #按模式搜索标签(例如 v1.x 系列)


# 推送标签到远程仓库
git push origin v1.0.0 #单个推送
git push origin --tags #全部推送

# 删除标签-本地
git tag -d v1.0.0 #删除单个标签(本地)
git tag -l | foreach-object { git tag -d $_ } #删除全部标签(本地)

# 删除标签-远程
git push origin :refs/tags/v1.0.0 #删除单个标签(远程)
git push origin --delete v1.0.0 #删除单个标签(远程)
git push origin --delete $(git tag -l) #删除全部标签(远程)

# 检出标签
git checkout v1.0.0 #切换到标签对应的代码状态(进入“分离头指针”模式)
git checkout -b release-v1.0.0 v1.0.0 #基于标签创建新分支(方便修改或修复)

# 重命名标签 (若需重命名标签,需先删除旧标签,再创建新标签:)
git tag -d old-tag
git tag -a new-tag -m "New tag message"
git push origin :refs/tags/old-tag  #删除远程旧标签
git push origin --tags              #推送新标签

# 拉取远程标签
git fetch --tags #拉取所有标签

分支操作

# 查看分支
git branch                      # 查看本地分支
git branch -a                   # 查看所有分支(含远程)
git branch -v                   # 查看分支最新提交信息

# 创建/切换分支
git branch dev                  # 创建新分支
git checkout dev                # 切换到分支
git checkout -b feature/login   # 创建并立即切换分支

# 删除分支
git branch -d dev               # 删除已合并的分支(安全删除)
git branch -D dev               # 强制删除未合并的分支
git push origin --delete dev    # 删除远程分支

# 分支管理
git branch -m old-name new-name # 重命名分支
git push origin -u dev          # 推送分支并建立追踪关系
git checkout --track origin/dev # 跟踪远程分支并创建本地分支

# 清理已合并分支
git branch --merged | grep -v "main" | xargs git branch -d  # 删除已合并到main的分支(Bash)

合并操作

# 基础合并
git checkout main               # 切换到目标分支
git merge dev                   # 合并dev分支到当前分支

# 合并控制
git merge --no-ff dev           # 强制生成合并提交(禁用快进)
git merge --abort               # 终止合并并恢复原状

# 冲突处理
git status                      # 查看冲突文件
git diff                        # 查看冲突内容
git mergetool                   # 使用合并工具解决冲突
git commit -m "Merge dev"       # 解决冲突后完成合并

变基操作

# 基础变基
git checkout feature            # 切换到要变基的分支
git rebase main                 # 将当前分支变基到main分支

# 交互式变基
git rebase -i HEAD~3            # 修改最近3个提交(可重排/合并/编辑)

# 冲突处理
git rebase --continue           # 解决冲突后继续变基
git rebase --skip               # 跳过当前提交(谨慎使用)
git rebase --abort              # 终止变基并恢复原状

# 远程分支变基
git pull --rebase origin main   # 拉取远程更新并使用变基(替代合并)

# 修改历史提交
git rebase -i HEAD~5            # 编辑过去5个提交(可修改提交信息/内容)

回滚操作

# 撤销本地未提交的修改
git restore <file>              # 撤销工作区指定文件的修改(未暂存)
git restore .                   # 撤销工作区所有未暂存修改
git restore --staged <file>     # 撤销暂存区的修改(已add未commit)

# 回退提交
git reset HEAD~1                # 回退到前一次提交(保留工作区修改,默认--mixed)
git reset --soft HEAD~1         # 回退提交但保留修改到暂存区
git reset --hard HEAD~1         # 彻底丢弃最近一次提交和所有修改(慎用!)

# 回退到指定提交
git reset abc1234               # 软回退到指定提交(保留修改)
git reset --hard abc1234        # 硬回退到指定提交(丢弃所有后续修改)

# 撤销已推送的提交
git revert abc1234              # 创建新提交来撤销指定提交(推荐用于远程回滚)
git revert HEAD~3..HEAD         # 批量撤销最近3个提交
git push origin main            # 推送撤销提交到远程

# 强制覆盖远程仓库(慎用!)
git reset --hard HEAD~2         # 本地回退
git push -f origin main         # 强制覆盖远程分支(会丢失远程历史)

# 恢复误删的分支/提交
git reflog                      # 查看所有操作记录(含已删除的提交)
git checkout -b recovery-branch abc1234 # 根据reflog哈希值恢复

重置操作

# 🔥 危险操作!会永久删除所有提交历史 🔥

# 本地仓库重置(两种方式任选其一)
# --------------------------------
# 方法1:删除.git目录重建(完全清空)
rm -rf .git                     # 删除本地仓库记录(Unix系统)
git init                        # 重新初始化仓库
git add .                       # 添加文件
git commit -m "初始提交"         # 创建全新首次提交

# 方法2:使用孤儿分支(保留.git配置)
git checkout --orphan new-root  # 创建无父提交的分支
git add .                       # 添加文件
git commit -m "全新初始提交"     # 创建新根提交
git branch -D main              # 删除旧分支(原分支名)
git branch -m main              # 重命名孤儿分支为main

# 强制覆盖远程仓库
# --------------------------------
# 前提:确保你有远程仓库的强制推送权限
git remote add origin <远程仓库URL>  # 如果已关联可跳过
git push -f origin main         # 强制覆盖远程分支(删除所有历史)

# 如果远程仓库需要完全重置(可选)
# --------------------------------
# 方法1:删除远程仓库重建(GitHub/GitLab等平台操作)
# 方法2:通过API删除远程仓库所有内容(需平台权限)

# 清理本地缓存(可选)
git gc --aggressive --prune=now  # 彻底清理本地残留对象

其他操作

配置相关

git config --global user.name "Your Name"     # 设置全局用户名
git config --global user.email "email@example.com" # 设置全局邮箱
git config --global alias.co checkout        # 创建命令别名
git config --list                    # 查看所有配置
git config --global core.autocrlf input       # 统一换行符设置(跨平台)

补丁操作

git format-patch HEAD~2           # 生成最近2个提交的补丁文件
git apply patch.diff              # 应用补丁(不保留提交信息)
git am *.patch                    # 应用补丁并保留提交信息

忽略文件配置(.gitignore)

# .gitignore 文件示例
*.log          # 忽略所有.log文件
/node_modules/  # 忽略目录
!important.log  # 排除特定文件
temp?.txt       # 匹配temp1.txt等

贮藏操作(Stash)

# 临时保存未提交的修改
git stash                         # 贮藏所有已跟踪文件的修改
git stash -u                      # 贮藏包含未跟踪文件
git stash -m "保存信息"           # 添加说明信息的贮藏

# 查看/恢复贮藏内容
git stash list                    # 列出所有贮藏记录
git stash apply stash@{1}         # 恢复指定贮藏(不删除记录)
git stash pop                     # 恢复最新贮藏并删除记录
git stash drop stash@{0}          # 删除指定贮藏记录

# 清除贮藏
git stash clear                   # 删除所有贮藏记录

差异比较(Diff)

git diff                          # 工作区与暂存区的差异
git diff --staged                 # 暂存区与最新提交的差异
git diff HEAD                     # 工作区与最新提交的差异
git diff commit1 commit2          # 两个提交之间的差异
git diff --word-diff              # 单词级差异对比(适合文本)
git diff --stat                   # 显示简略统计信息

子模块管理(Submodule)

git submodule add <url> <path>    # 添加子模块
git submodule init                # 初始化子模块(首次克隆后)
git submodule update             # 更新子模块到指定提交
git submodule foreach 'git pull' # 对所有子模块执行命令
git clone --recurse-submodules <url> # 克隆包含子模块的仓库

拉取与获取(Fetch/Pull)

git fetch origin                  # 获取远程更新(不自动合并)
git fetch --prune                 # 同步删除已不存在的远程分支
git pull origin main              # 拉取并合并(等效 fetch + merge)
git pull --rebase origin main     # 拉取并使用变基整合

二分查找(Bisect)

git bisect start                  # 开始二分查找
git bisect bad                    # 标记当前提交为有问题
git bisect good abc1234           # 标记已知正常的提交
git bisect reset                  # 结束二分查找

追踪文件修改(Blame)

git blame README.md               # 查看文件每行修改记录
git blame -L 10,20 index.html     # 查看指定行范围修改历史
git blame -C -C -C file.txt       # 检测代码移动来源

钩子(Hooks)

# 示例:添加本地提交前检查(pre-commit)
chmod +x .git/hooks/pre-commit   # 创建可执行文件
# 文件内容示例:
#!/bin/sh
npm run lint                     # 提交前自动执行代码检查

详细教程

Git 是一个分布式版本控制系统,用于跟踪文件的更改,协调多人之间的工作。以下是 Git 的基本用法和一些常见命令的详细说明和示例。

基本用法

用法: git [-v | --version] [-h | --help] [-C <路径>] [-c <名称>=<值>]
           [--exec-path[=<路径>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<路径>] [--work-tree=<路径>] [--namespace=<名称>]
           [--config-env=<名称>=<环境变量>] <命令> [<参数>]

常见的 Git 命令

创建工作区/仓库

  • clone:克隆一个仓库到一个新目录

    git clone https://github.com/user/repo.git
  • init:创建一个空的 Git 仓库或重新初始化一个现有的仓库

    git init

处理当前变更

  • add:添加文件内容到索引

    git add filename
  • mv:移动或重命名一个文件、目录或符号链接

    git mv old_filename new_filename
  • restore:恢复工作树文件

    git restore filename
  • rm:从工作树和索引中移除文件

    git rm filename

检查历史和状态

  • bisect:使用二分搜索找到引入 bug 的提交

    git bisect start
  • diff:显示提交之间、提交与工作树之间等的差异

    git diff
  • grep:打印匹配模式的行

    git grep "search_pattern"
  • log:显示提交日志

    git log
  • show:显示各种类型的对象

    git show commit_hash
  • status:显示工作树状态

    git status

增长、标记和调整你的公共历史记录

  • branch:列出、创建或删除分支

    git branch
    git branch new_branch
    git branch -d old_branch
  • commit:记录对仓库的更改

    #提交
    git commit -m "提交备注"
    
    #添加并提交
    git commit -am "提交备注"
  • merge:合并两个或多个开发历史

    git merge branch_name
  • rebase:在另一个基点上重新应用提交

    git rebase branch_name
  • reset:重置当前 HEAD 到指定状态

    git reset --hard commit_hash
  • switch:切换分支

    git switch branch_name
  • tag:创建、列出、删除或验证使用 GPG 签名的标签对象

    git tag
    git tag -a v1.0 -m "version 1.0"
    git tag -d v1.0

协作

  • fetch:从另一个仓库下载对象和引用

    git fetch
  • pull:从另一个仓库或本地分支获取并整合

    git pull origin branch_name
  • push:更新远程引用及其关联对象

    git push origin branch_name

远程仓库使用/remote

连接远程仓库

git remote add 设置库名 远程仓库地址

修改远程仓库的名字

git remote rename 旧库名 新库名

将本地代码推送到远程仓库

git push 库名 分支名
#按提示输入仓库用户名
#输入密码

#giehub => 创建一个登陆令牌 用于密码验证

#SSH鉴权,待补充..略


#快捷推送
	#1,
	git push -u 库名 分支名

	#2,后续推送
	git push

分支

初始化创建仓库的时候会默认创建master分支,每次修改都是在master分支上修改

操作分支

#查看当前分支
git log
#或者
git status

#查看全部分支
git branch --list

#创建分支
git branch 新分支名称

#切换分支
git checkout 要切换到的分支名称

#新建一个分支并切换到分支上去
git checkout -b 新分支名

合并分支

#合并分支 当前分支 => 合并的另一个分支
git merge 合并的另一个分支

#查看分支合并状态
git log --all --graph

拉取远程分支

#拉取远程全部分支
git fetch 

#切换到拉取下来的分支并跟踪分支
	#-常规
	git checkout -b 本地分支名 远程库名/远程分支名
	#-
	git checkout --track 远程库名/远程分支名
	#-简写
	git checkout 分支名

贮藏

当前分支修改未完毕/未保存 不需要提交 但是需要切换分支时git stash =git stash push

#当前分支未修改完 未保存修改 且需要切换分支时
git stash

#查看贮藏列表
git stash list
	#列表示例 => stash@{}值越小为最近一次贮藏
	# stash@{O}: WIP on master: 362fb4e merge feature2
	# stash@{1}: WIP on master: 362fb4e merge feature2
	# stash@{2}: WIP on master: 362fb4e merge feature2

#恢复贮藏
git stars apply stash@{存储的标记ID}

#慎用=>恢复/找回最近一次贮藏修改的内容
	#1 恢复文件为未修改状态 恢复后已修改的内容就还原丢失了
	git checkout -- 文件

	#2恢复最后一次贮藏修改的数据
	git stash pop


#删除指定贮藏
git stash drop stash@{指定ID}

查看配置

查看全局配置

全局配置适用于所有仓库。使用以下命令查看全局配置:

git config --global --list

查看本地配置

本地配置仅适用于当前仓库。使用以下命令查看本地配置:

git config --list

或者:

git config --local --list

查看特定配置项

如果你只想查看某个特定的配置项,比如用户名或邮箱,可以使用以下命令:

查看全局用户名:

git config --global user.name

查看全局用户邮箱:

git config --global user.email

查看本地用户名:

git config user.name

查看本地用户邮箱:

git config user.email

示例输出

例如,运行 git config --global --list 可能会输出以下内容:

user.name=Your Name
user.email=you@example.com
color.ui=auto
core.editor=vim

这些命令将帮助你查看并验证你的 Git 用户配置信息。


评论