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 版本号

可以随时穿梭版本,这个时候文件穿梭到了相应的版本

分支

可以理解为是一个副本,分支可以理解为指针的引用

可以在主分支上拉取多个分支,在支线分支上进行一些修改之类的工作,等到修改结束后,可以再合并到主分支

一个例子

image-20220409215833626

好处:可以进行多个功能的共同开发,提高开发效率

各个分支再开发过程中,如果有一个分支开发失败,不会对其他分支有任何影响

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.


念念不忘,必有回响。