Git 基本使用
Git 安装
具体版本根据自己计算机 32 或者 64 位为准

Git 常用命令
常用 GIt 命令
| 命令 | 作用 | 示例 |
|---|---|---|
git config --global user.name "用户名" | 设置全局的用户名,用于标识你在 Git 中的身份 | git config --global user.name "张三" |
git config --global user.email "邮箱" | 设置全局的电子邮件地址,用于标识你的身份。 | git config --global user.email "zhangsan@example.com" |
git init | 初始化一个新的 Git 仓库。 | 在一个新文件夹中运行 git init 来创建一个本地仓库。 |
git status | 显示工作目录的状态,包括哪些文件被修改但尚未提交。 | 在仓库中运行 git status 查看有哪些文件需要提交。 |
git add 文件名 | 将文件添加到暂存区,准备提交 | git add README.md 把 README.md 文件添加到暂存区。 |
git commit -m "日志信息" 文件名 | 将暂存区的更改提交到仓库,并附带一条提交消息。 | git commit -m "添加了 README 文件" 提交暂存区的更改,并加上说明。 |
git reflog | 显示历史记录,包括每一个提交的哈希值和操作。 | 运行 git reflog 查看所有的历史操作。 |
git reset --hard 版本号 | 将仓库重置到指定的版本。 | git reset --hard 98c7f4e 将仓库重置到哈希值为 98c7f4e 的提交。 |
设置用户签名
▼text复制代码git config --global user.name 用户名 git config --global user.email 邮箱
注意点: **签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看 到,以此确认本次提交是谁做的。Git首次安装必须设置一下用户签名,否则无法提交代码。 **
如何查看自己签名是否设置成功?
打开 git Bash,查看当前用户——我这里是 ASUS

在计算机 C 盘找到这个位置


我刚刚设置的就有了

初始化本地库
▼text复制代码git init
创建一个空的文件夹

右键打开 Git,输入指令

没看见可能是隐藏了

查看本地库状态
▼text复制代码git status
默认分支系统自动会设置为 master


随便新建个文件,并随便添加写东西,模拟写好的代码

这里显示了有未追踪的文件,需要 git add 把它从工作区添加至暂存区
添加至暂存区

▼text复制代码git add 文件名
LF 转换成 CRLF 是安装 Git 时默认的,这里知道即可

继续查看本地库状态,文件现在放在了在暂存中的文件
提示的 git rm --cache + 文件 可以删掉在暂存区的文件
但文件始终都在工作区保存着的,只是删掉了暂存区里的文件而已

提交本地库
文件添加到暂存区,那么下一步就可以提交到本地库了,从而做到版本控制
▼text复制代码git commit -m "日志信息" 文件名

再次查看本地库,会发现 no commit yet 没有了,因为刚才已经 commit 提交一次了

这是可以查看版本信息
git log: 用于查看仓库的历史提交记录。
git reflog: 用于查看引用(如分支、标签和 HEAD)的变动历史,常用于恢复丢失的提交。

修改命令
情景模拟,如果此时对 helloworld.txt 文件内容进行修改,再进行查询本地库状态
这是因为修改过代码但是又没有 add 添加导致的


此时再次执行 add 命令即可

再次版本提交 commit 提交至本地库,就有了第二个版本

当前“指针”也是指向第二个版本

历史版本切换
▼text复制代码git reset --hard 版本号
git log: 用于查看仓库的历史提交记录。
git reflog: 用于查看引用(如分支、标签和 HEAD)的变动历史,常用于恢复丢失的提交。
可以理解成 log 为详细版,reflog 为精简版

这里的版本号就是 git log 和 git reflog 是生成的一长串字符
只是说,reflog 只显示前 7 位,log 显示的是全部

情景模拟,下面这是第二个版本的,我要切换成第一个版本回去看看
执行 reset 命令,reflog 查询的“指针”就会移动到原先的第一个


查看文件,已经回到了最开始写的样子(没有了第二次添加的 Java 字样)

Git 分支操作
公司里服务器运行模式

分支概述
举个例子:
想象你正在写一本书,这本书有一个主稿本(这相当于你的主分支,通常叫做 main 或 master)。每次你想添加新章节或修改现有内容时,你可以直接在主稿本上做这些更改。但是,如果直接在主稿本上修改,一旦出现错误或者需要撤销某些更改,可能会非常麻烦。
为了避免这种情况,在版本控制系统中,当你要开始一个新的功能或修复一个 bug 时,你可以从主分支创建一个“副本”,这个副本就称为“分支”。
在这个副本上,你可以自由地进行更改而不会影响到主分支上的代码。
一个简单的步骤说明:

- 从主分支创建分支
- 假设主分支是
main,你可以创建一个名为feature-1的分支来开发新功能。 - 这个
feature-1分支就像是main分支的一个快照,你在feature-1上所做的任何更改都不会立即影响到main分支。
- 假设主分支是
- 在分支上工作
- 在
feature-1分支上编写代码、测试并调试,直到新功能完成且稳定。
- 在
- 合并分支到主分支
- 当你对
feature-1分支满意后,你可以将其合并回main分支。这意味着将feature-1分支中的所有更改应用到main分支上。
- 当你对
- 删除分支(可选)
- 如果不再需要
feature-1分支,你可以将其删除以保持仓库的整洁。
- 如果不再需要
常用分支命令
| 命令 | 作用 | 示例 | 说明 |
|---|---|---|---|
git branch 分支名 | 创建一个新的分支。 | 如果你想创建一个名为 feature-login 的新分支,你可以输入 git branch feature-login。 | 这个命令会创建一个新分支,但它不会自动切换到这个新分支。你需要使用 git checkout 命令来切换到新创建的分支。 |
#### git branch -v | |||
| 列出所有本地分支及其最近的一次提交的信息。 | 输入 git branch -v 将列出所有分支及每个分支的最新提交。 | 当前所在的分支会被标记出来,通常会用星号 (*) 或者颜色突出显示。 | |
#### git checkout 分支名 | |||
| 切换到指定的分支。 | 如果你想切换到 feature-login 分支,你可以输入 git checkout feature-login。 | 这个命令会将你的工作目录切换到指定的分支,并更新文件到该分支的最新状态。 | |
#### git merge 分支名 | |||
| 把指定的分支合并到当前分支。 | 如果你想将 feature-login 分支合并到当前分支 main,你应该先确保你已经切换到了 main 分支,然后输入 git merge feature-login。 | 这个命令会尝试将 feature-login 分支的所有更改合并到当前分支。如果在这个过程中有任何冲突,Git 会提示你解决这些冲突。 |
查看创建切换分支
列出所有本地分支及其最近的一次提交的信息。
▼text复制代码git branch -v

假设你想要添加一个新功能,并将其合并到主分支中 创建并切换到新分支:
▼text复制代码git checkout -b feature-login
**git checkout**: 这个命令通常用于切换分支。**-b**: 这是一个选项,告诉 Git 在切换分支之前先创建一个新的分支。**feature-login**: 这是你想要创建的新分支的名字。
这条命令结合了 git branch 和 git checkout,创建并立即切换到新分支。
当然也可以分步骤来
▼text复制代码git branch feature-login
▼text复制代码git checkout feature-login
现在就选择到了新创建的 feature-login 分支中,并对该分支的文件进行操作

开始在新分支上工作:
编辑文件,添加新功能(假设)。

使用 git add . 添加文件到暂存区。
使用 git commit -m "Add login feature" 提交更改。
这样就完成了查看、创建、切换分支操作

合并分支(正常合并)
▼text复制代码git merge 分支名
如果你想将 feature-login 分支合并到当前分支 main,你应该先确保你已经切换到了 main 分支,然后输入 git merge feature-login。


▼text复制代码cat 文件名
查看当前文件内容,和之前副分支(feature-login)上的对比

这就是一个正常的合并,并没有产生代码的冲突 因为这是 master 分支没有任何修改,只是在 feature-login 分支上修改并合并的 不会产生冲突合并
合并分支(冲突合并)
产生冲突的原因
- 两个分支上的不同修改
- 假设你有两个分支:
main和feature-login。 - 在
main分支上,你可能修改了一个文件中的某一行。 - 在
feature-login分支上,你可能也修改了同一个文件中的同一行,但修改的内容不同。
- 假设你有两个分支:
- Git 无法自动合并
- 当你尝试将
feature-login分支合并到main分支时,Git 发现两个分支对同一个文件的同一行有不同的修改。 - Git 无法自动确定应该保留哪个版本的修改,因为这两种修改可能是互斥的。
- 因此,Git 会停止合并过程,并标记出冲突的地方。
- 当你尝试将
如何解决冲突
- 识别冲突
- Git 会在命令行中告诉你哪些文件发生了冲突,并且在这些文件中插入特殊的冲突标记。
- 冲突标记通常包括三个部分:
<<<<<<< HEAD、=======和>>>>>>> other-branch-name。 <<<<<<< HEAD标记冲突开始,表示当前分支(通常是你要合并到的目标分支)的版本。=======标记冲突中间,用于分隔两个版本。>>>>>>> other-branch-name标记冲突结束,表示另一个分支的版本。
- 手动编辑文件
- 打开发生冲突的文件,找到冲突标记。
- 检查
HEAD版本和另一个分支的版本,决定保留哪一部分或如何合并这两部分。 - 删除冲突标记,并保存文件。
- 标记冲突解决
- 使用
git add <file>命令标记你已经解决了冲突。 - 对于每个解决冲突的文件,都需要执行这个命令。
- 使用
- 完成合并
- 一旦所有冲突都被解决并标记,你可以继续完成合并过程。
- 使用
git commit命令创建一个新的提交,这个提交包含了合并的结果。
示例演示
假设你有两个分支:main 和 feature-login。在 feature-login 分支上,你修改了第一行文件中内容,而在 main 分支上,你也修改了相同的位置,但内容不同。
在 master 分支倒数第二行添加内容,同时添加暂存区,并提交到本地库


切换到 feature-login 分支,也进行修改,最后一行添加 feature-login test
同时添加暂存区,并提交到本地库

回到 master 分支,尝试合并,产生冲突合并

同时分支状态也发生变化,git status 获取状态,手动合并代码

打开文件会发现 Git 已经标注好冲突的位置,产生合并冲突,Git 不知道要合并哪个分支的版本
需要自己手动解决

因为是两个分支版本的最后两行出问题的
如果我 master test 和 feature-login test 都想要的话,直接进行修改即可
像下面这样子直接修改
意思是说我合并后的最后两行想要合并成这样子,Git 给出冲突标注也要删除
记住,这里也要添加到暂存区,但 commit 提交的时候就不用带文件名了,不然 Git 就会报错
修改后也是要添加并提交的

进行添加带文件名没有什么问题

但是在 commit 提交带文件名就会报错

不带文件名 commit 提交即可,右边括号也不显示 merging 合并中了

查看文件,合并分支成功,手动解决冲突合并

注意,此时切换到 feature-login 分支,文件还是只有一行的状态
毕竟是把 feature-login 的分支合并到 master 分支去的,那 feature-login 分支也就没必要也一起合并


