当前位置: 首页 > news >正文

【Git】项目管理全解

写在前面

之前写的git攻略太过粗略,故决定更新一篇更加完整的

概念定义

  • Git
    一个分布式版本控制系统,主要功能包括但不限于:追踪文件变化,版本回退,团队协作,多分支开发
  • 工作区 (Workspace)
    你电脑上能看到的项目目录,是你正在进行修改的地方。
  • 暂存区 (Staging Area / Index)
    一个临时的存储区域,用于存放你希望在下一次提交中包含的修改。
  • 本地仓库 (Local Repository)
    存放在你本地电脑上的完整项目历史记录(.git 文件夹)。
  • 远程仓库 (Remote Repository)
    托管在网络服务器上的项目仓库(如 GitHub, GitLab),用于团队协作和数据备份。

数据流转路径
工作区 -> (add) -> 暂存区 -> (commit) -> 本地仓库 -> (push) -> 远程仓库
远程仓库 -> (pull / fetch) -> 本地仓库 -> (checkout / merge) -> 工作区

https://www.runoob.com/wp-content/uploads/2015/02/1352126739_7909.jpg
https://www.runoob.com/wp-content/uploads/2015/02/git-command.jpg
上图均来自菜鸟教程

Git常用指令解析

1. 初始配置 (全局只需一次)

第一次使用 Git 时,需要配身份信息,这些信息会记录在每一次提交中。

  • 指令:
    git config --global user.name "Your Name"
    git config --global user.email "youremail@example.com"
    
  • 使用场景: 新电脑上首次安装和使用 Git。
  • 使用方法: 打开终端或 Git Bash,依次输入以上两条指令,将 "Your Name""youremail@example.com" 替换成自己的名字和邮箱,随便写也可以,git并不关心真伪,除非团队有要求之类的。
2. 创建与克隆仓库
  • git init

    • 使用场景: 将一个现有的本地项目目录初始化为 Git 仓库,或者创建一个全新的空仓库。
    • 使用方法:
      # 进入你的项目目录
      cd my-project
      # 初始化
      git init
      
      执行后,目录下会多出一个隐藏的 .git 文件夹,所有版本控制信息都存放在这里。
  • git clone

    • 使用场景: 从远程仓库(如 GitHub)下载一个项目的完整副本到本地。这是参与一个现有项目的标准方式。
    • 使用方法:
      git clone <repository_url>
      
      例如,从 GitHub 克隆一个项目:
      git clone https://github.com/example/repo.git
      
3. 日常修改与提交 (最常用的操作)

这是开发过程中使用最频繁的指令组合。

  • git status

    • 使用场景: 查看当前工作区和暂存区的状态。可以知道哪些文件被修改了、哪些文件还未被跟踪等。
    • 使用方法:
      git status
      
  • git add

    • 使用场景: 将工作区的修改添加到暂存区,准备进行下一次提交。
    • 使用方法:
      # 添加单个文件
      git add <file_name>
      # 添加多个文件
      git add file1.txt file2.js
      # 添加当前目录下所有修改(最常用)
      git add .
      
  • git commit

    • 使用场景: 将暂存区的所有内容提交到本地仓库,形成一个新的版本记录(一个 commit)。
    • 使用方法:
      git commit -m "Your descriptive commit message"
      
      -m 参数允许你直接在命令行中添加提交信息。提交信息应该清晰、简洁地描述这次提交做了什么,例如 "feat: 添加用户登录功能""fix: 修复了首页的显示 bug"
  • git log

    • 使用场景: 查看项目的提交历史。
    • 使用方法:
      # 查看完整的提交历史
      git log
      # 查看简化的单行历史
      git log --oneline
      # 查看带分支图形的历史
      git log --graph --oneline --decorate --all
      
4. 分支管理 (团队协作与功能开发的核心)

分支是 Git 最核心的功能,它允许开发者从主线(通常是 mainmaster)分离出去,进行独立的开发工作,完成后再合并回来。

  • git branch

    • 使用场景: 查看、创建或删除分支。
    • 使用方法:
      # 查看所有本地分支(当前分支会用 * 标记)
      git branch
      # 创建一个新分支
      git branch <branch_name>
      # 删除一个已经合并的分支
      git branch -d <branch_name>
      # 强制删除一个未合并的分支(慎用)
      git branch -D <branch_name>
      
  • git checkout (在较新版本的 Git 中,推荐使用 git switchgit restore)

    • 使用场景: 切换到不同的分支,或者恢复工作区的文件。
    • 使用方法:
      # 切换到一个已存在的分支
      git checkout <branch_name>
      # 创建并立即切换到一个新分支(常用)
      git checkout -b <new_branch_name>
      
  • git switch (推荐使用)

    • 使用场景: 专门用于切换分支。
    • 使用方法:
      # 切换到一个已存在的分支
      git switch <branch_name>
      # 创建并切换到一个新分支
      git switch -c <new_branch_name>
      
  • git merge

    • 使用场景: 将一个分支的修改合并到当前所在的分支。
    • 使用方法:
      # 1. 首先,切换到你希望接收合并的分支(例如 main)
      git switch main
      # 2. 然后,执行 merge 命令,指定要合并过来的分支
      git merge <feature_branch_name>
      
      解决冲突:如果两个分支都修改了同一个文件的同一部分,git merge 会失败并提示冲突。你需要手动打开冲突文件,解决冲突内容,然后再次 git add .git commit 来完成合并。
5. 远程协作
  • git remote

    • 使用场景: 管理与本地仓库关联的远程仓库。
    • 使用方法:
      # 查看关联的远程仓库
      git remote -v
      # 添加一个新的远程仓库
      git remote add <remote_name> <repository_url>
      # 通常默认的远程仓库名为 origin
      git remote add origin https://github.com/user/repo.git
      
  • git push

    • 使用场景: 将本地仓库的提交推送到远程仓库,这样其他团队成员才看到你对代码的修改。
    • 使用方法:
      # 将当前分支的提交推送到名为 origin 的远程仓库
      git push origin <branch_name>
      # 如果本地分支与远程分支同名,可以简写
      git push
      # 首次推送一个新创建的本地分支时,需要设置上游(upstream)
      git push -u origin <branch_name>
      
  • git pull

    • 使用场景: 从远程仓库获取最新的修改,并自动与本地当前分支合并。这是保持本地代码与团队同步的常用方式。
    • 使用方法:
      git pull origin <branch_name>
      # 如果当前分支已经与远程分支关联,可以简写
      git pull
      
      git pull 实际上是 git fetch + git merge 两个命令的组合。
  • git fetch

    • 使用场景: 从远程仓库获取最新的信息(如新的分支、新的提交),但不会自动合并到你的本地分支。这让你可以在合并前先查看远程的修改。
    • 使用方法:
      git fetch origin
      
      执行后,你可以通过 git log origin/main 来查看远程主分支的最新提交。
6. 版本回退与撤销
  • git reset

    • 使用场景: 将当前分支的 HEAD 指针移动到指定的提交,同时可以选择性地修改暂存区和工作区。用于回退版本。
    • 使用方法:
      # 回退到上一个版本,但保留工作区的修改
      git reset --soft HEAD^
      # 回退到上一个版本,同时重置暂存区(工作区不变)
      git reset HEAD^
      # 彻底回退到上一个版本,工作区和暂存区的修改都将丢失(危险!)
      git reset --hard HEAD^
      # 也可以指定 commit_id
      git reset --hard <commit_id>
      
  • git revert

    • 使用场景: 创建一个新的提交,内容与指定的旧提交相反。这是一种更安全的回退方式,因为它不会修改项目历史,而是以一次新的提交来“撤销”之前的修改。非常适合在公共分支上使用。
    • 使用方法:
      git revert <commit_id>
      
  • git restore (推荐使用)

    • 使用场景: 专门用于恢复工作区的文件或撤销暂存区的修改。
    • 使用方法:
      # 撤销工作区中某个文件的修改(从暂存区恢复)
      git restore <file_name>
      # 将文件从暂存区中移除(unstage),但保留工作区的修改
      git restore --staged <file_name>
      

日常开发工作流

个人开发流程:

  1. git initgit clone 开始项目。
  2. 修改代码。
  3. git status 查看状态。
  4. git add . 将修改添加到暂存区。
  5. git commit -m "完成xx功能" 提交到本地仓库。
  6. 重复 2-5 步。
  7. git push 推送到远程仓库备份。

团队协作流程:

  1. git clone 克隆项目到本地。
  2. git pull 开始工作前,先拉取最新代码保持同步。
  3. git switch -c feature/new-login 创建并切换到一个新的功能分支。
  4. feature/new-login 分支上进行开发和提交(add -> commit)。
  5. git push -u origin feature/new-login 将功能分支推送到远程。
  6. 在 GitHub/GitLab 上发起一个 Pull Request (或 Merge Request),请求将你的功能分支合并到 main 分支。
  7. 代码被审查(Code Review)通过后,由项目负责人合并到 main 分支。
  8. 切换回主分支 git switch main,然后 git pull 获取包含你代码的最新版本。

但也不是说个人工作流一定不需要git pull,比如我有多个机器人,但是它们之间只有参数的区别,在机器人A上增加了新功能,然后我推一次到远程仓库,在其他机器人上拉下来;如果每次开发前都记得本地程序是否最新,那也行,但是通常会忘记,所以每次开发前还是拉一次比较好

关于独占文件的管理

比如我自己开发了一个调试用的插件或上位机,但是我不希望被其他同事看见,或者说我不希望被别人同步走;或者说有多个机器人共享同一套控制程序,但是它们各自的配置文件是不同的,我们不希望每次同步配置文件会被篡改;再或者说,工程内部存在一些调试临时生成的日志、保存、存档等,它们也没有必要被push到远程
这时候就需要.gitignore了,它可以把配置文件的管理责任从 Git 中分离出去,Git 只负责同步控制程序

# .gitignore# 忽略所有具体的配置文件
config.json# 其他需要忽略的文件,如日志、临时文件等
*.log
# / 表示该目录下的所有文件
tmp/

其中所有文件的路径均相对于项目的根目录,也就是.git文件夹所在的位置,.gitignore同样存放在同一目录

http://www.dtcms.com/a/418923.html

相关文章:

  • rdm响应式网站开发企业年报网上申报流程
  • 昆山开发区网站制作网站建设文档模板
  • PySide6调用OpenAI的Whisper模型进行语音ASR转写
  • 网站怎么被黑磁力蜘蛛
  • nginx反向代理和负载均衡
  • 外贸seo外贸推广外贸网站建设外贸网站建设网站域名信息查询
  • 新广告法 做网站的python和c++学哪个好
  • 数据科学与数据分析:真正的区别是什么?
  • default-route-advertise always 概念及题目
  • Python爬虫实战:获取东方财富网CPI信息与数据分析
  • Filebeat写ElasticSearch故障排查思路(上)
  • 网站开发进度安排文档青岛关键词优化排名
  • C# TCP 服务端与客户端代码分析与补充
  • 族蚂建站郴州网站建设费用价格
  • 对象分配在哪块内存?
  • AI Agent智能体如何突破“听懂却做不好”困局?多模态技术打通全链路
  • 图卷积网络 (GCN)
  • JMeter中常用的配置优化
  • 网站怎样做优化调整深圳vi设计深圳vi设计公司
  • 做教育培训网站需要资质么网站对联广告图片
  • 《Muduo网络库:实现Channel通道以及Poller抽象基类》
  • 安全系统架构
  • 中国画廊企业网站模板thinkphp做视频网站
  • C++ 位运算 高频面试考点 力扣 268. 丢失的数字 题解 每日一题
  • 【展厅多媒体】解析VR虚拟驾驶实现多场景自由切换
  • 网站建设吉金手指专业11青海省高等级公路建设管局网站
  • 厦门北京网站建设公司怎样给一个公司做网站
  • 58.Nginx的反向代理和负载均衡
  • 阿里云函数计算 AgentRun 全新发布,构筑智能体时代的基础设施
  • 做营销型网站价格wordpress 考试系统