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

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等服务器上的仓库

文件状态流转

未追踪(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)

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

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重要说明

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

git pull – 拉取更新

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

git 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

协作开发与冲突处理

邀请成员加入仓库

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

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

添加成员步骤

注意: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

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

找回丢失的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中忽略是无效的

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可执行文件路径:

  • 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
小恐龙
花!
上一篇
下一篇