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)
点赞加关注,收藏不迷路!本篇文章对你有帮助的话,还请多多点赞支持!

相关推荐
好奇龙猫1 分钟前
【大学院-筆記試験練習:数据库(データベース問題訓練) と 软件工程(ソフトウェア)(6)】
学习
咚咚王者5 分钟前
人工智能之核心基础 机器学习 第十一章 无监督学习总结
人工智能·学习·机器学习
0和1的舞者6 分钟前
Python 中四种核心数据结构的用途和嵌套逻辑
数据结构·python·学习·知识
Albert Edison11 分钟前
【Git】多人协作一(同一分支下)
git·vscode·svn·github
在路上看风景13 分钟前
01. 学习教程链接
学习
bodybo15 分钟前
搭建内网穿透服务器NPS
笔记
学好statistics和DS19 分钟前
Git 同步冲突
大数据·git·elasticsearch
小猪佩奇TONY19 分钟前
Linux 内核学习(15) --- linux MMU 和 分页机制
linux·学习
强子感冒了24 分钟前
Java IO流学习笔记:从字节流到字符流
java·笔记·学习
BMS小旭26 分钟前
CubeMx-DMA
单片机·学习·cubemx·dma