Git 使用全指南

article/2025/7/20 22:46:00

在这里插入图片描述

Git 使用全指南

第一部分:核心概念

  1. 什么是 Git?

    • 一个分布式版本控制系统 (DVCS)
    • 目标: 跟踪文件变化、协作开发、回溯历史、管理不同开发线(分支)。
    • 核心思想: 每个开发者都有完整的仓库副本(包括完整历史),不依赖中央服务器也能工作。
  2. 关键概念:

    • 仓库 (Repository / Repo): 项目的根目录,包含所有文件及其历史记录。.git 隐藏文件夹就是本地仓库的核心。
    • 工作区 (Working Directory / Working Tree): 你在电脑上看到的项目目录,是你实际编辑文件的地方。
    • 暂存区 (Staging Area / Index): 一个中间区域。你把准备提交的更改 git add 到这里。它像是一个“准备就绪”的清单。
    • 提交 (Commit): 一个永久的快照,记录了暂存区在某个时间点的状态。每个提交有唯一的 ID (SHA-1 哈希值)、作者、时间戳和提交信息。
    • 分支 (Branch): 指向某个提交的轻量级指针。默认分支通常是 mastermain。创建分支是为了隔离开发(如新功能、Bug 修复)。
    • HEAD: 一个特殊的指针,指向你当前所在的分支(或具体的提交,在 detached HEAD 状态时)。它代表你当前的工作位置。
    • 远程 (Remote): 托管在服务器(如 GitHub, GitLab, Gitee)上的仓库副本,用于团队协作和备份。常见默认远程名称为 origin
    • 克隆 (Clone): 从远程仓库创建一个完整的本地仓库副本,包括所有历史记录和分支。
    • 拉取 (Pull): git pull = git fetch (获取远程最新数据) + git merge (尝试将远程分支合并到当前本地分支)。
    • 推送 (Push): 将本地分支的提交上传到远程仓库。
    • 合并 (Merge): 将一个分支的更改整合到另一个分支。通常会创建一个新的“合并提交”。
    • 变基 (Rebase): 将当前分支的提交“重新播放”在另一个分支(通常是更新的基础分支)的最新提交之上。可以使历史线更清晰(线性),但需谨慎使用在共享分支上。
    • 冲突 (Conflict): 当 Git 无法自动合并不同分支对同一文件的同一部分所做的更改时发生。需要手动解决。

第二部分:安装与配置

  1. 安装:

    • Windows: 下载官方安装程序: https://git-scm.com/download/win
    • macOS:
      • 安装 Xcode Command Line Tools (在终端运行 xcode-select --install)
      • 或使用 Homebrew: brew install git
    • Linux (Debian/Ubuntu): sudo apt update && sudo apt install git
    • Linux (Fedora): sudo dnf install git
  2. 首次配置 (重要!):

    # 设置你的用户名 (提交者标识)
    git config --global user.name "你的名字"
    # 设置你的邮箱 (提交者标识)
    git config --global user.email "你的邮箱@example.com"
    # 设置默认文本编辑器 (用于写提交信息,如 vim, nano, code)
    git config --global core.editor "code --wait" # 使用 VS Code
    # 启用有帮助的颜色输出
    git config --global color.ui auto
    # 设置默认分支名称为 main (可选,推荐)
    git config --global init.defaultBranch main
    
    • --global 选项表示这些设置应用于你系统上的所有仓库。如果想为特定仓库设置不同信息,在仓库目录下运行去掉 --global 的命令。

第三部分:基础操作 - 本地工作流

  1. 创建新仓库:

    mkdir my-project     # 创建项目目录
    cd my-project        # 进入目录
    git init             # 初始化 Git 仓库 (创建 .git 文件夹)
    
  2. 克隆现有仓库:

    git clone https://github.com/username/repository.git [可选:新目录名]
    # 例如: git clone https://github.com/octocat/Spoon-Knife.git
    
  3. 检查状态:

    git status          # 查看工作区和暂存区的状态 (哪些文件修改了/新增了/准备提交了)
    
  4. 跟踪新文件 / 暂存更改:

    git add <file1> <file2> ...  # 添加特定文件到暂存区
    git add .                    # 添加当前目录下所有更改 (包括新文件、修改的文件) 到暂存区 (谨慎使用,确保不要添加不需要的文件)
    git add -A                   # 添加工作区中所有更改 (包括新文件、修改的文件、删除的文件) 到暂存区
    git add -p                   # 交互式暂存,允许你选择性地暂存文件中的部分更改 (非常有用!)
    
  5. 提交更改:

    git commit                   # 打开配置的编辑器编写提交信息
    git commit -m "提交信息"     # 直接在命令行写提交信息
    
    • 提交信息规范: 清晰、简洁。第一行写简短摘要(<50字符),空一行,然后写详细说明(为什么改,改了啥)。参考 Conventional Commits 或 Angular 规范。
  6. 查看历史:

    git log                      # 查看完整提交历史
    git log --oneline            # 查看简洁的历史 (每个提交一行)
    git log --graph              # 以 ASCII 图显示分支和合并历史
    git log --author="名字"      # 查看特定作者的提交
    git log -p <file>            # 查看某个文件的详细修改历史
    git show <commit-id>         # 查看某个特定提交的详细信息
    
  7. 忽略文件 (.gitignore):

    • 创建名为 .gitignore 的文件在仓库根目录。
    • 列出你不想 Git 跟踪的文件或目录模式 (每行一个)。
    • 示例:
      # 忽略所有 .log 文件
      *.log
      # 忽略特定文件
      secret.key
      # 忽略 build/ 目录下的所有内容
      build/
      # 但不要忽略 build/important.lib (例外)
      !build/important.lib
      
    • 使用模板: https://github.com/github/gitignore

第四部分:分支管理

  1. 创建分支:

    git branch <branch-name>      # 创建新分支 (基于当前 HEAD)
    git checkout -b <branch-name> # 创建并立即切换到新分支 (常用)
    
  2. 切换分支:

    git checkout <branch-name>     # 切换到现有分支
    git switch <branch-name>       # (Git 2.23+) 更明确的切换分支命令 (推荐)
    
  3. 列出分支:

    git branch                     # 列出本地分支 (* 号标出当前分支)
    git branch -a                  # 列出所有分支 (包括远程分支 remote/<branch-name>)
    git branch -v                  # 列出分支并显示每个分支的最后一次提交
    
  4. 删除分支:

    git branch -d <branch-name>    # 删除已合并的分支 (安全)
    git branch -D <branch-name>    # 强制删除未合并的分支 (谨慎!)
    
  5. 合并分支:

    • 切换到你想合并的目标分支 (通常是 main/masterdevelop):
      git switch main
      
    • 执行合并:
      git merge <branch-to-merge>  # 例如: git merge feature/login
      
    • 如果发生冲突:
      1. git status 会显示冲突文件。
      2. 手动编辑这些文件,解决冲突(删除 <<<<<<<, =======, >>>>>>> 标记,保留你想要的代码)。
      3. 使用 git add <resolved-file> 将解决后的文件标记为已解决。
      4. 所有冲突解决后,执行 git commit 完成合并提交。
  6. 变基 (Rebase):

    • 目的: 使当前分支的历史看起来像是基于目标分支的最新提交开发的(更线性)。
    • 操作 (在当前分支上执行):
      git rebase <target-branch>  # 例如 (在 feature 分支上): git rebase main
      
    • 如果发生冲突:
      1. 解决冲突(同合并)。
      2. git add <resolved-file>
      3. 不要 git commit 使用 git rebase --continue
      4. 如果想放弃变基:git rebase --abort
    • 黄金法则: 不要对你仓库之外有副本的分支(即已推送到远程并被他人使用的分支)执行变基!变基会重写历史。
  7. 比较差异 (Diff):

    git diff                       # 工作区 vs 暂存区 (未暂存的更改)
    git diff --staged (或 --cached) # 暂存区 vs 最新提交 (已暂存的更改)
    git diff <commit1> <commit2>   # 比较两个提交
    git diff <branch1>..<branch2>  # 比较两个分支的尖端
    

第五部分:远程协作

  1. 查看远程仓库:

    git remote -v                   # 查看远程仓库的 URL (fetch/push)
    
  2. 添加远程仓库:

    git remote add <remote-name> <url> # 例如: git remote add origin https://github.com/you/repo.git
    
  3. 从远程获取更新:

    git fetch <remote-name>          # 例如: git fetch origin (下载远程所有分支和提交,但不修改你的工作区)
    git fetch --prune                # 同时删除本地已不存在的远程分支的跟踪引用
    
  4. 拉取远程更改:

    git pull <remote-name> <branch-name> # 例如: git pull origin main
    # 相当于 git fetch origin + git merge origin/main (到当前分支)
    git pull --rebase                # 使用 rebase 代替 merge 进行拉取 (更干净的本地历史)
    
  5. 推送本地更改到远程:

    git push <remote-name> <branch-name> # 例如: git push origin feature/login
    git push -u origin <branch-name>   # 首次推送时设置上游跟踪 (-u / --set-upstream), 之后可以直接 `git push`
    git push                           # 如果上游已设置,推送当前分支
    git push --force (或 -f)          # 强制推送 (重写远程历史!极其危险,仅在你完全清楚后果时使用)
    
  6. 跟踪远程分支:

    • 克隆或 git fetch 后,你会看到 origin/main 这样的远程分支引用。
    • 要基于远程分支创建本地跟踪分支:
      git switch --track origin/<branch-name>  # (Git 2.23+)
      # 或旧方式
      git checkout -b <local-branch-name> origin/<remote-branch-name>
      git branch -u origin/<remote-branch-name> # 设置现有本地分支的上游
      

第六部分:撤销与回退

  1. 撤销工作区的修改 (未 git add):

    git restore <file>             # (Git 2.23+) 丢弃工作区中指定文件的修改 (回到最近一次 `git add` 或 `git commit` 的状态)
    # 旧方式 (仍有效): git checkout -- <file>
    
  2. 撤销暂存区的修改 (已 git add, 未 git commit):

    git restore --staged <file>    # (Git 2.23+) 将文件从暂存区移回工作区 (取消暂存)
    # 旧方式: git reset HEAD <file>
    
  3. 修改最后一次提交:

    git commit --amend             # 修改提交信息或加入漏掉的文件 (先 `git add` 漏掉的文件)
    # 注意:这会创建新的提交ID,如果已推送,需谨慎并可能需要强制推送 (不推荐在已推送后修改)
    
  4. 回退到某个提交 (创建新提交撤销更改):

    git revert <commit-id>         # 创建一个新的提交,撤销指定提交引入的更改。安全,适用于已推送的提交。
    
  5. 重置到某个提交 (危险!会丢弃历史):

    git reset --soft <commit-id>   # 移动 HEAD 和分支指针到目标提交,保留工作区和暂存区的更改 (像是撤销了 commit)
    git reset --mixed <commit-id>  # (默认) 移动 HEAD 和分支指针,重置暂存区到目标提交状态,保留工作区更改 (像是撤销了 commit 和 add)
    git reset --hard <commit-id>   # 移动 HEAD 和分支指针,重置暂存区和工作区到目标提交状态。**丢弃所有之后的更改!** 极其危险,慎用!
    
    • 警告: git reset --hard 会永久删除未提交的工作区更改和未推送的提交。仅用于本地未推送的提交回退。
  6. 找回丢失的提交/分支:

    • 使用 git reflog 查看 HEAD 和分支的引用变更历史。找到丢失的提交 ID。
    • 基于找到的提交 ID 创建新分支:git branch recovered-branch <commit-id>

第七部分:高级技巧与最佳实践

  1. 储藏 (Stash): 临时保存工作区和暂存区的更改,以便清理现场去处理其他事情(如切换分支修复紧急 Bug)。

    git stash                     # 储藏当前更改
    git stash push -m "message"   # 储藏并添加信息
    git stash list                # 列出储藏栈
    git stash apply [stash@{n}]   # 应用最近的储藏 (或指定储藏),不删除储藏
    git stash pop [stash@{n}]     # 应用并删除最近的储藏 (或指定储藏)
    git stash drop [stash@{n}]    # 删除指定的储藏
    git stash clear               # 清空整个储藏栈
    
  2. 标签 (Tag): 为重要的提交(如版本发布 v1.0.0)打上永久标记。

    git tag -a v1.0.0 -m "Release version 1.0.0" <commit-id> # 创建带注释的标签 (推荐)
    git tag v1.0.0-lightweight                                 # 创建轻量标签 (无额外信息)
    git tag                                                    # 列出标签
    git show v1.0.0                                            # 显示标签信息
    git push origin v1.0.0                                     # 推送特定标签到远程
    git push origin --tags                                     # 推送所有标签到远程
    
  3. 子模块 (Submodule): 在一个 Git 仓库中包含另一个 Git 仓库。

    • 添加:git submodule add <repository-url> <path>
    • 克隆包含子模块的仓库:git clone --recurse-submodules <repository-url>
    • 更新子模块:git submodule update --init --recursive
  4. .gitconfig 别名: 创建常用命令的快捷方式。

    git config --global alias.co checkout
    git config --global alias.br branch
    git config --global alias.ci commit
    git config --global alias.st status
    git config --global alias.unstage 'restore --staged --' # (Git 2.23+) 取消暂存
    git config --global alias.last 'log -1 HEAD'           # 查看最后一次提交
    

    之后可以用 git co, git br, git ci, git st, git unstage <file>, git last

  5. 工作流 (Workflow):

    • 集中式工作流 (Centralized): 类似 SVN,所有人在 main 分支上直接提交/拉取/推送。简单但容易冲突。
    • 功能分支工作流 (Feature Branch): 最常用。每个新功能/修复在独立分支开发,完成后通过 Pull Request (PR) / Merge Request (MR) 请求合并到 main/develop
    • Gitflow: 更结构化的分支模型,定义了 main (生产), develop (集成分支), feature/*, release/*, hotfix/* 等分支角色。适合有严格发布流程的项目。
    • Forking 工作流: 常用于开源项目。开发者 Fork 主仓库到自己的账户,在 Fork 的仓库中开发,然后向主仓库发起 PR。主仓库维护者审核并合并。
  6. Pull Request / Merge Request (PR/MR):

    • 不是 Git 核心命令,是 GitHub/GitLab 等平台提供的协作功能。
    • 开发者推送功能分支到自己的远程仓库(或 Fork)。
    • 在平台上发起 PR/MR,请求将源分支(你的功能分支)合并到目标分支(通常是上游的 main/develop)。
    • 进行代码审查、讨论、自动化测试。
    • 审查通过后由维护者合并。

第八部分:图形化工具 (GUI)

  • 命令行 (git) 是最强大和通用的方式。
  • GUI 工具可以提供更直观的界面查看历史、分支图、解决冲突等。常用工具包括:
    • GitHub Desktop
    • GitKraken
    • Sourcetree
    • VS Code 内置的 Git 功能 (非常强大)
    • GitExtensions
    • TortoiseGit (Windows 资源管理器集成)

第九部分:常见问题与陷阱

  • 冲突: 不可避免,冷静处理。仔细阅读冲突标记,与队友沟通。
  • git push 失败 (非快进): 别人在你之前推送了更改。先 git pull (解决可能冲突),再 git push。避免使用 --force 除非你完全理解后果。
  • 误删未提交的更改: 如果没 git add, 通常很难恢复。养成频繁提交的习惯。
  • 误删分支/提交: 尝试 git reflog 找回提交 ID,然后重建分支。
  • 大文件: Git 不适合管理大文件(二进制、媒体文件)。使用 Git LFS (Large File Storage) 或 .gitignore 忽略它们。
  • .gitignore 不生效: 确保文件在忽略规则生效前没有被跟踪过。如果已被跟踪,需要先 git rm --cached <file> 将其从 Git 中删除(保留本地文件),然后提交 .gitignore

总结

掌握 Git 需要时间和实践。从基础命令 (clone, add, commit, push, pull, status, log, branch, checkout/switch) 开始,逐步学习分支操作 (merge, rebase)、撤销操作 (restore, reset, revert)、远程协作和解决冲突。理解核心概念(工作区、暂存区、仓库、提交、分支、HEAD)是熟练运用的关键。选择合适的协作工作流(推荐功能分支+PR/MR)。善用 .gitignore 和 GUI 工具提高效率。遇到问题时,git statusgit help <command> 是你的好朋友。

不断练习,你就能成为 Git 高手!


http://www.hkcw.cn/article/TRUQWRAJUo.shtml

相关文章

Leetcode 269. 火星词典

1.题目基本信息 1.1.题目描述 现有一种使用英语字母的外星文语言&#xff0c;这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words &#xff0c;作为这门语言的词典&#xff0c;words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此…

若依框架-Feign的应用

代码资料链接&#xff1a;https://download.csdn.net/download/ly1h1/90945836 1.背景 若依的微服务框架&#xff0c;少不了各微服务之间的接口调用&#xff0c;以下是采用feign来进行微服务之间的方法调用。 2.案例说明 在system模块下的某个接口&#xff0c;调用factory&am…

印度奥迪沙邦一巴士翻车 50余人被困 紧急救援展开

6月2日,一辆巴士在印度东部奥迪沙邦的山路上发生翻车事故,车内50多名乘客被困。事故发生在当天清晨,巴士在下坡过程中于弯道上失去平衡,导致车辆失控。事故发生后,当地村民和紧急救援人员迅速展开救援行动,当地政府也派出救援队赶往现场。目前,官方尚未公布具体的伤亡情…

从4小时到20分钟 青岛港科技升级货物“秒通关”

作为中国北方重要的国际航运枢纽,青岛港的航线通达全球700多个港口,一季度集装箱吞吐量同比增速达到了7.4%。在当下复杂多变的国际贸易形势下,这座港口如何找准方向为外贸企业“保驾护航”?港口“流量”剧增折射外贸新机遇在山东港口青岛港前湾港区,这艘前往美国东部的集装…

Flannel MAC地址冲突导致Pod 跨节点通信异常

问题背景 客户在扩容 Kubernetes 节点后&#xff0c;发现部分服务 Pod 跨节点通信异常&#xff0c;表现为&#xff1a; • Pod 间通信间歇性失败&#xff1b; • 某些业务服务异常或响应慢&#xff1b; • 怀疑是网络问题引起的。 问题排查 1️⃣ 初步排查网络路由信息 我们…

[前端计算机网络]资源加载过程的详细性能信息浏览器加载资源的全过程

资源加载过程的详细性能信息 基于 PerformanceResourceTiming 对象对页面中某个资源加载过程的详细性能信息进行采集与封装&#xff0c;并结合了计算机网络中的请求生命周期进行度量。 export function observeEvent():void{const type"resource";const entryHand…

德布劳内将接受那不勒斯体检 加盟在即

据报道,德布劳内将加盟那不勒斯。预计他将在比利时国家队比赛结束后接受那不勒斯的体检。上月公布的比利时世预赛名单中包括了德布劳内。比利时队将在世预赛中先后对阵北马其顿和威尔士,其中与威尔士的比赛将于本月10日北京时间2点45分开球。现年33岁的德布劳内在今夏合同到期…

《在人间》是2025最难看懂的剧吗 烧脑剧情挑战观众

《在人间》这部剧集让艺绽君感到难以评价。这种“难评”并非贬义,而是因为观剧过程中真实地感受到了大脑爆炸、脑细胞死了不少,只能用一个相对中立的词汇来形容这部“神剧”。《在人间》共8集,隶属于爱奇艺的微尘剧场,这一剧场以短小精悍的作品著称。主创团队中有知名导演兼…

警方辟谣北京有人高空撒一千万:不是故意的,系工人施工碰倒钱箱 干活不慎掉落

5月29日,北京昌平区住总万科天地一带发生了一起撒钱事件。有市民发帖称,有人在楼上撒了一千万元。视频画面显示,空中飘着几张纸币,一些市民在楼下接钱。次日,北京七里渠派出所工作人员表示,当事人是因为工作时不小心掉落了钱,并提醒市民不要听信网络谣言。至于掉落的金钱…

96岁老兵走失找回 曾为陈毅元帅送信 抗战英雄平安归家

6月2日,山东省济宁市一救援队成功找回了走失的96岁高龄抗战老兵吕企荣老人,老人身体无碍。吕企荣家住泗水县济河街道何家庄村。5月31日早晨7时许,老人从家中步行到村北侧的小公园遛弯,直到中午都没有回家。家属通过监控发现,老人沿着城区北侧万象城附近道路一直向北走,直…

地磁暴雷暴大风与暴雨交织登场 双预警齐发

6月2日6时,中央气象台发布暴雨蓝色预警和强对流天气蓝色预警,覆盖福建、广东、广西等十余省份。中国气象局国家空间天气监测预警中心指出,6月1日至3日可能连续发生地磁暴,6月2日左右,我国北部有机会出现较为明显的极光,部分地区甚至有出现红绿复合极光的可能。预计6月2日…

6月1日起 新疆伊尔克什坦口岸试行24小时货运通关

6月1日,新疆伊尔克什坦口岸货运通道正式启动为期6个月的24小时通关试行。随着首批出入境货车有序通关,该口岸成为中国首个面向吉尔吉斯斯坦实行24小时货运通关的公路口岸。伊尔克什坦口岸位于新疆克孜勒苏柯尔克孜自治州乌恰县,是我国最西端的陆路口岸。口岸主要出口日用百货…

美防长炒作中国威胁论难获东盟支持 东盟强调战略自主

在新加坡举行的第22届香格里拉对话会上,美国国防部长赫格塞思极力渲染所谓的“中国威胁”,以迫使盟国增加军费开支。然而,东盟国家的国防部长们强调了“战略自主”的概念。菲律宾国防部长吉尔伯特特奥多罗表示,菲律宾作为美国的条约盟友,并非没有战略自主的棋子。他虽然仍…

Python 训练营打卡 Day 32-官方文档的阅读

我们已经掌握了相当多的机器学习和python基础知识&#xff0c;现在面对一个全新的官方库&#xff0c;看看是否可以借助官方文档的写法了解其如何使用 我们以pdpbox这个机器学习解释性库来介绍如何使用官方文档 以鸢尾花三分类项目来演示如何查看官方文档 import pandas as pd…

USB子系统和type-c接口快速理解

USB子系统 USB硬件基础 在了解LINUX 的USB驱动之前&#xff0c;我们肯定是要了解相关硬件内容的&#xff0c;如下给出了三种常用的USB接口。 特性 Type A (2.0) Type A 3.0 Type C 接口形状 长方形&#xff0c;单向插入 与 Type A 2.0 相同 椭圆形&#xff0c;可双…

DQN和DDQN(进阶版)

来源&#xff1a; *《第五章 深度强化学习 Q网络》.ppt --周炜星、谢文杰 一、前言 Q表格、Q网络与策略函数 Q表格是有限的离散的&#xff0c;而神经网络可以是无限的。 对于动作有限的智能体来说&#xff0c;使用Q网络获得当下状态的对于每个动作的 状态-动作值 。那么 a…

新视讯影视官网入口,影视动漫在线播放网站

新视讯影视是一个免费为广大追剧迷提供在线播放服务的影视平台&#xff0c;深受众多影视爱好者的喜爱。它涵盖了大量免费的VIP电视剧资源、最新上映的大片、好看的综艺节目以及动漫视频&#xff0c;是一个播放速度快、资源多的免费影视网站。用户无需注册或登录&#xff0c;即可…

张家界溶洞垃圾已清运2.7吨 排污事件引发关注

近日,有网友反映张家界市慈利县一处天然溶洞遭到人为排污,导致溶洞被污染。相关话题引发了广泛关注。据慈利县融媒体中心6月1日发布的最新视频,经过7天的努力,杨家坡溶洞内的垃圾已清理打捞出2.7吨。相关视频显示,溶洞内垃圾正在被装袋并通过吊机吊出,旁边已经摆放着大量…

杭州机场迎首批入境旅客 免签新政促便利

6月1日下午,杭州口岸迎来了首批享受免签新政的南美洲旅客。为便利中外人员往来,中方决定扩大免签国家范围,自2025年6月1日起至2026年5月31日,巴西、阿根廷、智利、秘鲁、乌拉圭五个国家持普通护照的人员来华经商、旅游观光、探亲访友、交流访问或过境不超过30天,可免办签证…

余承东为何“炮轰”友商 华为销量不及小米

华为终端BG董事长余承东在2025未来汽车先行者大会上提到,有一家公司仅凭一款车型就取得了巨大成功。尽管该公司的产品质量和智能驾驶能力并不出色,但凭借强大的品牌影响力和流量支持,依然实现了热销。余承东表示,华为的产品在质量、体验和性能方面都优于这家公司,但在销量…