Git学习笔记 – 概念篇

Git | 一篇文章搞定Git、GitHub的理解和使用(学习笔记) Git learning note 本笔记整理自廖雪峰老师的Git教程,加上了自己的实践结果和一些理解,旨在使科研工作者(基本上是独立开发的那种)看完就能理解和使用Git。廖老师的教程生动活泼,条理清晰,推荐阅读。还可以赞助哦。 目录 Git learning note Git 简介 Git 与 GitHub Git使用 安装 创建仓库 配置仓库 添加、提交: 忽略某种文件 撤销修改... 阅读详情

http://hedatou.com/archives/git_learning_journal_concept.html

什么是Git?

Git是由Linus Torvalds开发的一套版本管理系统。传统的CVS、SVN属于集中式版本管理系统,依赖于一个中心服务器,而Git是一个分布式版本管理系统,每个使用者都有一套完整的修订历史记录,每台机器都是一个独立的节点,不依赖于其他节点就可以进行离线提交、离线查看文件修改记录。而且Git提供了一套完善的分支/合并系统,速度快、不依赖网络,开发中使用起来非常方便。

为什么使用Git?

枯燥的理论不好理解,我就说一些工作中出现的实际使用场景,再和SVN对比一下。

1.完善的离线机制

最近在做的这个项目中,就发生了这样的状况,公司的SVN因为网络问题挂掉了,团队中无法共享代码,只能在QQ上把代码传来传去,我连想查看一下文件的修改历史记录都不能,因为这些信息都保存在服务器上。做完一个功能的修改,我想对比一下我这次都修改了哪些文件、哪些内容,也不可以,因为对比功能也依赖于服务器。

使用Git就可以避免这个问题,每个人都保存着这个项目自创建开始至今的完整记录,所以查看修改历史、对比修改内容,这都不是问题。而且Git也可以使用点对点的版本管理,当中心服务器不可用时,可以直接和同事的Git点对点通信,共享代码、合并分支。比如,你可以对同事说:“我已经把BUG #4037修改好了,在我本地的bug4037分支上,地址是:git://192.168.0.10/project.git”,然后局域网内的同事可以直接把我的bug4037分支pull到他的本地,做一些修改,再重新push到我这里。其实Git还是鼓励有一个中心服务器来作为整体协调的媒介,不过当中心服务器临时不可用时,依然不会影响开发进程。SVN就不行了,中心服务器一挂,几乎就是啥都干不了了。

2.本地修改、离线提交

使用SVN时,团队内肯定都有这样的约定,只有可运行的代码才能上传SVN,不然别人下载代码回来发现跑不起来就不好了。但是这样就造成了提交代码的粒度太大,比如说我要修改一个功能,横跨多个模块,而且耗时非常长,可能需要两天时间,为了降低风险,我需要每修改一个独立模块就保存、提交一次,但仅仅这一个模块的修改,不能独立的使整个项目跑起来。这个情景SVN就没有办法了,细粒度和可用上传是矛盾的。

SVN的层级只有两级:客户端工作区和服务端归档区。使用Git就可以解决这个问题,因为Git有三级:本地工作区、本地归档区和远程归档区(还有个暂存区先不谈,其实是四级)。本地可以多次提交,只提交到本地归档区,不影响中心服务器。而当所有任务全部完成,把本地归档区和远程归档区同步时,可以把本地的多次修订记录一起同步到服务器归档。这样既保证了提交单元的细粒度,又保证了服务器版本的一致性。

3.分支/合并

工作中经常发生这样的情况,正在埋头写一个模块功能,突然测试报了一个紧急BUG,必须放下手里的工作优先修改。如果是小问题,只涉及一两个文件还好,但如果你正在做的工作和BUG修改都涉及到十几、二十个文件,就该乱套了。更甚者如果两者在某些文件上交叉,则更是乱上加乱。

处理这个问题应该用分支来处理,每个独立的修改主题应该在不同的分支上来进行,新特性就在新特性分支上,BUG修改就在BUG修改分支上,彼此互不影响,都完成了再合并。其实SVN也有分支/合并,不过相对来说重量级点,一个分支就是一个新的目录,更适合一整个团队切入进来。而Git的分支就轻量多了,随手就开一个分支,做一些修改再合并回去,Git所有分支都在同一个文件夹内。Git实现的非常像一个文件系统,对同一个文件夹,根据版本号回滚或前进到某一时刻。另外Git还有一个非常可爱的命令:git stash,可以把手头的工作储藏到一个临时区,恢复到上一个版本,之后可以用git stash apply再还原回来。

4.冗余目录(.svn、.git)

这个就不是什么大问题了,不过对于完美主义者来说,SVN管理下的项目中,每个文件夹、子文件夹下都有个.svn文件夹,真的挺烦的……

Git也有元数据文件夹,但只在根目录下有一个,这要好很多了,部署代码时用不着递归下去挨个子文件夹删了。

5.开源项目中贡献代码

建立在SVN上的开源项目,可以是由发起人和若干提交者来共同维护代码,这些人都拥有读写权限,而匿名用户当然只有读权限没有写权限。如果匿名用户发现了代码中的BUG,或是有一些好点子,想贡献一些代码,那个流程是非常麻烦的,比如说email一下diff、patch什么的,还要看项目人员有没有采纳,没有一个系统内建的机制来方便陌生人贡献代码。

GitHub是一个基于Git的代码托管服务,它有一套完善的Fork+Pull Request机制。比如说我想为jQuery贡献代码,就可以在jQuery的主页上点击Fork按钮,这样我的仓库里就有了一份jQuery的分支,而我是它的主人,自然有完全的读写权限,我可以做一些BUG修改和新特性开发。然后我可以在我的主页点击Pull Request,向原作者发起一次请求。原作者看到这条请求后,就有了我的项目Git访问地址,他可以把我的修改Pull到他的项目中,合并到主分支中,这样就完成了一次代码贡献。

Git有什么缺点吗?

1.Windows

Git是举着开源大旗的Linus Torvalds开发的,只有Linux、Mac OS版本,Windows版本没有开发计划,现在没有以后估计也不会有……不过有个项目msysGit,是志愿者基于MinGW搭建的Windows系统下的Git,Windows环境下也可以用Git了

2.权限管理

同样因为Git是举着开源大旗的Linus Torvalds开发的,用Git管理的工程任何人只要知道URL就可以获取源代码,拒绝封闭是开源运动的原教旨嘛~公司开发带有版权的私有代码,在内网还无所谓,外网就不方便用Git来管理了……

3.团队中推广

大家都习惯了CVS、SVN这种集中式版本管理,要转变开发方式为基于分支/合并的模式,一级提交变为两级提交,推广起来应该不是很容易的。不过这是项目管理者需要操心的,对于程序员个体来说,这不是问题,而且Git中有个git-svn,相当于可以在本地使用Git,享受一切由Git带来的本地修订管理的好处,然后提交到团队中的SVN中心服务器,这个特性非常实用。

Git基础

1.初始化工程:git clone url ,相当于SVN的checkout,第一次参与项目都要用到。git init,把当前目录初始化为Git仓库,通常是管理员来进行这个操作。

2.获取最新修改:git pull ,相当于SVN的update。不过有一点区别,SVN只有远程和本地两个层级,update就直接合并代码了,而Git有四级:remote repo、local repo、cached area和working area,pull操作只是把remote repo中的最新修改抓取到local repo,但没有合并代码,只不过origin/master分支指针指向到了最新修订版本,而本地master分支指针指向的版本没有变,仍然和pull前一样。

3.纳入管理:git add file ,新建文件、初始化工程时都要用到这个,可以把文件从working area纳入到cached area中,working area就是我们平时所用的、没有任何版本管理的文件系统,cached area就是暂存区,表示已经纳入到Git的管理中了,但还没有提交,cached area会有一个SHA-1 id。git add还有多个含义,比较容易混淆,另外在解决冲突时用来标记resolved也是用它,这些暂且不提。working area可以分为两个概念:untracked和unstaged,分别是未纳入Git管理的和已纳入Git管理但未纳入到暂存区的文件,同样需要git add添加到cached area中。

4.提交:git commit ,会把cached area中的文件赋予一个commit id,放到local repo中去。local repo中都是已经提交的变更,各个分支以树形结构存储索引信息。每次commit必须有注释,否则不让提交~ :)   可以加-a选项,则可以省去git add把文件放入暂存区的步骤,直接提交到local repo中。

5.查询变化:git diff ,会标出修改了哪些行,还可以对比特定的版本号、文件、目录。

6.查看摘要:git status ,查看有哪些文件未纳入管理,未暂存的文件有哪些变更,已暂存的文件有哪些变更,当前正在哪个分支工作。

7.还原:git chechout file ,相当于SVN的revert,使用仓库版本替换此文件。

8.查看历史:git log ,列出提交历史的id、作者、日期、注释。有了commit id,就可以用git show id来查看相应提交的详细修改内容。commit id都是40字节的SHA-1,谁也不可能记住一长串的id,Git比较智能,你只要输入前几位(至少4位)即可,只要能确保唯一就行。git checkout id ,切换到指定版本。

9.分支:git branch name ,创建一个分支,git checkout name ,切换到指定分支。

10.合并:git merge branch ,把指定分支合并到当前分支。根据当前代码修订状态,合并可以分为两种:Fast Forward合并和Three Way合并,前者是单一父节点,故不会有冲突的问题,后者是双父节点合并,当两者修改同一行代码时会有冲突,Git会报告,没有冲突会自动合并,并自动产生一个新的提交用来表示当前状态。

分支/合并是Git的核心概念,后面会专门谈这个话题。

11.提交到中心服务器:git push ,如果本地Git工程是通过git clone url 命令下载回来的,则远程地址默认已经设置好,直接执行git push就把本地库推送到中心服务器,在这之前应该首先git pull把最新版本拉取到本地,并完成合并,否则push时会报冲突,拒绝推送。

分支/合并

先来说,什么是分支?分支就是一个指向某个commit id的指针。打个比方来说,Git就是一个时光机器,而commit id就好像某个时间点,分支就好像某几个关键时间点的时间隧道驿站。我们可以乘坐Git这部时光机器把整个项目目录还原到任意一个时间点,多个平行分支就好像是平行宇宙,在各自的时空发生不同的事情,彼此互不影响,而且两个平行宇宙(A和B)还可以合并,合并之后生成了一个新的时空(C),在C中回忆历史会发现A和B中曾经发生的故事在C中也都曾发生过。如果一个人在A宇宙和B宇宙做了一件互相矛盾的事情,那在合并时就会发生冲突,就必须由上帝介入来干涉一下,手动处理掉这个冲突。

《Git常用命令》详细讲解·第6篇(git reset --hard HEAD、git checkout HEAD和git revert <commit>) 截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新** 阅读详情

相关推荐

mac(apple silicon)arm64安装spm12详细教程

3.下载matlab runtime R2023b for macOS (macA64),注意必须下载这个,只下载matlab是不可以的。默认安装目录是/Applications/MATLAB/MATLAB_Runtime/R2023b。注意最后的命令,路径根据自己的matlab_runtime安装位置进行调整,然后就可以安装成功了。5. 解压spm12.zip,解压后将文件夹拖到应用程序下(Applications)2.下载spm12,这个版本可兼容mac芯片!6.打开mac终端,输入。

weixin_62332001的博客 2019

git学习笔记

git init 初始化一个git管理目录 git add [file] 添加file到暂存区 git commit [opt] 将暂存区文件提交到本地仓库, git commit -m “msg” 添加提交说明 git commit -a -m “msg” 提交所有跟踪的文件,包括暂存和为暂存的文件 git commit --amend 撤销最后一次提交 git clone [url] 将服务器...

非鱼 277

AxMath行间公式转化为office公式求和符号以及编号显示问题

AxMath行间公式转化为office公式求和符号以及编号显示问题问题描述解决方法 问题描述 首先打出axmath公式,如下: 转换后的OfficeMath公式: 字体先不说,word公式字体默认cambria math且无法编辑。比较难受的一点是求和符号与后面的 ai+bi2a_i+b_i^2ai​+bi2​比例不匹配啊!正常的比例应该是: (虽然也不太正常,将就下) 解决方法 点击变换后的office公式右侧,选择更改为"显示" 可以看到,多了一些软回车符号(⬇),如果你想删除它,不要直接选中

weixin_43543177的博客 4645

git和github学习笔记

git和github学习笔记 仅为学习笔记和重要内容参考,如果想学习git相关知识,请移步廖雪峰的git教程 安装git windows下下载二进制安装 创建git仓库 在git bash工具窗口内,切换到某文件夹下,输入git init在该文件夹下生成.git文件夹 git常用命令 语句 含义 git status 查看状态 git log 查看日志 git reflog...

ShadowKiller' blog 770

提升仿真效率:Synopsys VCS高级编译选项优化技巧(2023最新版)

本文深入探讨了Synopsys VCS 2023版本中的高级编译选项优化技巧,帮助工程师提升仿真效率。通过并行编译、智能代码分析、精准覆盖率采样等策略,结合真实案例展示如何显著缩短仿真周期并优化资源使用,适用于数字芯片验证和大型SoC设计。

weixin_30338481的博客 113

用Python玩转Milvus:从安装SDK到完成第一个向量搜索Demo

本文为Python开发者提供了一份详细的Milvus向量数据库实战指南。文章重点讲解了如何规避版本兼容性陷阱,正确部署Milvus服务端并安装匹配的Python SDK。通过一个电影推荐系统的完整案例,演示了从数据建模、集合创建、向量插入、索引构建到执行混合搜索的全流程,帮助开发者快速上手并完成第一个向量搜索Demo。

weixin_29239279的博客 192

Git版本控制 – 使用HEAD

在使用Git进行版本控制过程中,Git中HEAD的作用至关重要。因此,理解和使用HEAD对有效管理repository非常重要。本文简要介绍HEAD在Git版本控制中的概念和作用,以及一些具体示例,希望对读者有所帮助。

jackson_lingua的博客 1579

自动驾驶系统架构解析:从传感器到决策控制的完整链路(附实际案例)

本文深入解析了自动驾驶系统从感知、决策到控制的完整架构链路。通过对比摄像头、毫米波雷达、激光雷达等核心传感器的特性与选型策略,阐述了多传感器融合的必要性。文章结合行为决策、运动规划及控制执行的实际案例,揭示了系统集成、数据闭环与功能安全等工程化落地的关键挑战,为理解自动驾驶技术提供了清晰的蓝图。

weixin_29051811的博客 337

【随笔】Git 基础篇 -- 远程仓库 git clone(二十五)

大家好,又见面了,我是夜阑的狗🐶,本文是专栏【Git】专栏的第二十五篇文章;这是今天学习到Git 高级篇 – 远程仓库 💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。【Git】, 此专栏是我是夜阑的狗对Git,Gitee等工具使用过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。远程仓库并不复杂,在如今的云计算盛行的世界很容易把远程仓库想象成一个富有魔力的东西, 但实际上它们只是你的仓库在另个一台计算机上的拷贝。

JMFive的博客 4336

【代码】获取高级行情数据,并通过 qmt 进行实际下单交易,自动实现止盈止损管理

【代码】获取高级行情数据,并通过 qmt 进行实际下单交易,自动实现止盈止损管理

XD1996CD的博客 4108

13个GNS3 3.0.5 appliances设备模板镜像合集:IOSv/L2,IOU L2/L3,以及IOS-XE

13个GNS3 appliances设备模板:IOSv/L2,IOU L2/L3,以及IOS-XE合集

haierccc的博客 1069

Git学习篇之git diff

Git学习篇之git diff用法详解 一、git diff 和 git diff HEAD – < file> 用法介绍 首先明确:git相较于其他版本控制系统的优越性,在于管理和跟踪的是修改,而不是文件。我们引入 git diff 来说明。 下面是工作区和暂存区的工作示意图 工作区:即用户桌面上的可见可操作目录。 版本库 = 暂存区(stage) + 分支区(master) ...

weixin_38445123的博客 1595

S7-200 SMART PLC 子程序功能块(阀门控制)

由于S7-200 SMARTPLC的子程序种种功能、容量限制,有时想实现多次调用的子程序可能并不是太容易,这篇博客还是给出一些推荐写法,供大家参看。

RXXW_Dor的博客 8063

Git学习笔记之——常见指令

Git学习笔记之-------常见指令 工作区\暂存区\仓库 说明 git config --global user.name “名称” 注册用户名 git config --global user.email “邮箱” 注册用户邮箱 git init 在当前文件夹建立Git项目 git mv game.py wordgame.py 本地安全地修改文件名 git ...

iot小胡的博客 375

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Git基础概念

1. Git概念  1.1. Git库中由三部分组成         Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制。.git目录位于工作目录内。  1) 工作目录:用户本地的目录;  2) Index(索引):将工作目录下所有文件(包含子目录)生成快照,存放到一个临时的存储区域,Gi

piziliweiguang的专栏 1680

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Git学习笔记

目录前言正文1. Git和SVN有什么区别参考 前言 正文 1. Git和SVN有什么区别 参考 关于 Git 的 20 个面试题

保持一颗敬畏之心,简单地调用C++,适当地向C++妥协,让以后的自己看懂代码,让别人看懂代码。 1302

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

git使用篇

GIT篇 目录 GIT篇 1. 分布式与集中式管理 2. 时光穿梭 2.1 版本回退 2.2工作区与暂存区 2.3 管理修改 2.4 撤销修改 2.5 删除文件 3. 远...

YMilton的专栏 314

【随笔】Git 高级篇 -- 分离 HEAD(十一)

大家好,又见面了,我是夜阑的狗🐶,本文是专栏【Git】专栏的第十一篇文章;这是今天学习到Git 高级篇 – 分离 HEAD💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。【Git】, 此专栏是我是夜阑的狗对Git,Gitee等工具使用过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。🌹 🌹 🌹也欢迎你,关注我。👍 👍 👍 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

JMFive的博客 2321

【随笔】Git 基础篇 -- 分支与合并 git merge(九)

大家好,又见面了,我是夜阑的狗🐶,本文是专栏【Git】专栏的第九篇文章;这是今天学习到Git 基础篇 – 分支与合并 💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。【Git】, 此专栏是我是夜阑的狗对Git,Gitee等工具使用过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。🌹 🌹 🌹也欢迎你,关注我。👍 👍 👍!! 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

JMFive的博客 7634

【随笔】Git 高级篇 -- 上传命令的参数 (上)git push(三十六)

大家好,又见面了,我是夜阑的狗🐶,本文是专栏【Git】专栏的第三十五篇文章;这是今天学习到Git 高级篇 – 上传命令的参数 (上) 💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。【Git】, 此专栏是我是夜阑的狗对Git,Gitee等工具使用过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。很好!既然你知道了远程跟踪分支,我们可以开始揭开git pushfetch和pull的神秘面纱了。

JMFive的博客 3323

Git 学习笔记——程序员篇

文章目录关于 Git基本概念术语及中英文对照安装Git客户端Git GUI 操作指南构建本地版本库Git Bash 操作指南 关于 Git 基本概念 和 SVN 相比,Git 有一些独特的术语和概念,有必要了解一下。 工作区(working tree):可以理解为客户端电脑上的项目路径。 版本库(repository):工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。 暂...

Python作业辅导员 - 天元浪子 1万+

【随笔】Git 基础篇 -- 分支与合并 git rebase(十)

大家好,又见面了,我是夜阑的狗🐶,本文是专栏【Git】专栏的第十篇文章;这是今天学习到Git 基础篇 – 分支与合并 git rebase💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。【Git】, 此专栏是我是夜阑的狗对Git,Gitee等工具使用过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。🌹 🌹 🌹也欢迎你,关注我。👍 👍 👍!!

JMFive的博客 2148

【Git】基本概念 + 本地基操

本文介绍了Git版本控制器的基本操作,包括创建本地仓库、配置用户信息、理解工作区/暂存区/版本库的关系。详细说明了git add将文件从工作区移到暂存区,git commit将暂存区内容提交到版本库的过程。还涵盖了查看提交记录(git log)、版本回退(git reset)、撤销修改(git checkout)和删除文件(git rm)等常用操作。特别强调了Git通过哈希算法管理对象库,并能快速切换版本的原因。文章通过图示和命令行示例,帮助读者掌握Git的核心概念和基础操作流程。

2303_80737493的博客 893
上一篇: JNA—JNI终结者
下一篇: Tapestry简述
facepp
博客等级 码龄22年 342粉丝 638原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值