Git 学习笔记

文章目录

  • [1 安装与卸载 git](#1 安装与卸载 git)
    • [1.1 安装](#1.1 安装)
    • [1.2 卸载](#1.2 卸载)
  • [2 基本操作](#2 基本操作)
    • [2.1 创建本地仓库](#2.1 创建本地仓库)
    • [2.2 配置本地仓库](#2.2 配置本地仓库)
    • [2.3 工作区、暂存区、版本库](#2.3 工作区、暂存区、版本库)
    • [2.4 添加文件](#2.4 添加文件)
    • [2.5 版本回退](#2.5 版本回退)
    • [2.6 撤销修改](#2.6 撤销修改)
      • [2.6.1 只撤销工作区(未 git add)](#2.6.1 只撤销工作区(未 git add))
      • [2.6.2 撤销工作区和暂存区(已 git add 但未 commit)](#2.6.2 撤销工作区和暂存区(已 git add 但未 commit))
      • [2.6.3 撤销工作区、暂存区和版本库](#2.6.3 撤销工作区、暂存区和版本库)
    • [2.7 删除文件](#2.7 删除文件)
  • [3 分支管理](#3 分支管理)
    • [3.1 创建、切换、合并分支](#3.1 创建、切换、合并分支)
    • [3.2 删除分支](#3.2 删除分支)
    • [3.3 合并冲突](#3.3 合并冲突)
    • [3.4 合并模式](#3.4 合并模式)
      • [3.4.1 Fast-forward 合并场景](#3.4.1 Fast-forward 合并场景)
      • [3.4.2 非 Fast-forward 合并场景](#3.4.2 非 Fast-forward 合并场景)
      • [3.4.3 Fast-forward 的三种模式](#3.4.3 Fast-forward 的三种模式)
        • [3.4.3.1 默认模式(`--ff`)](#3.4.3.1 默认模式(--ff))
        • [3.4.3.2 强制 Fast-forward(`--ff-only`)](#3.4.3.2 强制 Fast-forward(--ff-only))
        • [3.4.3.3 禁用 Fast-forward(`--no-ff`)工作中更推荐使用](#3.4.3.3 禁用 Fast-forward(--no-ff)工作中更推荐使用)
    • [3.5 bug 分支](#3.5 bug 分支)
      • [3.5.1 git stash 介绍](#3.5.1 git stash 介绍)
        • [3.5.1.1 典型开发场景](#3.5.1.1 典型开发场景)
      • [3.5.2 修复bug时使用的方法](#3.5.2 修复bug时使用的方法)
        • [3.5.2.1 法一(不推荐)](#3.5.2.1 法一(不推荐))
        • [3.5.2.2 法二(推荐)](#3.5.2.2 法二(推荐))
    • [3.6 强制删除分支](#3.6 强制删除分支)
  • [4 远程操作](#4 远程操作)
    • [4.1 克隆远程仓库](#4.1 克隆远程仓库)
      • [4.1.1 使用 HTTPS](#4.1.1 使用 HTTPS)
      • [4.1.2 使用 SSH](#4.1.2 使用 SSH)
    • [4.2 向远程仓库推送](#4.2 向远程仓库推送)
    • [4.3 拉取远程仓库](#4.3 拉取远程仓库)
    • [4.4 查看 / 绑定远程仓库分支](#4.4 查看 / 绑定远程仓库分支)
    • [4.5 在远程仓库创建分支](#4.5 在远程仓库创建分支)
      • [4.5.1 远程创建分支(推荐)](#4.5.1 远程创建分支(推荐))
      • [4.5.2 本地创建分支(不推荐)](#4.5.2 本地创建分支(不推荐))
    • [4.6 忽略特殊文件](#4.6 忽略特殊文件)
    • [4.7 配置命令别名](#4.7 配置命令别名)
  • [5 标签管理](#5 标签管理)
    • [5.1 操作标签](#5.1 操作标签)
  • [6 多人协作](#6 多人协作)
    • [6.1 多人在同一分支下进行开发(不常见)](#6.1 多人在同一分支下进行开发(不常见))
      • [6.1.1 解决冲突](#6.1.1 解决冲突)
      • [6.1.2 将内容合并进 master](#6.1.2 将内容合并进 master)
        • [6.1.2.1 PR(推荐)](#6.1.2.1 PR(推荐))
        • [6.1.2.2 本地(不推荐)](#6.1.2.2 本地(不推荐))
    • [6.2 在不同分支下进行开发](#6.2 在不同分支下进行开发)
      • [6.2.1 切换分支开发](#6.2.1 切换分支开发)
    • [6.3 将内容合并进 master](#6.3 将内容合并进 master)
    • [6.4 解决 git branch -a 打印已被删除的远程分支](#6.4 解决 git branch -a 打印已被删除的远程分支)
  • [7 文章末尾定位](#7 文章末尾定位)

1 安装与卸载 git

1.1 安装

ssh 复制代码
sudo apt-get install git -y

1.2 卸载

ssh 复制代码
sudo apt-get remove git -y

2 基本操作

2.1 创建本地仓库

在当前文件夹下创建 git 仓库

ssh 复制代码
git init

2.2 配置本地仓库

配置 name

ssh 复制代码
git config user.name "用户名"

配置 email

ssh 复制代码
git config user.email "邮箱"

查看当前仓库的所有配置项

ssh 复制代码
git config -l

重置配置

ssh 复制代码
# 重置用户名
git config --unset user.name
# 重置邮箱
git config --unset user.email

全局配置

ssh 复制代码
# 配置 name
git config --global user.name "用户名"
# 配置 email
git config --global user.email "邮箱"

重置全局配置

ssh 复制代码
# 重置用户名
git config --global --unset user.name
# 重置邮箱
git config --global --unset user.email

2.3 工作区、暂存区、版本库

Git 工作区、暂存区和版本库概念:

  • 工作区: 就是你在电脑里能看到的目录。
  • 暂存区: 英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库: 工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

2.4 添加文件

将指定文件的修改添加到暂存区

ssh 复制代码
git add 文件名 [文件名]

将当前目录下所有的修改都添加到暂存区

ssh 复制代码
git add .

将暂存区中的修改提交到本地仓库中

ssh 复制代码
git commit -m "日志说明"

查看提交记录

ssh 复制代码
git log

打印更漂亮的记录

ssh 复制代码
git log --pretty=oneline

查看 git 仓库的状态

ssh 复制代码
git status

显示暂存区和工作区的差异

ssh 复制代码
git diff [文件名]

2.5 版本回退

ssh 复制代码
git reset [--soft | --mixed | --hard] [HEAD]
  • HEAD 是一个指针,指向当前所在的分支的最新提交

假设我有一个 ReadMe 文件,这个文件的第一个版本中的内容是 "git",第二个版本中的内容是 "git world"。现在我想要进行版本回退:

git rest 命令的本质是回退版本库中的内容。

git rest --hard 慎用!


查看本地的提交记录

ssh 复制代码
git reflog

什么是 reflog?

  • 引用日志:记录所有 HEAD 和分支引用的变更历史
  • 本地专属:只存在于你的本地仓库,不会推送到远程
  • 时间有限:默认保留90天,之后会被Git自动清理

2.6 撤销修改

2.6.1 只撤销工作区(未 git add)

ssh 复制代码
git checkout -- [文件名]

注意:在较新版本的 Git 中,推荐使用更明确的命令:

ssh 复制代码
# 撤销单个文件
git restore [文件名]

# 撤销所有文件
git restore .

2.6.2 撤销工作区和暂存区(已 git add 但未 commit)

分两步走

ssh 复制代码
# 回退暂存区
git reset HEAD [文件名]

# 回退工作区
git checkout -- [文件名]
# 或使用新命令:git restore [文件名]
  • HEAD :表示要回退到当前版本,如果是 HEAD^ 表示回退到上一个版本,HEAD^^表示回退到上两个版本,以此类推...

也可以一步到位:

ssh 复制代码
git reset --hard HEAD

这个命令会重置所有文件,不能指定单个文件名,使用时需谨慎。

2.6.3 撤销工作区、暂存区和版本库

ssh 复制代码
# 回退到上一个版本(撤销最后一次提交)
git reset --hard HEAD^

# 回退到上两个版本
git reset --hard HEAD^^
# 或
git reset --hard HEAD~2
  • HEAD :表示要回退到当前版本,如果是 HEAD^ 表示回退到上一个版本,HEAD^^表示回退到上两个版本,以此类推...

2.7 删除文件

删除工作区和暂存区的文件

ssh 复制代码
git rm [文件名]

删除文件后,commit 提交一下,版本库中的内容也就删除了

ssh 复制代码
git commit -m "日志说明"

完整工作流程示例

ssh 复制代码
# 1. 查看当前状态
git status

# 2. 删除文件
git rm old-file.txt

# 3. 查看删除后的状态(会显示删除待提交)
git status

# 4. 提交删除操作
git commit -m "删除不再使用的 old-file.txt 文件"

# 5. 推送到远程仓库(如果需要)
git push

恢复误删除的文件

ssh 复制代码
# 恢复单个被删除的文件
git checkout HEAD -- [文件名]

# 或使用新命令
git restore [文件名]

3 分支管理

3.1 创建、切换、合并分支

查看当前仓库中有哪些本地分支

ssh 复制代码
git branch
  • * :表示当前 HEAD 指向哪个分支

创建分支

ssh 复制代码
git branch 分支名

切换分支

ssh 复制代码
git checkout 分支名

创建分支,并且切换到新创建的分支中

ssh 复制代码
git branch -b 分支名 

合并分支

ssh 复制代码
git merge 要合并的分支名

3.2 删除分支

删除分支

ssh 复制代码
git branch -d 分支名
  • 注意:不能删除当前所在的分支,需要先切换到其他分支才能删除目标分支

3.3 合并冲突

在合并分支时可能会出现如下的情况:

它告诉我们在 ReadMe 文件中存在冲突

进入 ReadMe 文件:

冲突解决后,再次提交文件:

可以看到,合并成功了

总结一下,分支冲突时,我们需要手动解决冲突,并进行一次提交。


查看分支图

ssh 复制代码
git log --graph --abbrev-commit

效果:

3.4 合并模式

Fast-forward(快进) 是 Git 分支合并的一种模式,当目标分支(如 main)自特性分支(如 feature)创建以来没有新的提交时,Git 会简单地将分支指针向前移动,而不创建新的合并提交。

3.4.1 Fast-forward 合并场景

ssh 复制代码
初始状态:
A---B---C (main)
         \
          D---E (feature)

合并后:
A---B---C---D---E (main, feature)

3.4.2 非 Fast-forward 合并场景

ssh 复制代码
初始状态:
A---B---C---F (main)
         \
          D---E (feature)

合并后(禁用FF):
A---B---C---F---G (main)
         \     /
          D---E (feature)

3.4.3 Fast-forward 的三种模式

3.4.3.1 默认模式(--ff
ssh 复制代码
# Git 会自动尝试 Fast-forward 合并
git merge feature-branch

# 等同于
git merge --ff feature-branch

行为:如果可能就 Fast-forward,否则创建合并提交

3.4.3.2 强制 Fast-forward(--ff-only
ssh 复制代码
# 只允许 Fast-forward 合并,否则失败
git merge --ff-only feature-branch

行为:如果能 Fast-forward 就合并,否则报错并保持原状

3.4.3.3 禁用 Fast-forward(--no-ff)工作中更推荐使用
ssh 复制代码
# 总是创建合并提交,即使可以 Fast-forward
git merge --no-ff feature-branch

行为:无论情况如何,都会创建一个新的合并提交

3.5 bug 分支

3.5.1 git stash 介绍

git stash 是一个"暂存"命令,允许你临时保存当前工作目录和暂存区的修改,让你可以切换到干净的工作状态,稍后再恢复这些修改。

我们经常遇到这样的情况:正在开发一个功能,突然需要紧急修复一个bug,但是当前的工作还没有完成,不想提交。这时,git stash就派上用场了。

git stash 命令可以将当前的工作区内容保存到一个栈中,然后恢复到一个干净的工作区。之后可以在适当的时候再恢复之前保存的工作进度。

基本用法:

  1. 保存当前工作区(和暂存区)的修改
    git stash [save "说明信息"] # 如果不加说明,默认会使用最近的提交信息作为说明

    注意:默认情况下,git stash只会存储已跟踪文件的修改(即之前已经被git管理的文件)。如果要包括未跟踪的文件,可以使用git stash -u(包括未跟踪文件)或git stash -a(包括所有文件,包括忽略的文件)。

  2. 查看存储的列表
    git stash list

  3. 恢复存储的工作进度
    git stash apply [stash@{n}] # 如果不指定存储,默认恢复最近的一次(即stash@{0})

    注意:apply恢复后,存储的内容仍然在栈中。

    也可以使用git stash pop来恢复并同时将存储从栈中移除。

  4. 删除存储
    git stash drop [stash@{n}] # 删除指定的存储,如果不指定,默认删除最近的一次

  5. 清除所有存储
    git stash clear

  6. 查看某个存储的详细内容
    git stash show [stash@{n}] # 显示简略信息
    git stash show -p [stash@{n}] # 显示详细差异(相当于git show)

  7. 从存储创建分支

    如果恢复存储时发生冲突,或者你想在恢复存储的同时开始一个新的分支,你可以使用:
    git stash branch <分支名> [stash@{n}]

  8. 注意:git stash 也可以多次存储,每次存储都会压栈,最新的一次在最上面。

3.5.1.1 典型开发场景
ssh 复制代码
# 1. 正在开发新功能
git checkout feature/user-profile
# ... 编写代码 ...

# 2. 突然需要修复紧急bug
git status # 看到未提交的修改

# 3. 暂存当前工作
git stash push -m "用户资料页面开发中"

# 4. 切换分支修复bug
git checkout main
git checkout -b hotfix/urgent-bug
# ... 修复bug ...
git add .
git commit -m "修复紧急bug"
git checkout main
git merge hotfix/urgent-bug

# 5. 回到功能分支恢复工作
git checkout feature/user-profile
git stash pop

3.5.2 修复bug时使用的方法

3.5.2.1 法一(不推荐)

master 直接合并 dev2

由于 master 一般是真实的生产环境,直接在 master 进行合并,如果合并后的代码有问题,可能会导致严重的事故。

3.5.2.2 法二(推荐)

第一步:

第二步:

完成后记得删除无用分支~

3.6 强制删除分支

ssh 复制代码
git branch -D 分支名

4 远程操作

4.1 克隆远程仓库

ssh 复制代码
git clone 远程仓库地址

不能在已经是仓库的目录下再次克隆,因为会冲突。


查看远程仓库的名称

ssh 复制代码
git remote

查看更详细的仓库信息

ssh 复制代码
git remote -v
  • (fetch) :表示你有从该远程仓库拉取(下载) 代码的权限
  • (push) :表示你有向该远程仓库推送(上传) 代码的权限

4.1.1 使用 HTTPS

ssh 复制代码
git clone 你的HTTPS地址

4.1.2 使用 SSH

创建 SSH Key,检查在用户的主目录下有没有 .ssh 目录,如果有,检查一下该目录下有没有 id_rsaid_rsa.pub 这两个文件,如果已经有了,可以直接跳到下一步。如果没有,则需要创建 SSH Key:

进入用户的主目录:

ssh 复制代码
cd ~

.ssh 目录中可能有的文件:

  • id_rsa:私钥(必须保密)
  • id_rsa.pub:公钥(可以共享)
  • known_hosts:已知主机列表
  • config:SSH 配置

ssh 复制代码
ssh-keygen -t rsa -C "邮箱"
  • 这个邮箱必须要与远程仓库git中配置的邮箱要保持一致
  • 输入完成后一路回车

之后去 .ssh 目录下查看公钥:

ssh 复制代码
cat id_rsa.pub

把公钥复制下来,保存到远程仓库中

你的本地仓库的git的name 也要配置成远程仓库的name

ssh 复制代码
git config --global user.name "用户名"

4.2 向远程仓库推送

ssh 复制代码
git push origin master:master
  • origin 指定是你要往哪里进行推送

  • 第一个 master 指的是你本地仓库中的分支名称

  • 第二个 master 指的是你远程仓库中的分支名称

  • 如果你要推送的本地分支名称与远程的分支名称相同,你可以只写一个

    ssh 复制代码
    git push origin master

4.3 拉取远程仓库

ssh 复制代码
git pull origin master:master
  • origin 指定是你要往哪里进行推送
  • 第一个 master 指的是你本地仓库中的分支名称
  • 第二个 master 指的是你远程仓库中的分支名称
  • 如果你要推送的本地分支名称与远程的分支名称相同,你可以只写一个

或者为了避免每次都指定远程分支,可以设置上游分支更推荐):

ssh 复制代码
# 设置当前分支的上游分支
git branch --set-upstream-to=origin/master

# 或者推送时自动设置
git push -u origin master

# 设置后就可以直接使用
git push
git pull

pull 这个命令实际上做了两个工作:

  1. 拉取远端的代码
  2. 将远端的代码合并到当前分支

4.4 查看 / 绑定远程仓库分支

查看远程仓库中的分支

ssh 复制代码
git branch -r

查看本地分支和远程分支

ssh 复制代码
git branch -a

将本地分支与远程分支进行绑定

ssh 复制代码
git branch --set-upstream-to=origin/远程分支名 本地分支名

新建分支并将本地分支与远程分支进行绑定

ssh 复制代码
git checkout -b 本地分支名 origin/远程分支名

查看本地分支的绑定情况

ssh 复制代码
git branch -vv

4.5 在远程仓库创建分支

4.5.1 远程创建分支(推荐)

这样创建出来的分支可以保证新创建的分支的代码是最新的。

4.5.2 本地创建分支(不推荐)

不推荐在本地创建分支,原因:本地的 master 分支不一定是最新的!!!如果真的要在本地创建分支,需要做更多的操作,比如 git pull 等等

由于远程仓库没有新创建的分支,所以我们不能直接使用 git pull,但是我们可以使用下面的命令来新建远程分支并且推送修改:

ssh 复制代码
git push origin 分支名

4.6 忽略特殊文件

有一些文件我们不想让 Git 给我们提交到远程仓库,我们可以新建一个 .gitignore 文件,把要忽略的文件名写进去,Git 就会忽略这些文件。

如果 git 忽略了你想要提交的文件,而你想要提交,有两种做法:

ssh 复制代码
git add -f 文件名
  1. .gitignore 文件中添加 !文件名

查看文件为什么被忽略提交:

ssh 复制代码
git check-ignore  -v 文件名

4.7 配置命令别名

ssh 复制代码
git config [--global] alias.别名 '要起别名的命令'

起好别名后,调用:

ssh 复制代码
git 别名

5 标签管理

5.1 操作标签

新增标签

ssh 复制代码
git tag 标签名  [commitId]
ssh 复制代码
git tag -a 标签名 -m "标签的注释" [commitId]

查看有哪些标签

ssh 复制代码
git tag

查看标签的详情

ssh 复制代码
git show 标签名

向远程仓库推送标签

ssh 复制代码
git push origin 标签名

推送全部标签

ssh 复制代码
git push origin --tags

删除标签

删除本地的标签

ssh 复制代码
git tag -d 标签名

删除远程标签

ssh 复制代码
git push origin :标签名

6 多人协作

6.1 多人在同一分支下进行开发(不常见)

6.1.1 解决冲突

多人在同一分支下进行开发,大概率在会遇到以下情况:

解决方法 Git 已经告诉我们了

  1. 使用 git pull
  2. 手动解决冲突
  3. 解决后重新进行推送

6.1.2 将内容合并进 master

6.1.2.1 PR(推荐)

别忘了将 dev 分支的修改 push 到远程仓库中。

创建 Pull Request,申请合并分支

PR 通过审查员的审查后,就会合并。

6.1.2.2 本地(不推荐)
  1. master:pull
  2. dev:merge master (有冲突在 dev 分支进行解决)
  3. master:merge dev

6.2 在不同分支下进行开发

条件:在不同分支下进行开发,并且各自让某一个功能私有某一个分支

比如说开发人员1在 feature-1 分支下进行开发,开发人员2在 feature-2 分支下进行开发。此时他们各自向远程仓库推送代码就不会出现冲突了。但是在之后与 master 分支进行合并时,可能会需要处理冲突。

6.2.1 切换分支开发

场景:你在 feature-1 上进行开发,你的同事在 feature-2 上进行开发。可是你的同事生病了,现在需要你来开发 feature-2。

解决:

  1. 在你的电脑上新增 feature-2 分支,并与远程仓库的 feature-2 建立连接
    你的电脑:
  2. 在你的电脑上进行开发
    你的电脑:
  3. 现在你的同事病好了,他要继续开发 feature-2。
    同事的电脑:

6.3 将内容合并进 master

参考 6.1.2.1 小结

6.4 解决 git branch -a 打印已被删除的远程分支

展示远程分支的情况:

ssh 复制代码
git remote show origin

解决 git branch -a 打印已被删除的远程分支

ssh 复制代码
git remote prune origin

7 文章末尾定位

相关推荐
MeowKnight9583 小时前
【C】占位符知识点总结
1024程序员节
奋斗的牛马3 小时前
FPGA—ZYNQ学习Debug(三)
学习·fpga开发
春日见3 小时前
“package.xml”和“CMakeLists.txt”配置
1024程序员节
qq_401700414 小时前
matlab学习
学习·算法·matlab
hd51cc4 小时前
C++ 类的学习(四) 继承
开发语言·c++·学习
Felven4 小时前
统信系统下设置RTC时间
linux·rtc·1024程序员节
程序猿阿伟4 小时前
《3D端游开放世界动态天气系统与场景交互优化实践日志》
3d·1024程序员节
#麻辣小龙虾#4 小时前
基于transform的scale属性,实现数据可视化大屏自适应缩放适配不同分辨率
1024程序员节