Git
从今天开始,正式的步入Git的世界...
分布式版本控制工具
版本控制:可以记录文件内容变化、记录文件历史记录
集中式版本控制工具:
- 例如
SVN
- 有一个单一的集中管理服务器,保存着所有文件的修订版本
- 如果集中服务器故障,那么在故障的时间内,都无法提交更新
分布式版本控制工具:
- 每个客户端都是一个服务器
- 存在一个远程库
- 版本控制是在本地进行的,每个客户端都保存着完整的项目
开发者和Linux
的最初的开发者是同一人
工作机制
分为:
- 本地库,用来存储历史版本,只有暂存区中的代码存储到本地库时才会产生历史版本,无法删除历史版本
- 暂存区,添加到暂存区的代码,临时存储的代码
- 工作区,代码存放在磁盘的位置
代码托管中心
基于网络服务器的远程代码仓库,通常也被称为远程库
可以将本地库的代码推送到远程仓库
常用命令
设置用户签名,只需要设置一次
git config --global user.name 用户名
git config --global user.email 邮箱
设置好后,将会在C:\Users\当前用户
文件夹下生成一个.gitconfig
文件,这个文件中保存着具体的配置信息
用户签名和用来登录其他远程仓库(例如Github
)的账号没有关系
初始化本地库
git init
查看状态
git status
- 第一行给出目前所在分支
On branch master
尝试新增一个文件,再执行git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
1.txt
nothing added to commit but untracked files present (use "git add" to track)
这个时候给出的提示内容如以上所示,大致意思是发现了一个没有被git
追踪的文件
追踪文件
git add 文件名
再次查看状态时,给出的状态信息为:
PS D:\git文件\git> git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: 1.txt
这个时候的文件是存放于暂存区中
如果这个时候修改了文件的内容,并且再执行git status
时,输出内容为:
PS D:\git文件\git> git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: 1.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: 1.txt
从暂存区中删除文件
仅能够删除添加到暂存区之后没有进行修改过的文件
git rm --cached 文件名
将暂存区中的文件提交到本地库
git commit -m "日志信息" 文件名
也可以不写文件名,如果不写,将会提交所有暂存区中的文件
查看引用日志信息
git reflog
输出信息类似于
1bdbcda (HEAD -> master) HEAD@{0}: commit: 提交
7f489eb HEAD@{1}: commit (initial): 第一次提交
最左侧为版本号,HEAD ->
代表目前指针指向的位置
查看详细日志
git log
输出内容类似于
commit 1bdbcda2104816bca28a549eea7437dc6f0b5373 (HEAD -> master)
Author: moyok <songxiaoxu2002@gmail.com>
Date: Sat Apr 9 18:40:05 2022 +0800
提交
commit 7f489eb10e6918bd3ae0262be6a68a0651449d68
Author: moyok <songxiaoxu2002@gmail.com>
Date: Sat Apr 9 18:37:17 2022 +0800
第一次提交
其中包括完整版的版本号
版本穿梭
git reset --hard 版本号
可以随时穿梭版本,这个时候文件穿梭到了相应的版本
分支
可以理解为是一个副本,分支可以理解为指针的引用
可以在主分支上拉取多个分支,在支线分支上进行一些修改之类的工作,等到修改结束后,可以再合并到主分支
一个例子
好处:可以进行多个功能的共同开发,提高开发效率
各个分支再开发过程中,如果有一个分支开发失败,不会对其他分支有任何影响
branch中文为分支,读音为bræntʃ
命令
创建分支之前,首先确保当前至少有一个版本
查看分支版本
git branch -v
输出信息类似于
PS D:\git文件\git> git branch -v
* master 67fd1e4 首次提交
分支1 67fd1e4 首次提交
*
代表当前使用的分支
创建分支
git branch 分支名称
切换分支
git checkout 分支名
PS D:\git文件\git> git checkout 分支1
Switched to branch '分支1'
PS D:\git文件\git> git branch -v
checkout 67fd1e4 首次提交
master 67fd1e4 首次提交
* 分支1 67fd1e4 首次提交
删除分支
git branch -d 分支名称
合并分支
git merge 分支名称
会将指定的分支合并到当前分支
合并冲突
可能合并的时候会出现冲突
具体表现为:两个分支,在同一个文件的同一个位置有两个不同的修改,从而导致了git
无法决定使用哪一个,必须要人为的指定合并后的新代码的内容
合并冲突的一个输出内容
PS D:\git文件\git> git merge 分支1
Auto-merging 2.txt
CONFLICT (content): Merge conflict in 2.txt
Automatic merge failed; fix conflicts and then commit the result.
这个时候查看git
状态时的内容:
PS D:\git文件\git> git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: 2.txt
no changes added to commit (use "git add" and/or "git commit -a")
也就是第9
行给出了提示,都修改了2.txt
这个时候,打开文件,会发现文件冲突的地方变成了
<<<<<<< HEAD
第一个分支的冲突内容
=======
第二个分支的冲突内容
>>>>>>> 分支1
这个时候需要手动的打开文件,将不需要的内容给去掉,包括<<<<<
和===
再执行
git add 冲突文件名
# 因为文件中有冲突的内容,所以在提交的时候不能指定文件进行提交,只能全部提交
git commit -m 消息日志
如果这个时候指定文件名进行提交,会报错
PS D:\git文件\git> git add 2.txt
PS D:\git文件\git> git commit -m "合并冲突" 2.txt
fatal: cannot do a partial commit during a merge.
底层仍是历史记录指针
协作
协作需要一个远程库/代码托管中心
分为团队内协作和跨团队协作
- 团队内:
- 将本地库
push
到代码托管中心/远程库中 - 需要协作的人可以将其
clone
到本地- 修改后可以再次
push
到远程库中
- 修改后可以再次
- 可以通过
pull
更新本地库中的代码
- 将本地库
- 跨团队:
- 将代码
fork
到自己的远程库里边 - 可以
clone
到本地 push
到自己的远程库里pull request
到其他团队的库,拉取请求,另个团队需要审核- 审核通过后,可以合并
merge
- 将代码
搭配Github
需要在Github
中创建一个仓库
别名
每个github
仓库的链接比较长,可以为其创建别名
本地别名查看:
git remote -v
创建别名:
git remote add 链接
创建的别名在查看时,一般一个别名会有两个
PS D:\git文件\git> git remote -v
learn https://github.com/coolerks/learn.git (fetch)
learn https://github.com/coolerks/learn.git (push)
一个代表拉取的,一个代表推送的
推送到远程仓库
git push 别名/链接 分支名
将远程库更新到本地
当远程库中的内容被本地库新时,可以将远程库拉取到本地库
git pull 别名/链接 分支名
拉取到本地库时,将会自动的提交更改
克隆远程代码到本地
git clone 链接
此时会将这个远程仓库的链接自动的取别名,别名为origin
Q.E.D.