Git 学习笔记

21 阅读14分钟

简介

最流行的两种分布式版本控制系统

  • 集中式:所有人的文件都保存在中央服务器上,每个人的服务器只保存一个副本,当要修改文件的时候,先要在中央服务器获取最新的版本,然后再修改内容,修改完后再上传回中央服务器

    • 优点:操作简单
    • 缺点:单点故障问题
  • 分布式:每个人的电脑上都有一个完整的版本库,所以我们可以在本地进行修改,不需要考虑网络问题,即使中央服务器出现问题,我们也可以继续工作,若需要将修改的内容分享给其他人的时候,只需要仓库互相同步一下就可以了

免费的开源的分布式版本控制系统,使用一个特殊的叫做仓库的数据库来记录文件的变化

仓库中的每个文件都有一个完整的版本历史记录,可以看到谁在什么时间修改了哪些文件的哪些内容,在需要的时候也可以将文件恢复到之前的某一个版本

git的安装和配置

配置目录标识:iTerm2 + Zsh + oh-my-zsh + Agnoster

在官网下载,如果可以在终端中看到版本信息说明安装好了

git -v

Git的使用方式

  • 命令行

  • 图形化界面

  • IDE插件

命令行使用

git中的命令都以git开头

1.配置用户名和邮箱,提交的时候才可以识别是谁提交的内容 --global表示全局配置,对所有的仓库都生效
git config --global user.name "xxx xxxx"
git config --global user.email xxx

2.保存用户名和密码
git config --global credential.helper store

3.查看配置信息
git config --global --list

新建一个版本库

版本库又叫仓库

两种方式

  • 命令行 git init
1.在对应的目录下创建一个文件,并且输入命令,创建一个仓库
git init

2..git目录存放了Git仓库的所有数据
不能随意修改
  • 使用git clone命令从github克隆一个已经存在的仓库

工作区域和文件状态

  1. 工作区

工作区:在资源管理器里面能看到的文件夹(实际操作的目录)

暂存区:也称为索引,是临时存储区域,用于保存即将提交到git仓库的修改内容(用户临时存放即将提交的修改内容)

本地仓库:包含了完整的项目历史和元数据,是git存储代码和版本信息的主要位置

  1. 文件状态

未跟踪:新创建的,没有被管理起来的文件

未修改:被管理起来,但是文件的内容没有变化,还没有被修改过

已修改:已经修改了文件

已暂存:修改后并且添加到暂存区的文件

添加文件到仓库

1.git init 创建仓库

2.git status 查看仓库的状态

3.git add 文件添加到暂存区,可以使用通配符git add . 表示把文件夹下的文件都添加
 
4.git commit -m "提交的信息" 提交

5.git log 查看提交记录,可以使用--oneline来查看简洁的提交记录

Git reset

是什么:用于回退版本,可以退回到某一个提交的状态

三种模式

举例:

1.使用mixed回退到这个版本号
git reset -mixed 版本号
现象:工作区的文件内容还在,并且没有提交到暂存区

2.查看暂存区的内容
git ls-list

3.查看当前工作区的的文件状态
git status

Git diff

查看工作区,暂存区,本地仓库之间的差异

查看不同版本之间的差异

查看不同分支的差异

git diff后面如果什么都不加的话比较的就是工作区和暂存区之间的差异内容

 1.先修改工作区的文件内容
 vim file3.txt
 
 2.修改完后查看工作区和暂存区的区别
 git diff
 现象:有差异
 
 3.将修改的文件添加到暂存区
 git add .
 
 4.使用git diff 查看输出结果
 现象:没有任何内容,表示工作区和暂存区的内容是相同
1.使用命令 git diff HEAD
现象:有差异,因为还没有执行提交
1.使用命令git diff --cached
1.使用命令 git diff 版本号 版本号

2.比较当前版本和上一个版本的差异
git diff HEAD~ HEAD

HEAD:表示当前分支的最新提交,指向分支的最新提交节点

总结

**git diff**
- 工作区 VS 暂存区

**git diff HEAD**
- 工作区 + 暂存区 VS 本地仓库

**git diff --cached / git diff --staged**
- 暂存区 VS 本地仓库

**git diff <commit_hash> <commit_hash> / git diff HEAD~ HEAD**
- 比较提交之间的差异

**git diff <branch_name> <branch_name> /**
- 比较分支之间的差异

git rm 删除文件

1.把文件从工作区和暂存区同时删除
git rm <file>

2.把文件从暂存区删除,但保留在当前工作区
git rm --cached<file>

3.递归删除某个目录下的所有子目录和文件
git rm -r*

删除后不要忘记提交

.gitignore

  1. 作用:忽略掉不应该被加入到版本库的信息

  2. 应该忽略的文件:

  • 系统或者软件自动生成的文件

  • 编译产生的中间文件和结果文件(.class)

  • 运行时产生的日志文件,缓存文件,临时文件

  • 涉及身份,密码,口令,密钥等敏感信息文件

  1. 规则
  • 空行或者以 # 开头的行会被 Git 忽略。一般空行用于可读性的分隔,# 一般用作注释

  • 使用标准的 Blob 模式匹配,例如:   星号 * 通配任意个字符   问号 ? 匹配单个字符   中括号 [] 表示匹配列表中的单个字符,比如:[abc] 表示 a / b / c

  • 两个星号 ** 表示匹配任意的中间目录

  • 中括号可以使用短中线连接,比如:   [0-9] 表示任意一位数字,[a-z] 表示任意一位小写字母

举例

# 忽略所有的 .a 文件
*.a

# 但跟踪所有的 lib.a,即使你在前面忽略了 .a 文件
!lib.a

# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO

# 忽略任何目录下名为 build 的文件夹
build/

# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt

# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件

官方提供的各语言的忽略文件模版:github.com/github/giti…

Github的SSH配置和克隆仓库

官网:github.com

  1. 搜索项目:在最上面的搜索框里输入要找的内容

  2. 创建仓库

步骤:

  • 点击左上角的logo,进入我们的主页

  • 点击绿色的创建仓库的按钮

  • 创建完成后会跳转到仓库的主页面

  1. 克隆远程仓库
  • 使用git clone命令加上从SSH复制的地址,来克隆一下我们的仓库
  • 会报错,因为没有配置SSH密钥
  • 进入根目录,使用ssh-key generate这个命令来生成我们的SSH密钥
-t 指定协议为rsa,-b指定生成的大小为4096
ssh-keygen -t rsa -b 4096
  • 如果是第一次生成文件,输入命令后直接回车就可以;不是的话就需要再输入一个文件的名字,否则会覆盖掉第一个文件,并且是不可逆的
  • 生成两个文件
1.密钥文件,谁也不要给
rsa

2.公钥文件,上传到github
rsa.pub
  • 复制公钥文件的内容,打开右上角的头像,找到settings,在页面的左侧有一个SSH和GPG密钥配置的选项,打开后新建SSH的按钮,把刚复制的内容粘贴到输入框中
  • 如果是第一次配置到这里就可以了;若不是要添加命令
~/ .ssh
tail -5 config

# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/test
  • 使用命令克隆仓库
  1. 本地仓库和远程仓库

总结

生成SSH Key ssh-keygen -t rsa -b 4096
私钥文件:id_rsa
公钥文件:id_rsa.pub

克隆仓库  git clone repo-adddress

推送更新内容 git push<remote><branch>

拉去更新内容 git pull<remote>

关联本地仓库和远程仓库

在github上创建新项目,复制仓库的地址

在本地添加一个远程仓库

Git remote add

使用来查看当前仓库和远程仓库所对应的仓库别名和地址

Git remote -v

把本地的main分支和远程的main分支关联起来

Git push -u origin main

拉取并且合并远程仓库的main分支的修改内容

Git pull

在执行完git pull后,git会自动为我们执行完一次合并操作,如果本地和远程的修改内容没有冲突的话合并就会成功,否则就由于冲突而失败,需要手动解决冲突

Git fetch

只是获取远程仓库的修改,不会自动合并到本地仓库中

总结

添加远程仓库:
Step 1: git remote add <远程仓库别名> <远程仓库地址>
Step 2: git push -u <远程仓库名> <分支名>
查看远程仓库:
git remote -v
拉取远程仓库内容:
git pull <远程仓库名> <远程分支名>:<本地分支名>

Gitlab

官网:gitlab.com

右上角的个人头像弹出菜单里面找到偏好设置,找到语言设置,为中文

分支简介和基本操作

下载git的图形化管理工具

分支的使用场景:适合团队协作和分支管理,多个开发人员可以在自己的分支上进行开发工作,最后再合并到主线代码库中,可以提高团队的合作效率,减少冲突和影响

基本操作

创建一个新的项目

Mkdir branch-demo

初始化一个仓库

Git init

使用图形化界面打开仓库


创建main分支的第一个文件
echo main1 > main1.txt
git add .
git commit -m "main:1"
使用同样的方式创建两个文件

使用git branch查看当前仓库的所有分支
使用git branch dev 创建一个新的分支
使用git switch dev命令切换到新的分支 
在dev分支上创建两个文件并且提交

切换为main分支,创建两个文件并且提交
合并dev分支,使用git merge dev命令
可以使用git branch -d dev删除已经合并的分支

总结

查看分支列表:
$ git branch

查看远程所有分支:
git fetch -all

创建分支:
$ git branch branch-name

切换分支:
$ git checkout branch-name
【推荐】
$ git switch branch-name

合并分支:
$ git merge branch-name

删除分支:
【已合并】
$ git branch -d branch-name
【未合并】
$ git branch -D branch-name

解决合并冲突

两个分支未修改同一个文件的同一处位置:Git 自动合并

两个分支修改了同一个文件的同一处位置:产生冲突

**解决方法:**

Step1 - 手工修改冲突文件,合并冲突内容

Step2 - 添加暂存区  `$ git add file`

Step3 - 提交修改   `$ git commit -m "message"`

**中止合并:** 当不想继续执行合并操作时可以使用下面的命令来中止合并过程:

`$ git merge --abort`

回退和rebase

删除掉的分支可以恢复到对应的提交位置

Git checkout -b dev 提交id

将仓库回退到某一个时间点

Git reset --hard 提交id

rebas和merge有什么区别,改如何区分使用?

  • Merge

优点:不会破坏分支的提交记录,方便回溯和查看

缺点:会产生额外的提交节点,分支图复杂

  • Rebase

优点,不会新增额外的提交记录,形成线形历史,比较直观

缺点:会改变提交历史,不会在公共分支进行rebase操作

工作流模型

版本号规则(Tag:1.0.0)

主版本:主要的功能或重大更新

次版本:一些新的功能,改进和更新,通常不影响现有功能

修订版本:一些小bug的修复,不更改现有的接口

gitflow模型

主线/基线分支:只接受hotfix和release的合并请求,不允许直接push修改

线上版本bug热修复分支:用于解决线上问题,修复完成后合并回main分支

开发分支:用于开发和测试

功能分支:包含项目新功能的代码,开发完成后合并为开发分支

预发布分支:包含了最新预发布版本的代码,在代码修改稳定后回合并回主分支

操作流程

克隆项目到本地

  1. 打开 GitLab 上的项目页面: 登录到 GitLab,进入你要克隆的项目页面。

  2. 复制 Git 项目的 URL

  3. 在 IDEA 中打开 Git

    1. 打开 IntelliJ IDEA,选择 File > New > Project from Version Control > Git
    2. 在弹出的窗口中,粘贴刚刚复制的 GitLab 项目 URL。
  4. 选择本地目录: 选择你想要将项目克隆到本地的文件夹位置。

  5. 克隆并打开项目: 点击 Clone,IDEA 会自动将项目克隆到本地,并在完成后打开。

拉取最新代码

每次开发前,确保你拉取了 GitLab 上的最新代码。操作如下:

  • 拉取最新的代码

    • 点击 VCS > Git > Pull
    • 选择拉取的分支(一般是 mastermain)。

创建新分支

  • 如果你要开始一个新的功能或修复 bug,建议从主分支(如 main)拉取最新代码后,创建一个新的分支。
  • 在 IDEA 中,你可以通过点击左下角的 Git 分支按钮,选择 New Branch 来创建新分支。

提交代码

在开发完成后,提交和推送代码到 GitLab:

  1. 提交代码

    1. 点击 VCS > Commit,选择你想提交的文件,填写提交信息。
    2. 点击 CommitCommit and Push,将代码提交到本地 Git 仓库。
  2. 推送代码

    1. 点击 VCS > Git > Push,将代码推送到 GitLab 仓库。

命令说明

1. 提交(Commit)
功能:提交你对代码的更改到本地 Git 仓库。
使用:点击 提交... ,在弹出的窗口中选择你已修改的文件,并添加提交信息,然后点击 Commit 来提交修改。
2. 推送(Push)
功能:将本地仓库的更改推送到远程仓库。
使用:点击 推送... ,将本地提交推送到远程的 Git 仓库,例如 GitLab。
3. 更新项目(Update Project)
功能:从远程仓库拉取最新的代码更新,并与本地的代码进行合并。
使用:点击 更新项目... ,选择需要更新的远程分支,通常是拉取主分支(如 main 或 master)。
4. 拉取(Pull)
功能:拉取远程仓库的最新代码并更新到本地。
使用:点击 拉取... ,从远程仓库获取更新并将其合并到本地分支。
5. 合并(Merge)
功能:将一个分支的修改合并到当前分支。
使用:点击 合并... ,选择要合并的分支,通常用于将 feature 分支合并到主分支。
6. 变基(Rebase)
功能:将当前分支的提交应用到目标分支的顶部,相较于合并,变基保持了历史提交的线性。
使用:点击 变基... ,选择目标分支并进行变基操作。
7. 分支(Branches)
功能:查看和管理 Git 分支。
使用:点击 分支... ,查看当前仓库中的所有分支,并选择切换、删除或创建新分支。
8. 新建分支(New Branch)
功能:创建一个新的 Git 分支。
使用:点击 新建分支... ,输入分支名称,选择一个起始分支(通常是 main),然后创建一个新的分支。
9. 新建标签(New Tag)
功能:创建一个新的 Git 标签,标签用于标记特定的版本或提交。
使用:点击 新建标签... ,输入标签名称和相关信息,通常用于版本发布时。
10. 重置 HEAD(Reset HEAD)
功能:将 Git 仓库的 HEAD 指针重置到指定的提交。
使用:点击 重置 HEAD... ,选择要回退到的提交,适用于需要撤销提交或回退到早期版本的情况。
11. 显示 Git 日志(Show Git Log)
功能:显示 Git 提交日志,查看仓库的历史提交。
使用:点击 显示 Git 日志,查看本地 Git 仓库的提交记录。
12. 补丁文件(Patch)
功能:生成一个补丁文件,可以用于分享代码变更。
使用:点击 补丁文件,生成当前改动的补丁文件,用于后续应用或审核。
13. 未提交的更改(Uncommitted Changes)
功能:查看未提交的更改文件,检查本地修改但未提交的文件。
使用:点击 未提交的更改,查看和管理你尚未提交的文件。
14. 当前文件(Current File)
功能:查看当前文件的 Git 状态。
使用:点击 当前文件,查看该文件的提交状态、是否有未提交的更改。
15. GitHub(GitHub)
功能:与 GitHub 进行集成,可以直接从 IDEA 操作 GitHub。
使用:点击 GitHub,可以执行 GitHub 上的操作,如创建 Pull Request 或查看 GitHub 仓库。
16. 管理远程(Manage Remotes)
功能:管理远程 Git 仓库的配置。
使用:点击 管理远程,配置远程仓库(如 GitLab 或 GitHub)的 URL,或者添加新的远程仓库。
17. 克隆(Clone)
功能:从远程仓库克隆项目到本地。
使用:点击 克隆... ,输入仓库 URL 克隆到本地。