Git

Git介绍

Git 是由 Linus Torvalds(Linux之父)开发的第二个伟大作品。2005年,由于BitKeeper软件公司对Linux社区停止了免费使用权,Linus迫不得已自己开发了一个分布式版本控制工具。据说Linus花了两周时间用C语言写了一个分布式版本控制系统,这就是Git。一个月之内,Linux系统的源码已经由Git管理了。

什么是Git

Git 是一个版本控制工具,可以记录和追踪某个文件在某一个时刻的内容和状态。

Git的使用有点像一个”网盘”,但这个网盘比网盘更高级——Git可以追踪”网盘”中文件的历史版本状态

🔑 核心理解:Git 可以记录某个文件夹下的不同文件在不同时间节点的不同状态,并追踪这些文件产生的变化。

Git的特点

特点说明
分布式每个开发者本地都有完整的仓库副本
离线可用大部分操作可以在本地完成,无需联网
可回退可以随时回滚到任意历史版本

Git vs SVN 对比

对比项SVN(集中式)Git(分布式)
架构中央服务器 + 客户端每个节点都是完整仓库
网络依赖提交、更新都需要联网本地操作无需联网
数据安全中央服务器挂掉有风险每个节点都有完整备份
分支操作分支是目录的拷贝,较重轻量级分支,快速切换
集中式vs分布式

Git核心流程

Git工作区域

Git管理文件有三个核心区域

工作区

编写、修改、删除文件发生在这里。Working Directory

暂存区

把这次准备提交的改动先收拢起来。Staging Area / Index

本地仓库

生成可追溯的版本历史,留在本机仓库中。Local Repository

远程仓库

把本地版本同步给团队成员和代码平台。Remote Repository

区域详解

区域英文说明
工作区Working Directory你电脑上实际看到的文件目录
暂存区Staging Area / Index临时存放修改的地方,.git/index
本地仓库Local RepositoryGit存储版本数据的地方,.git/目录
远程仓库Remote Repository如GitHub、Gitee等服务器上的仓库
Git核心流程

文件状态流转

未追踪(Untracked) ──────► 已暂存(Staged) ──────► 已提交(Committed)
▲ │
│ │
└──── 修改后重新add ◄──┘

Git基础命令

注册远程仓库平台

以Gitee(码云)为例,国内访问速度快:

  1. 访问 https://gitee.com 注册账号
  2. 注册时请记住:
  • 用户名(推荐使用英文)
  • 密码
  • 手机号
  • 邮箱(可以注册后自行设置)

⚠️ 重要:密码一定要牢记,后续push代码时需要验证。

创建远程仓库

登录Gitee后,点击右上角”+”号创建仓库:

创建仓库
创建仓库

创建时建议:

  • 仓库名称使用英文
  • 选择公开或私有(初学者建议公开)
  • 勾选”初始化仓库”和”添加README.md”
  • 勾选”添加.gitignore”(Java项目选Java模板)

git clone – 克隆仓库

将远程仓库下载到本地(首次使用必须操作):

# 方式1:下载远程仓库,本地创建同名文件夹
git clone https://gitee.com/common-zhou/test_50th.git

# 方式2:指定本地文件夹名称
git clone https://gitee.com/common-zhou/test_53th.git test_53th_local

# 方式3:克隆到当前目录的指定文件夹(文件夹必须为空或不存在)
git clone https://gitee.com/ciggar/test-40th.git dirName

💡 提示:克隆后会自动创建.git文件夹(Git元信息目录),不要手动修改或删除

⚠️ 文件类型注意事项

Git管理文件版本,推荐使用文本文件

  • ✅ .txt.md.java.xml 等
  • ❌ 避免使用 .docx.pptx.xlsx 等二进制格式

Git对比文件变化是一行一行比较的,.docx等是压缩包格式,无法有效对比差异。

git status – 查看状态

查看工作区和暂存区的变化:

git status

输出说明:

  • 🔴 红色:工作区有变化(未添加到暂存区)
  • 🟢 绿色:暂存区有变化(已add未commit)
status示例
status示例

简化输出(推荐日常使用):

git status -s
# 或
git status --short

git add – 添加到暂存区

将工作区的变化提交到暂存区:

# 方式1:添加指定文件
git add filename.txt
git add src/Main.java

# 方式2:通配符添加
git add *.java          # 所有.java文件
git add src/*           # src目录下所有文件
git add src/**/*.java   # src及其子目录下所有.java文件

# 方式3:添加所有变化(最常用)
git add .

# 方式4:交互式添加(选择性添加)
git add -i

实战建议:日常开发中,git add . 最常用,但要注意.gitignore的配置。

git commit – 提交到本地仓库

将暂存区的内容提交到本地仓库,生成一个版本:

# 基础提交
git commit -m "提交信息"

# 添加并提交(跳过git add)
git commit -am "提交信息"

# 修改最后一次提交(未push前)
git commit --amend -m "新的提交信息"

首次提交配置

第一次commit前,必须设置用户名和邮箱

# 方式1:命令行设置(推荐)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

# 方式2:直接编辑配置文件
# Windows: C:\Users\用户名\.gitconfig
# Linux/Mac: ~/.gitconfig

配置文件内容示例:

[user]
    name = stone
    email = shitou@cskaoyan.com

提交信息规范

良好的提交信息应该一目了然:

# 推荐格式
git commit -m "功能描述 (issue编号)"

# 示例
git commit -m "修复用户登录bug (#123)"
git commit -m "添加HashMap练习代码"
git commit -m "优化数据库查询性能"

# ❌ 不好的示例
git commit -m "1"
git commit -m "abc"
git commit -m "修改"

提交信息模板

<type>(<scope>): <subject>

<body>

<footer>

常用type:

  • feat:新功能
  • fix:修复bug
  • docs:文档修改
  • style:格式修改(不影响代码逻辑)
  • refactor:重构
  • test:测试相关

git push – 推送到远程

将本地仓库的所有变化推送到远程仓库:

# 推送到默认远程分支
git push

# 推送到指定远程仓库的指定分支
git push origin main
git push origin master

# 首次推送并建立追踪关系
git push -u origin main
push示例
push示例

push重要说明

  1. 第一次push需要验证身份:输入用户名和密码(或Token)
身份验证
身份验证
  1. push不能指定单个文件,只能推送整个分支
  2. push的前提:本地仓库版本必须领先于远程仓库(或已合并远程更新)

git pull – 拉取更新

将远程仓库的最新变化拉取到本地:

git pull
pull示例
pull示例

pull的本质

git pull = git fetch + git merge

# 等价于
git fetch origin        # 下载远程更新
git merge origin/main   # 合并到当前分支

黄金法则:”落后就要pull”——当本地版本落后于远程时,必须先pull才能push。

git log – 查看历史

查看仓库的版本历史:

# 基础查看
git log

# 简化输出(推荐)
git log --oneline

# 图形化显示分支
git log --oneline --graph --all

# 查看最近n条
git log -5

# 查看指定文件的历史
git log -- filename.txt
log示例

协作开发与冲突处理

邀请成员加入仓库

无论是开源仓库还是私有仓库,只有仓库成员才能修改代码

  • 开源仓库:所有人可见,但只有成员可修改
  • 私有仓库:只有指定成员可见和修改

添加成员步骤

邀请成员
邀请成员

注意:Gitee私有仓库免费版只能添加5个管理员(含主账号)。如需添加更多成员,可将仓库设为公开。

冲突的产生

当多个开发者同时修改同一文件的同一部分时,就会产生冲突。

冲突产生场景

冲突产生场景开发者 A先提交的一方

修改 file.txt 后率先推送成功。开发者 B后提交的一方

也修改了同一文件的同一区域。

两人同时修改 file.txt

A 先 push,远程仓库内容发生变化

B 再 push 会被拒绝,需要先 pull 并处理冲突

💡 冲突处理黄金法则

  1. 先push的人不处理冲突,后push的人处理冲突
  2. 尽量避免多人同时修改同一文件
  3. push之前先pull,防止push失败
  4. 工作习惯
  • ☀️ 早上上班第一件事:pull最新代码
  • 🌙 晚上下班最后一件事:push本地代码(确保能编译通过

冲突处理实战

模拟冲突场景

冲突流程
冲突流程

冲突文件示例

当发生冲突时,Git会在文件中标记冲突内容:

<<<<<<<< HEAD
    // 你的本地代码
    System.out.println("我的版本");
================
    // 远程仓库的代码  
    System.out.println("同事的版本");
>>>>>>>> a3f8b2c

标记说明

  • <<<<<<< HEAD 到 =======:你的本地代码
  • ======= 到 >>>>>>> a3f8b2c:远程的代码(commit hash)

冲突处理步骤

# 1. 执行pull,Git会自动合并,发生冲突时标记冲突文件
git pull

# 2. 手动编辑冲突文件,决定保留哪些代码
#    - 保留你的代码?删除远程部分
#    - 保留同事的代码?删除你的部分
#    - 两者都要?合并修改

# 3. 删除冲突标记(<<<<<<< ======= >>>>>>>)

# 4. 保存文件后,添加到暂存区
git add .

# 5. 提交解决冲突的代码
git commit -m "解决与同事的代码冲突"

# 6. 尽快push,防止别人又push了新代码
git push

版本回退

Git提供了多种”后悔药”,可以在不同场景下回退操作。

后悔药流程
后悔药流程

git checkout – 撤销工作区修改

作用:用暂存区或仓库中的文件覆盖工作区的文件

# 撤销单个文件的修改
git checkout filename.txt

# 撤销所有文件的修改(危险操作!)
git checkout .

危险警告:此操作会丢失工作区的所有修改,无法恢复,请谨慎使用!

适用场景

  • 写了一半发现思路错了,想回到修改前的状态
  • 误删了文件,想从仓库恢复

git reset – 撤销暂存区

作用:将暂存区的变化回退到工作区(不会改变文件内容

# 取消暂存区中指定文件
git reset HEAD filename.txt

# 取消所有暂存(保留工作区修改)
git reset HEAD .

# 或简写
git reset .

适用场景

  • git add 错了文件,想重新选择
  • 想拆分一个大的commit为多个小的

git reset –hard – 彻底回退版本

作用:将当前分支重置到指定版本,会清除工作区和暂存区的所有更改

# 回退到指定commit(通过hash)
git reset --hard a3f8b2c

# 回退到上一个版本
git reset --hard HEAD^

# 回退到上n个版本
git reset --hard HEAD~3

极度危险:此操作会丢失所有未提交的更改,请确保真的不需要这些更改!

reset示例
reset示例

找回丢失的commit

# 查看所有操作记录
git reflog

# 恢复到之前的版本
git reset --hard <commit_hash>

忽略文件 .gitignore

什么是.gitignore

Git可以配置忽略某些文件或目录,不追踪它们的变化。这在项目中非常重要,比如:

  • IDE配置文件(.idea/
  • 编译生成的文件(target/*.class
  • 依赖库(node_modules/
  • 敏感信息(配置文件含密码)

创建.gitignore

在Git仓库根目录创建.gitignore文件:

# 创建文件(Windows需要在命令行创建,因为文件名以点开头)
touch .gitignore

Java项目常用.gitignore模板

# 编译输出
*.class
target/
build/
out/

# IDE配置
.idea/
*.iml
*.ipr
*.iws
.vscode/
*.project
*.classpath
.settings/

# 包文件
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar

# 日志
*.log
logs/

# 临时文件
*.tmp
*.temp
*.swp
*~

# 操作系统文件
.DS_Store
Thumbs.db

# Maven
.mvn/

# Gradle
.gradle/

常用匹配规则

# 忽略单个文件
filename.txt

# 忽略目录
foldername/

# 忽略所有.class文件
*.class

# 不忽略某个特定的.class(取反)
!important.class

# 忽略target目录下的所有内容
target/*

# 忽略所有名为temp的目录
**/temp/

重要注意事项

尽早创建.gitignore最好在创建远程仓库时就配置好

    创建时添加
    创建时添加

    已追踪文件无效如果一个文件已经被追踪并提交到远程仓库,再在.gitignore中忽略是无效的

      “`bash

      git rm –cached filename git commit -m “停止追踪某文件” “`

      Git分支管理

      什么是分支

      Git分支是版本控制中的重要概念,用于在同一仓库中独立开发多个功能。

      分支的好处

      • 多人并行开发,互不干扰
      • 新功能开发不影响主分支
      • 可随时回退到之前的状态
      • 支持版本发布和bug修复并行

      分支类型

      • 主分支(master/main):稳定版本,用于发布
      • 开发分支(dev):日常开发,合并新功能
      • *功能分支(feature/)**:开发特定功能
      • *修复分支(hotfix/)**:紧急修复线上bug

      基础分支命令

      # 查看本地分支
      git branch
      
      # 查看所有分支(含远程)
      git branch -a
      
      # 查看分支关系(追踪关系)
      git branch -vv
      
      # 创建新分支
      git branch 分支名
      
      # 创建并切换到新分支(常用)
      git checkout -b 新分支名
      # Git 2.23+ 推荐:
      git switch -c 新分支名
      
      # 切换分支
      git checkout 分支名
      # Git 2.23+ 推荐:
      git switch 分支名
      
      # 合并分支
      git merge 被合并的分支名
      
      # 删除分支
      git branch -d 分支名        # 已合并的分支
      git branch -D 分支名        # 强制删除

      分支工作流实战

      典型企业分支模型

      典型企业分支模型主线main

      生产环境分支,只保留稳定可发布的版本。协作主干dev

      日常集成功能的主开发分支。

      feature/loginfeature/paymentfeature/search紧急修复hotfix/bug-001

      线上故障优先修复,完成后再回合并主干。

      实战步骤

      # 场景:从dev分支拉取新功能分支,开发完成后合并回dev
      
      # 1. 切换到dev分支
      git checkout dev
      
      # 2. 拉取最新代码
      git pull
      
      # 3. 创建并切换到功能分支
      git checkout -b feature/user-login
      
      # 4. 开发代码,提交到本地
      git add .
      git commit -m "feat: 添加用户登录功能"
      
      # 5. 开发完成,切换到dev分支
      git checkout dev
      
      # 6. 合并功能分支到dev
      git merge feature/user-login
      
      # 7. 推送dev到远程
      git push origin dev
      
      # 8. 删除已合并的功能分支
      git branch -d feature/user-login

      本地分支与远程分支

      # 查看所有分支(本地+远程)
      git branch -a
      
      # 推送本地分支到远程(首次)
      git push origin 本地分支名
      
      # 推送并建立追踪关系(推荐)
      git push -u origin 本地分支名
      
      # 查看分支追踪关系
      git branch -vv
      
      # 为已有本地分支建立与远程分支的追踪关系
      git branch --set-upstream-to=origin/远程分支名 本地分支名
      
      # 示例:本地dev分支追踪远程dev分支
      git branch --set-upstream-to=origin/dev dev
      
      # 检出远程分支到本地(创建本地分支并建立追踪)
      git checkout -b dev origin/dev
      
      # Git 2.23+ 推荐写法
      git switch -c dev --track origin/dev

      在IDEA中使用Git

      配置Git路径

      打开IDEA设置:File → Settings → Version Control → Git

      配置Git
      配置Git

      设置Git可执行文件路径:

      • Windows: C:\Program Files\Git\bin\git.exe
      • Mac: /usr/bin/git

      点击”Test”按钮,显示版本号即配置成功。

      项目颜色标识

      如果项目被Git追踪,IDEA会用颜色标识文件状态:

      颜色含义
      🔴 红色新增文件,未追踪(Untracked)
      🔵 蓝色文件有修改(Modified)
      🟢 绿色已添加到暂存区(Staged)
      ⚪ 白色/黑色无变化,已提交
      文件颜色
      文件颜色

      常用Git操作

      右键菜单操作

      在文件或项目上右键 → Git

      • Add:添加到暂存区(相当于git add
      • Commit:提交到本地仓库(相当于git commit
      • Push:推送到远程(相当于git push
      • Pull:拉取远程更新(相当于git pull

      快捷键

      操作Windows快捷键
      CommitCtrl + K
      PushCtrl + Shift + K
      PullCtrl + T
      查看VCS操作Alt + ~

      查看文件变动

      在代码编辑器左侧,可以看到文件的变动标记:

      • 绿色条:新增的行
      • 蓝色条:修改的行
      • 红色三角:删除的行

      点击标记可以查看与上一版本的对比。

      分支管理

      底部状态栏点击分支名称,可以快速:

      • 切换分支
      • 创建新分支
      • 合并分支
      • 查看分支图

      常见问题与解决方案(FAQ)

      Q1: 提交时提示”Please tell me who you are”

      问题

      *** Please tell me who you are.
      Run:
        git config --global user.email "you@example.com"
        git config --global user.name "Your Name"

      解决

      git config --global user.name "你的名字"
      git config --global user.email "你的邮箱"

      Q2: push时提示”failed to push some refs”

      问题

      ! [rejected]        main -> main (fetch first)
      error: failed to push some refs to 'https://gitee.com/xxx/xxx.git'

      原因:远程仓库有更新,本地落后于远程。

      解决

      # 先拉取远程更新
      git pull
      
      # 处理可能的冲突后,再push
      git push

      Q3: 忘记添加.gitignore,已经提交了不该提交的文件

      解决

      # 1. 添加.gitignore文件(包含要忽略的文件)
      
      # 2. 从仓库中移除文件,但保留本地文件
      git rm --cached filename
      
      # 3. 如果是目录
      git rm -r --cached foldername
      
      # 4. 提交更改
      git add .
      git commit -m "添加.gitignore,停止追踪某些文件"

      Q4: 误删了文件(未commit),如何恢复

      解决

      # 恢复工作区文件(从暂存区或仓库恢复)
      git checkout -- 文件名
      
      # 恢复所有文件
      git checkout .

      Q5: 误删了文件(已commit),如何恢复

      解决

      # 查看文件历史
      git log -- 文件名
      
      # 恢复到指定版本
      git checkout <commit_hash> -- 文件名
      
      # 或
      git restore --source=<commit_hash> -- 文件名

      Q6: commit信息写错了,如何修改

      解决

      # 修改最后一次commit信息(未push时)
      git commit --amend -m "新的提交信息"
      
      # 修改最后一次commit,添加漏掉的文件
      git add 漏掉的文件
      git commit --amend --no-edit

      Q7: 如何查看某个文件是谁修改的

      解决

      # 查看文件的修改历史
      git blame 文件名
      
      # 查看详细修改内容
      git log -p -- 文件名

      Q8: Windows和Mac换行符不一致导致的问题

      问题:Windows使用CRLF(\r\n),Mac/Linux使用LF(\n),混用会导致diff显示整行变更。

      解决

      # Windows用户配置(提交时自动转换)
      git config --global core.autocrlf true
      
      # Mac/Linux用户配置
      git config --global core.autocrlf input
      
      # 关闭自动转换(不推荐)
      git config --global core.autocrlf false

      Q9: 大文件误提交到仓库

      问题:Git不适合管理大文件,会导致仓库臃肿。

      解决

      # 从历史中彻底删除大文件(慎用,会重写历史)
      git filter-branch --force --index-filter \
        'git rm --cached --ignore-unmatch 大文件名' \
        --prune-empty --tag-name-filter cat -- --all

      或使用BFG Repo-Cleaner工具:

      bfg --delete-files 大文件名

      Q10: GitHub/Gitee连接超时或失败

      解决

      # 设置代理(如果有)
      git config --global http.proxy http://127.0.0.1:7890
      git config --global https.proxy https://127.0.0.1:7890
      
      # 取消代理
      git config --global --unset http.proxy
      git config --global --unset https.proxy
      
      # 使用SSH协议替代HTTPS(更稳定)
      # 将 https://github.com/xxx/xxx.git
      # 改为 git@github.com:xxx/xxx.git

      附录:Git命令速查表

      基础命令

      命令作用
      git init初始化仓库
      git clone <url>克隆远程仓库
      git status查看状态
      git add <file>添加到暂存区
      git commit -m "msg"提交到本地仓库
      git push推送到远程
      git pull拉取远程更新
      git log查看历史

      分支命令

      命令作用
      git branch查看分支
      git branch <name>创建分支
      git checkout <name>切换分支
      git checkout -b <name>创建并切换
      git merge <name>合并分支
      git branch -d <name>删除分支

      撤销命令

      命令作用危险程度
      git checkout -- <file>撤销工作区修改⚠️ 高
      git reset HEAD <file>撤销暂存区✅ 低
      git reset --hard <hash>回退版本⚠️⚠️ 极高
      git reflog查看操作历史✅ 安全

      暂无评论

      发送评论 编辑评论

      
      				
      |´・ω・)ノ
      ヾ(≧∇≦*)ゝ
      (☆ω☆)
      (╯‵□′)╯︵┴─┴
       ̄﹃ ̄
      (/ω\)
      ∠( ᐛ 」∠)_
      (๑•̀ㅁ•́ฅ)
      →_→
      ୧(๑•̀⌄•́๑)૭
      ٩(ˊᗜˋ*)و
      (ノ°ο°)ノ
      (´இ皿இ`)
      ⌇●﹏●⌇
      (ฅ´ω`ฅ)
      (╯°A°)╯︵○○○
      φ( ̄∇ ̄o)
      ヾ(´・ ・`。)ノ"
      ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
      (ó﹏ò。)
      Σ(っ °Д °;)っ
      ( ,,´・ω・)ノ"(´っω・`。)
      ╮(╯▽╰)╭
      o(*////▽////*)q
      >﹏<
      ( ๑´•ω•) "(ㆆᴗㆆ)
      😂
      😀
      😅
      😊
      🙂
      🙃
      😌
      😍
      😘
      😜
      😝
      😏
      😒
      🙄
      😳
      😡
      😔
      😫
      😱
      😭
      💩
      👻
      🙌
      🖕
      👍
      👫
      👬
      👭
      🌚
      🌝
      🙈
      💊
      😶
      🙏
      🍦
      🍉
      😣
      Source: github.com/k4yt3x/flowerhd
      颜文字
      Emoji
      小恐龙
      花!
      上一篇
      下一篇