Bootstrap

git常用命令

黑马程序员视频地址:

Git-01.初识_哔哩哔哩_bilibili

部分标题前有数字,代表学习顺序 

安装

下载地址:

Git-2.39.2-64-bit-windows版本.zip

git-2.15.0-intel-universal-mavericks-mac版本.zip

安装时除路径外全都默认下一步即可 


配置

❶查看版本号

1.打开bash终端(git专用)

2.输入命令:git -v


❷配置用户信息

配置用户名和邮箱,每次提交时交代自己的身份

如果不同仓库需要设置不同用户昵称与邮箱,可以去掉--global,只配置当前文件

#配置用户名
git config --global user.name "用户昵称"

#配置邮箱
git config --global user.email "用户邮箱"

配置完成可以输入以下命令查看配置列表

git config --list

提示:

1.不能完全显示内容,可以按回车键显示下一行,直到显示END

2.显示END之后,可以按Q键退出 


❸新建仓库

1.在本地文件夹中创建仓库(创建仓库会在该文件夹下产生一个名为.git的隐藏文件夹)

git init

2.下载别人的仓库


 ⓭忽略文件

让git忽略配置的文件

在项目根目录下创建".gitignore"文件,将相忽略的文件夹名称或文件名称输入进去即可

*是通配符:匹配任意字符

该文件需要一起上传

# 忽略 npm 下载的第三方包
node_modules
# 忽略分发文件夹
dist
# 忽略 VSCode 配置文件
.vscode
# 忽略秘钥文件
*.pem
*.cer
# 忽略日志文件
*.log


概念 

❹git的三个区域

工作区:实际开发时操作的文件夹

暂存区:保存之前的准备区域(暂存改动过的文件)

版本库:提交并保存暂存区中的内容,产生一个版本快照


 ❽文件状态

文件状态概念场景
未跟踪(U)从未被 Git 管理过新文件
新添加(A)第一次被 Git 暂存之前版本记录无此文件
未修改("")三个区域统一(提交到版本库后)提交保存后
已修改(M)工作区内容变化修改了内容产生

查看文件状态

结果:第一列是在暂存区的状态,第二列是在工作区的状态

#加上-s看简略信息,去掉则查看详细信息
git status -s

使用

新增

❺移入暂存区

将工作区内容放到暂存区

目标文件均指相对于(存放仓库的)项目首页的相对路径

#暂存指定文件
git add 目标文件

#暂存所有改动的文件
git add .

❻查看暂存区

查看当前项目暂存区内容 

内容过多显示不全时可以按回车键继续显示,也可以直接按Q键退出

git ls-files

 ❼移入版本库

将暂存区保存到版本库中

git commit -m "注释说明"

覆盖 

❾覆盖工作区

暂存区文件覆盖工作区文件

注意:完全确认覆盖时使用

git restore 目标文件

❿移除暂存区

从暂存区移除文件

git rm --cached 目标文件

 全部移除

git rm --cached -r .

版本库 

⓫查看版本库

查看已经提交到版本库的内容

#基于当前版本库查看以提交的版本库(去掉 --oneline可以查看详细信息)
git log --oneline

#查看所有时间段的版本库
git reflog --oneline

 ⓬回退版本

回退版本

git 是通过从右向左依次映射的工作方式来删除内容,

例如:使用暂存区的内容比对工作区的内容进行删除

如果:先使用第三个模式删除了暂存区的内容,再使用第二个模式会无法删除工作区的内容

#工作区与暂存区中比选中的版本多的内容不会被清除,会被转化为未跟踪状态(U)
git reset --soft 版本号

#工作区与暂存区原本的内容会被完全替换成选中的版本
git reset --hard 版本号    (一般选择这个)

#工作区与第一种一样(多余保留),暂存区与第二种模式一样(完全替换)
# --mixed 写不写一样效果
git reset --mixed 版本号

分支

⓮创建与切换

git中有一个默认指针:master(可能有其他名字)和一个HEAD指针

master指针所在路为主分支,master永远指向最近一次保存的主线内容

HEAD指针所指向的版本会显示在工作区与暂存区

创建分支相当于创建支路,不会影响主分支master

创建与切换指针命令

#创建分支
git branch 分支名

#切换分支
git checkout 分支名

#查看本地分支
git branch

#创建并立即切换分支
git checkout -b 分支名

⓯合并与删除

步骤:

1.切回要合并的分支上

2.合并其他分支过来

3.删除合并后的分支指针

#在当前分支下合并指定分支
git merge 指定分支

#删除合并后的分支指针(在任意分支下都能进行)
git branch -d 指定分支

如果此时再合并分支content,则会按照产生的先后顺序排列(而不是合并的先后),合并之后,会再比较content最新版本与主分支最新版本的差异并合并成一个新的版本 


⓰合并冲突

原因:不同分支中,对同一个文件的同一部分修改,Git 无法干净的合并,产生合并冲突

VSCode会让你做出选择 

选择后需要重新提交到版本库 


远程仓库

推送及删除 

1.注册第三方托管平台账号,如gitee、github等

2.创建一个远程仓库,并复制远程仓库git地址

3.在本地git仓库添加远程仓库原点地址

#添加远程仓库(可添加多个,一般只添加一个)
git remote add 远程仓库别名 远程仓库地址

#删除已添加的远程仓库
git remote remove 远程仓库别名

#查看远程仓库地址
git remote -v

注意:使用git remote add 时,需要先新建一个仓库/克隆仓库 

4.推送本地仓库版本记录到远程仓库

#如果本地分支名与远程分支名一样,可以省略一个
git push -u 远程仓库别名 本地分支名:远程分支名

#建立通道后可以简写git push
#-u 是 --set-upstream 的缩写。
#当你执行 git push -u 远程仓库别名 本地分支名:远程分支名 时,
#它不仅会将本地分支的内容推送到指定的远程分支,
#还会为本地分支设置上游分支。
#上游分支可以理解为本地分支在远程仓库中对应的分支,Git 会记住这种关联关系。

5.第一次推送会让你输入账号密码,如果要切换账号,可以按照下图操作进行删除

注意:gicode平台需要输入令牌而非密码


克隆 

克隆远程仓库到本地

会在执行命令的文件夹下再生产一个与远程仓库名同名的文件夹

git clone 远程仓库地址

拉取 

拉取

多人开发,别人更新远程仓库,本地已有该仓库的成员可以通过拉取获取最新版本

#该命令等价于:git fetch 和git merge
git pull 远程仓库别名 远程分支名:本地分支名

#合并没有关系的记录?
git pull --rebase 远程仓库别名 分支名

在从远程仓库拉取本地没有的文件后,是否需要再次提交到本地版本库,取决于拉取操作(git pull)的结果

 情况一:拉取过程中没有发生冲突

当执行 git pull 命令时,如果远程仓库的更新与本地代码没有冲突,Git 会自动完成合并操作,将远程的更新合并到本地分支,并且更新本地的提交历史。此时,本地仓库已经包含了最新的代码状态,你可以直接执行 git push 命令将本地代码推送到远程仓库,而无需再次手动提交

情况二:拉取过程中发生冲突

若在 git pull 过程中出现冲突,意味着远程仓库和本地仓库的修改存在矛盾,Git 无法自动完成合并,需要你手动解决冲突 


 CR、LF问题

以下回答来自AI 

报错: 

$ git add .
warning: in the working copy of 'package-lock.json', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'package.json', LF will be replaced by CRLF the next time Git touches it

原因:

出现的这些警告信息表明 Git 检测到工作副本中的 package-lock.json 和 package.json 文件使用的是 LF(Unix/Linux 换行符),而在 Git 后续处理这些文件时,会将换行符替换为 CRLF(Windows 换行符) 

机理:

core.autocrlf 值为true时,git会在提交时将所有文件的crlf转化成lf,再读取时又会将所有的lf转化成crlf,导致上述两个文件里的lf被转成crlf

解决方案

1.将core.autocrlf值改成false:直接不进行转换

2.添加.gitattributes文件,在里面设置指定的格式(可部分设置,也可以全部设置)

注意:第二章方法与第一种方法的配置冲突时,会优先执行第二种,即第二种的优先级高

 方法二:配置.gitattributes文件:

代码1:

package-lock.json text eol=lf
package.json text eol=lf

上述配置的含义是:

package-lock.json 和 package.json 被指定为文本文件(text)。

eol=lf 明确表示这些文件在提交和检出时都使用 LF 行尾符。无论 core.autocrlf 的配置如何,Git 都会遵循 .gitattributes 文件中的规则来处理这两个文件的行尾符

代码2:全部禁止转换(与方法一作用相同,但优先级高)

# 对所有文件禁用行尾符转换
* -text

代码详细解释

1.代码: package-lock.json text eol=lf

*

含义:这是一个通配符,表示匹配项目中的所有文件。也就是说,这条规则会应用到项目里的每一个文件上。

示例:无论文件是 .js、.css、.txt 还是其他类型,只要在当前项目仓库中,都会受到该规则的影响。


text=auto

含义:text=auto 让 Git 自动判断文件是否为文本文件。Git 会根据文件的内容特征来进行判断,例如,如果文件包含大量可打印的 ASCII 字符,且没有出现一些二进制文件特有的控制字符模式,Git 就会将其识别为文本文件;反之,则判定为二进制文件。

作用:只有当 Git 把文件识别为文本文件时,后续的 eol 规则才会生效。对于被判定为二进制文件的,Git 不会对其行尾符进行处理。


 eol=lf

含义:eol 是 “End of Line” 的缩写,即行尾符的意思。eol=lf 明确指定了文本文件的行尾符使用 LF(换行符,\n)。

作用:当 Git 依据 text=auto 判断文件为文本文件后,在提交和检出文件时,会确保该文件使用 LF 作为行尾符。如果文件原本使用的是 CRLF(回车换行符,\r\n),提交时会将其转换为 LF 存储到版本库中;检出时,也会保证文件以 LF 行尾符存在于工作目录。


综合示例

假设项目中有一个 script.js 文件,其行尾符原本是 CRLF。当 .gitattributes 文件中有 * text=auto eol=lf 规则时:

提交时:Git 会根据 text=auto 判定 script.js 为文本文件,然后将文件中的 CRLF 行尾符转换为 LF 后再存储到版本库。

检出时:从版本库检出 script.js 文件到工作目录时,文件会保持 LF 行尾符。

这条规则通常用于确保项目中的所有文本文件统一使用 LF 行尾符,避免因不同操作系统默认行尾符不同而产生的问题,方便跨平台协作开发


2.代码:* -text

-text

text 在 Git 里用于标识文件是否作为文本文件处理。而 -text 前面的 - 是一个否定符号,-text 的意思是告诉 Git 不要把这些文件当作文本文件处理,而是将它们视为二进制文件。                             


行尾符处理

Git 对于文本文件和二进制文件的行尾符处理方式不同。当文件被标记为文本文件时,Git 会根据 core.autocrlf 配置或者 .gitattributes 文件中其他关于行尾符的规则(如 eol=lf 或 eol=crlf)对文件的行尾符进行转换。但当使用 * -text 规则后,Git 会把所有文件都当作二进制文件,从而不会对文件的行尾符进行任何转换操作,文件会保留其原始的行尾符格式。

例如,你有一个项目,里面的 code.js 文件原本使用的是 CRLF 行尾符,使用 * -text 规则后,无论你是提交这个文件到版本库,还是从版本库检出该文件到本地工作目录,code.js 文件的行尾符都会保持为 CRLF 不变。

避免不必要的差异

在跨平台开发时,不同操作系统默认的行尾符不同(Windows 是 CRLF,Unix/Linux 和 macOS 是 LF),如果不统一处理行尾符,可能会导致每次提交代码时出现大量因行尾符转换引起的文件差异,使版本控制记录变得混乱。使用 * -text 规则可以避免这种情况,因为它让 Git 不进行行尾符转换,从而减少了因行尾符不同而产生的不必要差异。

与其他规则的对比

和 * text=auto eol=lf 规则相比,* text=auto eol=lf 是让 Git 先自动判断文件是否为文本文件,对于判定为文本文件的,会统一将行尾符转换为 LF;而 * -text 是直接让 Git 把所有文件都当作二进制文件,不进行行尾符的转换,更强调保留文件原始的行尾符状态。

;