Git简介

1.什么是 Git?

Git 是目前世界上最先进、最流行的分布式版本控制系统(Distributed Version Control System)。

简单来说,它就像是开发者的“时光机”“存档点”。无论你的项目代码经历了多少次修改,Git 都能精准地记录每一次变动,并允许你随时回到过去的任何一个版本。

2.核心特点

  • 分布式架构: 与传统的集中式版本控制(如 SVN)不同,Git 在每个人的电脑上都保存了完整的仓库历史。即使没有网络,你也可以提交代码、查看历史;即便服务器宕机,任何一个人的本地库都能用来恢复数据。

  • 强大的分支机制: 这是 Git 的“杀手锏”。创建和切换分支极快,鼓励开发者为每个新功能开辟独立的分支。这就像在平行宇宙中工作,互不干扰,直到功能成熟后再合并。

  • 极致的速度与安全: Git 绝大部分操作是在本地完成的,速度极快。同时,它使用 SHA-1 哈希算法对内容进行校验,确保代码在传输或存储过程中不会被意外损坏或篡改。

3. Git 的三个状态与工作区域

理解 Git 的运行逻辑,必须掌握文件在系统内部流转的三个区域:

  1. 工作区 (Working Directory): 当前你在磁盘上看到的、正在编辑的项目文件。

  2. 暂存区 (Staging Area / Index): 一个文件,保存了下次将要提交到版本库的文件列表信息。它作为工作区与仓库之间的缓冲区。

  3. 本地仓库 (Local Repository / .git directory): 保存项目所有元数据和对象数据库的地方,存储了所有已提交的历史版本。

4. 主要功能优势

  • 高效的分支管理:Git 的分支本质上只是一个指向特定提交对象的指针。创建、切换和合并分支的操作几乎是瞬时完成的,这极大鼓励了基于功能分支的开发模式。

  • 本地执行:绝大多数 Git 操作只需访问本地文件和资源,无需联网。这种离线工作的能力显著提升了开发响应速度。

  • 协作模式:通过 Push(推送)和 Pull(拉取)机制,Git 支持极其复杂的协作流(如 Git Flow 或 GitHub Flow),允许数千名开发者共同维护同一个项目。

Git工作流程

一般工作流程如下:

  1. 从远程仓库中克隆 Git 资源作为本地仓库;

  2. 从本地仓库中checkout代码然后进行代码修改;

  3. 在提交本地仓库前先将代码提交到暂存区;

  4. 提交修改,提交到本地仓库;本地仓库中保存修改的各个历史版本;

  5. 在需要和团队成员共享代码时,可以将修改代码push到远程仓库。

Workspace: 工作区,就是你平时存放项目代码的地方

Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息

Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

Git的工作流程图如下:

img

Git的基本指令

Git常用的一些指令

1)git clone - 克隆仓库内容 2)git push - 推送到远程仓库 3)git add - 向本地仓库中添加文件 4)git commit - 提交工作区内容到版本库 5)git checkout - 切换分支 6)git pull - 从远程仓库拉取内容到工作台

1.本地仓库的指令

1)git init - 初始化仓库。该命令执行完后会在当前目录生成一个 .git 目录,所有 Git 需要的数据和资源都存放在这个目录中。

2)git add . - 添加文件到暂存区。如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交。

3)git commit - 将暂存区的内容提交到本地仓库。所有的更新都会被提交,包括文件、内容更改等。

2.远程仓库的指令

2.1远程仓库操作

1)显示所有远程仓库-git remote - v 2)添加远程版本库-git remote add [别名] [url 地址] 3)删除远程仓库-git remote rm name 4)修改仓库名-git remote rename old_name new_name

2.2从远程仓库获取项目
git clone [项目地址]
git pull  [项目地址]
git fetch [项目地址]
git merge [目标地址]/[分支]

git clone - 从远程库中克隆项目到本地,是一个包含整个项目的版本库文件夹。该命令通常用于新用户 clone 项目,熟练之后基本都是用 git pull直接拉取项目。

git pull - 从远程仓库下载代码并合并到本地仓库中。

git fetch - 从远程仓库获取最新的更新内容(即本地没有的数据)。

git merge - 将远程仓库上的所有更新内容(假设已经被推送到服务器了)合并到你的当前分支

2.3上传项目到远程仓库

从将本地的分支版本上传到远程并合并可以使用 git push,如下:

git push <远程主机名> <本地分支名>:<远程分支名>

如果本地分支名与远程分支名相同,可以省略冒号:

git push <远程主机名> <本地分支名>

注意: 1)如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:

git push --force origin master

2)删除主机的分支可以使用 --delete 参数,以下命令表示删除 origin 主机的 master 分支:

git push origin --delete master

3.其他重要指令

查看仓库状态

git status

删除版本库中的文件

git rm  xxx.txt

[删除后要进行git commit -m “XXX”才算真正的删除]  

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f。

git rm -f xxx

查看文件中修改了的内容

	git diff xxx.txt	比较当前工作空间与staging area,查看工作空间的变化

	git diff --cached	比较staging area与本地仓库,查看暂存区中变化
  
	git diff HEAD		比较当前工作空间与本地仓库
    
	git diff newbranch	比较当前工作空间与newbranch分支
      
	git diff tag1 tag2	比较tag1与tag2
        
	git diff tag1:file1 tag2:file2	比较tag1的file1与tag2的file2
          
	git diff tag1 tag2 file	比较tag1与tag2的file文件
            
	git diff --stat		统计有差异的文件个数
	

查看历史记录

git log
git log
	查看全部提交日志
git log -5
	查看最近5次的提交日志
git log –p
	查看所有提交日志及修改的内容
git log –p --author=“scott”
	查看所有scott提交日志及修改内容
git log --since=“2011-05-24”
	查看2011-05-24以后所有的提交日志
git log --graph
	查看提交日志,以图形方式显示
git log --since=“2 days ago”
	查看这两天的提交日志
git log --until=“2011-05-25”
	查看截止2011-05-25所有的提交日志
git log --name-only
	查看所有修改过的文件
git log --pretty=oneline
	查看提交日志,一行显示
git log --pretty=format:%h:%s
	查看提交日志,显示sha1及提交comments

还原文件

git revert和git reset的区别:
git revert 是撤销某次操作,此次操作之前的commit都会被保留
git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区
git reset --hard
   取消commit,取消add,取消源文件修改
git reset --soft
   取消commit
git reset --mixed
   取消commit,取消add,是默认模式

git reset --hard HEAD   (比较下)
	恢复到HEAD状态
git reset --hard HEAD^
	彻底撤销最近一次提交
git reset --hard HEAD~3
	彻底撤销最近3次提交
git reset  --soft HEAD~3
	撤销最近3次commit,恢复到index状态,并且工作空间文件内容不变
git reset HEAD filename
	删除暂存的文件

git revert
   撤销某次提交,此次操作之前的commit都会被保留,但撤销也会作为一次提交进行保存。
git commit --amend 
修改最后一次提交。
如果上次提交时遗漏了文件,可以在提交后将文件加入缓存然后用该命令提交即可。
如果缓存中内容没有任何修改,只更新修改的提交注释。

4.分支管理指令

1.创建分支

git branch (branchname)
git checkout -b (branchname)  //创建新分支并立即切换到该分支下

2.切换分支

git checkout (branchname)

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。

3.合并分支

git merge 

你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。

4.列出分支

git branch

没有参数时,git branch 会列出你在本地的分支

$ git branch
* master

master就是本地分支

5.删除分支

删除完合并的分支

$ git branch -d newtest
Deleted branch newtest (was c1501a2).

基于Gitlab的实践对Git的实现

1.获取SSH Key配置

在开始之前,我们需要让服务器识别到我的电脑,密钥的作用就是不用每次都输入账号密码。

1.1生成密钥:在终端输入生成:

ssh-keygen -t ed25519 -C "你的邮箱@example.com"

这个一直敲回车就行,不用设置密码。

1.2复制公钥:

cat ~/.ssh/id_ed25519.pub

复制屏幕上显示的以 ssh-ed25519 开头的整段长文本。

1.3绑定Gitlab:

登录 GitLab -> 右上角头像 -> Settings -> SSH Keys

把刚才复制的内容粘贴进去,点击 Add key

也可以直接搜索关键字,如下:

2.克隆项目

项目负责人已经创建好了仓库,你只需要把它下载到本地。

  1. 在项目主页点击蓝色按钮 Clone,复制 Clone with SSH 下的链接。

  2. 在本地文件夹打开终端,输入:

git clone git@gitlab.com:xxx/project-name.git

3.创建分支

新手准则:永远不要直接在 main 分支改代码! 为了互不干扰,每个人都应该在自己的“独立房间”里干活。

# 1. 切换到开发主分支(通常是 develop 或 main)
git checkout develop

# 2. 拉取远程最新代码,确保你是基于最新版开发的
git pull origin develop

# 3. 创建并切换到一个属于你的新分支
git checkout -b feature/login-fix

提示:分支名建议叫 feature/功能名fix/缺陷名

4.开发提交

现在你可以写代码了。写到一个阶段后,记得保存你的进度。

  1. 查看改了什么git status

  2. 暂存文件git add . (把所有修改过的文件打包)

  3. 确认提交

git commit -m "feat: 完成了登录页面的样式调整"

注意:提交信息一定要写清楚你做了什么,严禁写 "111" 或 "update",方便对每个人的草操作进行清晰的理解。

5.推送与合并请求

1.推送到远程

git push origin feature/login-fix

2.发起 MR (Merge Request)

  • 打开 GitLab 网页,你会看到一个黄色的提示框 "Create Merge Request",点击它。

  • Target Branch(目标分支)选择 develop 或项目约定的主分支。

  • Assignee(指派人)选择你的项目负责人或导师。

  • 点击 Submit merge request

6.审核,冲突与部署

代码评审 (Code Review):负责人可能会在你的代码下留言,让你修改。你直接在本地修改、再 addcommitpush,MR 会自动更新。

解决冲突:如果别人改了和你同一行代码,Git 会提示冲突。别怕,找组长带你手动选一下保留哪行代码即可。

自动部署:一旦负责人点击 Merge(合并),GitLab 会自动触发 CI/CD 流水线

  • 你可以在项目侧边栏的 Build -> Pipelines 看到进度。

  • 当小图标变绿 ✅ 时,恭喜你,你的代码已经成功部署到服务器上了!

常见的报错及解决方法

1. 权限被拒绝 (Permission Denied)

新手最常遇到的第一个门槛。

  • 报错信息(截图中会出现):

    git@gitlab.com: Permission denied (publickey). fatal: Could not read from remote repository.

  • 大白话翻译: “你是谁?我不认识你,我不能让你下载代码。”

  • 原因: 你的 SSH 密钥(SSH Key)没配置好,或者配置了但没生效。

  • 解决方法:

    1. 检查本地是否有密钥:ls ~/.ssh/id_ed25519.pub

    2. 如果没有,重新运行 ssh-keygen

    3. 核心一步: 确保你把 cat 出来的完整内容复制到了 GitLab 网页的 SSH Keys 设置里。

2. 拒绝推送 (Updates were rejected / Non-fast-forward)

当你急着下班提交代码时,最讨厌看到这个。

  • 报错信息(截图中会出现):

    error: failed to push some refs to 'gitlab.com:...' hint: Updates were rejected because the remote contains work that you do not have locally.

  • 大白话翻译: “云端仓库有你本地没有的新代码,你不能直接覆盖它!”

  • 原因: 你的同事在你提交之前,已经抢先一步把他的代码合并进去了。

  • 解决方法:

    1. 先拉后推: 运行 git pull origin <分支名>

    2. Git 会把云端的代码拉下来和你本地的合并。

    3. 合并完成后,再次运行 git push

3. 代码冲突 (Automatic merge failed; fix conflicts)

新手最害怕的报错,其实它是 Git 在保护你的代码。

  • 报错信息(截图中会出现):

    CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.

  • 大白话翻译: “你和同事改了同一个文件的同一行,我不知道该听谁的,你自己选吧!”

  • 解决方法:

    1. 打开报错的文件,你会看到类似 <<<<<<< HEAD>>>>>>> 的标记。

    2. 手动抉择: 删掉不想要的代码,保留想要的代码,并去掉那些怪异的符号。

    3. 完成提交: git add . -> git commit -m "fix: 解决冲突" -> git push

4. 提交到了错误的分支 (Detached HEAD / Wrong Branch)

写了半天发现自己在 main 分支上,心跳加速。

  • 表现: 运行 git status 发现自己在 main 分支,而规范要求在 feature/xxx 分支。

  • 自救方案(不丢代码):

    1. 先暂存: git add .git commit -m "临时保存"

    2. 创建新分支: git branch feature/my-real-work

    3. 切过去: git checkout feature/my-real-work

    4. 回滚主分支: 这样你的改动就带到了新分支,主分支也可以恢复原状。

最后,给三条建议:

  1. 早起第一件事: git pull。只要你 pull 得够快,冲突就追不上你。

  2. 提交前看一眼: git status。确认你在哪个分支,改了哪些文件。

  3. 寻求支援: 遇到复杂的冲突,不要自己乱删文件夹,叫上改同一块代码的同事,当面商量怎么合并。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐