Git学习笔记

名人说:莫听穿林打叶声,何妨吟啸且徐行。------ 苏轼《定风波·莫听穿林打叶声》
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)

目录

0.学习Git有什么用?

学习Git非常有用,主要体现在以下几个方面:

① 版本控制

Git可以帮助你有效地管理项目的不同版本。无论是回溯到旧版本、比较版本间的差异,还是修复错误,Git都提供了强大的支持。

② 协作开发

在多人协作的项目中,Git是关键的工具。它允许多个开发者同时工作在同一个项目上,而不会互相干扰。通过分支和合并的功能,团队成员可以在不同的特性或修复上独立工作,然后再将他们的工作合并到主项目中。

③ 适用于现代开发流程

现代软件开发,特别是敏捷开发和持续集成/持续部署(CI/CD),大量依赖版本控制系统,而Git是最流行的选择之一。掌握Git,可以让你更容易融入现代软件开发的工作流程。

除了上述几个方面以外:

对于软件开发人员来说,掌握Git是一项基本技能。无论是自由职业者、开源项目贡献者,还是寻求加入技术公司,Git都是需要的一部分,它能帮助你更好地管理项目。

总之,无论是个人技能提升,还是作为团队合作和项目管理的必备工具,学习Git都是很有用的。

1.Git和SVN的区别

①Git

分布式版本控制(主流)

所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。

不会因为服务器损坏或者网络问题,造成不能工作的情况,但是缺点在于会存在安全隐患,因为本地所有用户都拥有。

②SVN

集中式版本控制

所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改 。所有数据都保存在单一的服务器上,但若服务器损坏,这样就会丢失所有的数据,风险较高,解决方法:可以定期备份,这样可以降低风险。

2.基础linux命令

在使用Git时,可能会用到一些基本的Linux命令,特别是在Linux环境下工作或者使用类Unix系统(如macOS)时。但是需要注意,Git命令和Linux命令是不同的,尽管它们通常在同一个命令行界面中使用,一些基础的Linux命令如下:

c 复制代码
(1) cd : 改变目录。

(2) cd .. :回退到上一个目录,直接cd进入默认目录

(3) pwd : 显示当前所在的目录路径。

(4) ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。

(5) touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。

(6) rm: 删除一个文件, rm index.js 就会把index.js文件删除。

(7) mkdir: 新建一个目录,就是新建一个文件夹。

(8) rm -r : 删除一个文件夹, rm -r src 删除src目录
   rm -rf /  切勿在Linux中尝试!删除电脑中全部文件!

(9) mv : 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。

(10) reset : 重新初始化终端/清屏。

(11) clear : 清屏。

(12) history : 查看命令历史。

(13) help : 帮助。

(14) exit : 退出。

(15) # : 表示注释

3.Git配置

①查看不同级别的配置文件
c 复制代码
#查看系统配置config
git config --system --list
    
#查看用户(global)配置
git config --global --list
②设置用户名与邮箱
c 复制代码
git config --global  user.name "yueliusu" #用户名
git config --global  user.email "xxxxxxxxxx@qq.com" #邮箱 

4.Git的工作原理

Git是一种分布式版本控制系统,它的工作原理可以分为几个关键部分:

  1. 工作区(Working Directory):这是你的本地文件夹,用于存放实际的文件。

  2. 暂存区(Staging Area) :当你对文件进行了修改之后,可以将这些修改添加到暂存区。这个过程通常使用git add命令完成。暂存区是一个准备好的状态,用于记录文件的下一次提交。

  3. 本地仓库(Local Repository) :当你执行git commit操作时,暂存区的更改会被提交到本地仓库。这意味着你的更改被记录在Git的历史中。本地仓库包含了项目的全部历史记录,包括不同的分支和标签。

  4. 远程仓库(Remote Repository) :这是存储在网络上的版本库,可以与他人共享。通过命令如git pushgit pull,你可以将本地仓库的更改推送到远程仓库,或者从远程仓库获取最新的更改。

文件在这四个区域之间的转换关系如下:

Git的核心概念是快照。当你提交你的更改时,Git实际上是在记录当前工作区的快照,并且只存储与上一个快照不同的部分(差异)。这种方式使得Git非常高效,不管仓库有多大,检查当前版本的状态总是很快的。

补充(关于快照的理解):

快照可以理解是在执行git commit时,对当前暂存区的情况拍摄的一张"照片",这个照片中涵盖的若干信息将被存放到git版本库下。

5.Git的项目搭建及下载

①本地仓库搭建
bash 复制代码
# 在当前目录新建一个Git代码库
$ git init
②下载远程仓库
bash 复制代码
$git clone https://gitee.com/xxxx/xxxx.git
或
$git clone https://github.com/xxxx/xxxx.git

6.Git的基本操作命令

①文件4种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

  • Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
  • Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
  • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !
  • Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
②查看文件状态

通过以下命令可以查看文件状态:

bash 复制代码
#查看指定文件状态
git status [filename]
 
#查看所有文件状态
git status
 
# git add .                  添加所有文件到暂存区
# git commit -m "消息内容"    提交暂存区中的内容到本地仓库 -m 提交信息
③忽略文件

有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等

在主目录下建立".gitignore"文件,此文件有如下规则:

  • 忽略文件中的空行或以井号(#)开始的行将会被忽略。
  • 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
  • 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
  • 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
  • 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
bash 复制代码
#为注释
*.txt        #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt     #但lib.txt除外
/temp        #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/       #忽略build/目录下的所有文件
doc/*.txt    #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
④增加/删除文件
bash 复制代码
# 添加指定文件到暂存区
$ git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
$ git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .

# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...

# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]

# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
⑤提交代码
bash 复制代码
# 提交暂存区到仓库区
$ git commit -m [message]

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

7.Git分支及拓展

分支(Branch)在GIT中相对较难,分支就好比一条条的溪流。不过,在某个时间点,两个溪流汇合,可能就成为了一条河流,我们就需要处理一些河道等问题了。在汇合之前,它们是独立的工作流,允许你在不影响主线(通常是master或main分支)的情况下,开发新功能或修复bug。

①Git分支常用指令
bash 复制代码
# 列出所有本地分支
git branch
 
# 列出所有远程分支
git branch -r
 
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
 
# 新建一个分支,并切换到该分支
git checkout -b [branch]
 
# 合并指定分支到当前分支
$ git merge [branch]
 
# 删除分支
$ git branch -d [branch-name]
 
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

如果同一个文件在合并分支时都被修改了则会引起冲突:解决的办法是我们可以修改冲突文件后重新提交,选择要保留他的代码还是你的代码。master/main主分支可以用来发布新版本,一般情况下不允许在上面进行工作,工作一般情况下在新建的dev分支上工作,工作完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master/main上来。

②合并(Merge)和变基(Rebase)

Git中的合并(Merge)和变基(Rebase)可以用来处理分支间差异,具体如下:

  1. 合并(Merge):合并是将一个分支的更改合并到另一个分支的过程。在合并时,Git会尝试自动结合两个分支的更改。如果不同分支对同一个文件的同一部分做了更改,就可能出现冲突,这时需要手动解决冲突后再完成合并操作。合并操作通常保留了两个分支的历史,会在历史记录中创建一个新的合并提交(merge commit)。

  2. 变基(Rebase):变基是另一种整合不同分支更改的方法。通过变基,可以将一个分支上的更改"重新播放"在另一个分支的顶部。这通常用于保持一个线性的项目历史,因为它可以避免合并提交的生成。但是,变基会改变历史,所以不推荐在共享的分支上使用变基,以免造成混乱。

总的来说,合并和变基都是处理分支间差异的强大工具,但它们的使用方式和目的略有不同。合并适用于保留完整历史记录的情况,而变基适用于创建一个干净、直线式的历史记录。在实际应用中,选择哪一种方式取决于具体的项目需求和团队工作流程。

8.代码托管平台(Github、Gitee)

①代码托管平台

代码托管平台是一种网络服务,它允许开发者和团队存储、管理、跟踪和协作开发项目的源代码。这些平台通常提供以下核心功能:

  1. 版本控制:支持如Git等版本控制系统,帮助开发者管理代码的历史版本,轻松实现版本回退、分支合并等操作。

  2. 协作工具:提供Issue跟踪、代码审查、项目Wiki等工具,以促进团队协作和信息共享。

  3. 安全性与访问控制:通过权限设置确保代码安全,只有授权用户才能访问或修改代码。

  4. 集成服务:往往与其他开发工具或第三方服务集成,如持续集成(CI)、持续部署(CD)工具。

  5. 云存储:代码存储在云端,可从任何地方访问。

常见的代码托管平台包括GitHub、GitLab、Bitbucket和国内的Gitee(码云)等。这些平台大大简化了软件开发流程,尤其是对于团队协作和开源项目来说至关重要。

接下来重点介绍一下Github和Gitee。

②Gitee和Github

1️⃣Gitee

2️⃣Github

3️⃣Gitee和Github的区别

Gitee 和 GitHub 都是代码托管平台,但它们各自有一些区别:

  1. 所有权与位置:

    • GitHub: 属于微软,服务器主要在美国。
    • Gitee: 也被称为码云,是国内的一个代码托管平台。
  2. 访问速度:

    • 在国内,Gitee 的访问速度通常比 GitHub 快,因为服务器在本地,访问更便捷。
  3. 社区与用户群体:

    • GitHub: 拥有全球最大的开发者社区,国际上更为流行。
    • Gitee: 用户群体主要是国内开发者。
  4. 功能与界面:

    • 功能上两者相似,都提供了版本控制、Issue 跟踪、Wiki 等功能。
    • 界面方面,GitHub更广泛,而 Gitee 更符合国内用户的习惯。

To be continued...

笔记参考资料如下

①狂神说Git(B站)

Git大全

③《Pro Git》书籍第二版,作者:Scott Chacon, Ben Straub等
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder)
点赞加关注,收藏不迷路!本篇文章对你有帮助的话,还请多多点赞支持!

相关推荐
非概念2 分钟前
stm32学习笔记----51单片机和stm32单片机的区别
笔记·stm32·单片机·学习·51单片机
程序员buddha1 小时前
git版本工具使用教程
git
无敌最俊朗@1 小时前
stm32学习之路——八种GPIO口工作模式
c语言·stm32·单片机·学习
EterNity_TiMe_2 小时前
【论文复现】STM32设计的物联网智能鱼缸
stm32·单片机·嵌入式硬件·物联网·学习·性能优化
L_cl2 小时前
Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程
学习
前端SkyRain2 小时前
后端Node学习项目-用户管理-增删改查
后端·学习·node.js
青椒大仙KI112 小时前
24/11/13 算法笔记<强化学习> DQN算法
笔记·算法
提笔惊蚂蚁2 小时前
结构化(经典)软件开发方法: 需求分析阶段+设计阶段
后端·学习·需求分析
DDDiccc2 小时前
JAVA学习日记(十五) 数据结构
数据结构·学习
promise-render3 小时前
npm、yarn、pnpm 切换查看镜像源笔记
前端·笔记·npm