[Linux] GIT

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理

版本控制最主要的功能就是追踪文件的变更
它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加。

除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。

主要功能:

  • 检入检出控制:同步控制的实质是版本的检入检出控制

    • 检入就是把软件配置项从用户的工作环境存入到软件配置库的过程,
    • 检出就是把软件配置项从软件配置库中取出的过程。
    • 检入是检出的逆过程。同步控制可用来确保由不同的人并发执行的修改不会产生混乱。
  • 分支与合并

    • 版本分支(以一个已有分支的特定版本为起点,但是独立发展的版本序列)的人工方法就是从主版本——称为主干上拷贝一份,并做上标记。在实行了版本控制后,版本的分支也是一份拷贝,这时的拷贝过程和标记动作由版本控制系统完成。
    • 版本合并(来自不同分支的两个版本合并为其中一个分支的新版本)有两种途径,一是将版本A的内容附加到版本B中;另一种是合并版本A和版本B的内容,形成新的版本C。
  • 历史记录:版本的历史记录有助于对软件配置项进行审核,有助于追踪问题的来源。历史记录包括版本号、版本修改时间、版本修改者、版本修改描述等最基本的内容,还可以有其他一些辅助性内容,比如版本的文件大小和读写属性。 如果我们开发中的新版本发现不适合用户的体验,这时候就可以找到历史记录的响应版本号,回退到历史记录版本!

配置GIT

首先需要确定版本控制人信息 以追踪变更者

  • 提交信息版本操作者信息:
git config --global user.name "Ziph" #【用户名】
git config --global user.email "mylifes1110@163.com" #【邮箱】
  • 查看信息:
git config -l

仓库

版本库又名仓库,英文名repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

  • 工作区:由我们使用命令git init初始化的一个本地文件夹,而初始化后的这个文件夹就被称为工作区

  • 暂存区:由我们使用命令git add .把文件添加到暂存区,而被添加的位置则是工作区中 .git目录中的index文件,所以这也叫做索引

  • 版本库:工作区中会有一个隐藏的.git文件夹,这个不算是工作区,而是Git的版本库,版本库中记录了我们提交过的所有版本,也就是说版本库管理着我们的所有内容

  • 分支: 版本库中包含若干分支,提交后的文件就会存储在分支中,而开始的时候版本库中只会有一个主分支master/main

在使用git来管理本地仓库时,每次对工作区中的内容做的任何变化都需要add(添加)和commit(提交)操作来同步git版本库,只有做了添加和提交操作, git才能管理我们的工作区。

创建版本库

git init

先创建或找到一个文件夹,打开命令窗口切换到该路径下,输入git init执行初始化本地工作区,在该工作区内会初始化生成一个.git目录,而该目录就是版本库,它保存着仓库的所有信息。

所有有关仓库的指令,如关联远程仓库,克隆等,都必须在已经被git init的文件夹下进行。

添加文件

git add 文件列表

先在工作区中放入一个文件,然后在命令行窗口中执行git add 文件名即可向暂存区中添加一个文件。类似的,git add 文件名1 文件名2 … 即可向暂存区中添加多个文件。

git add 文件夹名 即可向暂存区中添加该文件夹以及文件夹内的所有内容。

git add .命令添加工作区中的所有内容到暂存区。

提交文件

git commit 文件列表 -m message

使用 git commit 文件名1 文件名2 -m "本次提交的描述信息"来提交文件。
注意提交的描述信息是为了记录本次提交而方便查找,所以尽量能明确反映本次提交。

git commit . -m "本次提交的描述信息" 命令来提交所有工作区的文件文件。

使用git commit -a -m "本次添加并提交的描述信息"命令来自动添加和提交所有文件。

修补提交

提交后发现有问题,比如注释忘记修改,⽐如提交描述不够详细等等。可以执行git commit -- amend -m"描述信息"来再次提交替换上次提交选项
-m git 将 本次提交的描述信息 记录到项目的历史记录中。

对于向git提交后的文件,删除和修改我们只需要重新提交即可。也就是说,我们挪动或删除了工作区中的文件或更改了工作区中的目录结构,都需要重新向git添加和提交你所变动的文件。

文件状态

使用 git status 命令查看文件的状态 是否已提交 是否添加追踪等等

在Git中,分支是项目的版本。上图为git status 命令返回的状态:

  • 第一行表示位于分支master上。
  • 第二行Git指出了项目中未被跟踪的文件,这里还没有添加需要跟踪的文件。
  • 第三行被告知没有将任何东西添加到当前提交中,但我们可能需要将未跟踪的文件加入到仓库中。

细节: 可以使用 git diff 命令来比对工作区内文件的变动状态

比对: 使用 git diff 文件名 命令来比对工作区和暂存区(若暂存区没有则比对分支)

  • 比对工作区与分支的最新结果: 使用 git diff HEAD -- 文件名 命令来比对工作区和分支的最新结果
  • 比对暂存区与分支的最新结果: 使用 git diff --staged 文件名 命令来比对暂存区与分支的最新结果
  • 注意: git diff HEAD -- 文件名命令中--文件名之间必须要有一个空格,不要写错!

日志操作

每次提交,git都会随着提交的变动来记录版本变化,所以在工作区中的所有操作都会留下日志。

  • 查看所有提交日志: 使用 git log 命令来显示从最早的提交点到当前提交点的所有日志
  • 查看执行条数的提交日志: 使用 git log -数量 命令来显示最近指定数量条的提交日志
  • 简洁日志显示: 使用 git log --oneline 命令来显示比较简洁的提交日志
  • 图形化显示分支走向: 使用 git log --oneline --graph 命令来图形化显示分支走向

git log 命令显示的提交ID是很长的字符串,而使用git log --oneline命令来简洁显示的提交ID是一个7位的字符串
我们使用ID的时候并不需要使用很长的ID来操作,而一般使用前7位

版本回退

每次修改文件并添加和提交。git都会记录一个版本,如果有需要可以回退到之前的数据版本状态

  • 回退上一个版本: 使用 git reset --hard HEAD~ 命令来回退到上一个版本
  • 回退上上个版本: 使用 git reset --hard HEAD~~ 命令来回退到上上个版本
  • 回退到上某数量个版本: 使用 git reset --hard HEAD~数量 命令来回退到上某数量个版本
  • 回退到某次提交时的版本: 使用 git reset --hard commitID 命令来回退到某次提交时的版本

回退版本并不会删除任何版本,所以版本之间可以来回切换

撤销修改

工作区撤销: 执行 git checkout -- 文件名 命令可以撤销到最近一次 git addgit commit 的状态

工作区撤销内部流程: 你执行了工作区撤销命令,如果暂存区有此文件,则将暂存区中的文件恢复到工作区中;如果暂存区没有此文件,则将分支中的文件恢复到工作区中。

暂存区撤销
先执行 git reset HEAD 文件名 命令将该文件移除暂存区,后执行 git checkout -- 文件名 命令回退到上一个版本
暂存区撤销场景: 如果在工作区中修改了文件并发送到了暂存区中,但文件中有需要撤销的内容

分支

每一个被git管理的仓库都会有一个默认的主分支(master分支)。

分⽀中接收git commit提交的内容,为㇐个㇐个不断向前发展的提交点。每个提交点都保存了㇐个版本。每个分⽀,都有㇐个指针,指针默认指向最近㇐次提交的版本。⼯作区中的内容,初始状态,就是指针所指向的版本状态。

git在保存每个版本时( 对应提交点 ),并不是复制所有⽂件,没有改动的⽂件的话只是记录㇐个链接。

实际开发中master分⽀尽量只存放稳定的代码提交,保证master分⽀稳定,有效。因为这样保证了我们的开发进度不会受到影响。在需要编写新功能时,新建㇐个开发⽤的分⽀,所有改动都在该分⽀上提交,在功能完整实现后,将该分⽀的最终内容合并到master分⽀。这样,既保证开发中有多个版本可以控制,⼜保证master分⽀是稳定,有效的。

创建分支

使用 git branch 分支名 命令创建分支,会与当前分支保持同样的数据状态,即新分支和当前分支指向同一个提交点

切换分支

使用 git checkout 分支名命令切换分支,切换分支后工作区中显示当前分支内容(切换分支实际上是切换了分支的指针,让指针指向了所要切换到分支)

查看当前分支

使用 git branch 命令来查看当前分支

查看当前分支详细信息: 使用 git branch -vv 命令查看分支详细信息,分支信息则是所跟踪的远程分支信息以及是否领先远程分支等等

合并分支

新分支编写完成后,先使用 git branch master 命令切换到master分支
再使用 git merge 新分支名 命令将新分支合并到master分支。
此次合并就是将master的指针移到了新分支的位置,等价于快速合并

查看当前合并分支: 分支合并后可以使用 git branch --merged 命令查看被当前分⽀合并了的分⽀

删除分支

将分支合并后,如果新分支不再继续使用,可以先使用git branch --merged命令查看合并分支以确认我们即将删除的分支的确是无用分支后
再使用 git branch -d 分支名 命令删除需要删除的无用分支。

解决分支冲突

两个分支对同一个文件做了改动,所以在合并时git会无法确定保留哪个分支上的数据就会产生冲突

终止合并分支: 当出现分支冲突时可以使用git merge --abort命令来终止合并分支

避免因为空⽩导致冲突: 在合并分支时,如果有空白内容有可能会出现分支冲突现象,所以此时可以使用git merge 分支名 -Xignore-all-space 命令来避免因为空白而导致的分支冲突

远程仓库(Github)

git本地仓库和GitHub或码云之间传输,建议设置SSH key,避免在传输中反复输入密码

设置SSH key: 执行 ssh-keygen -t rsa -C 邮箱 命令后的每一步都按Enter键确定就好,知道命令执行结束(-C 后面的内容随意写就行,这只是作为title而已)

如果key创建在root下就必须以root用户才能传输 创建在哪个用户文件夹底下就哪个用户能传

命令执行完毕后,会在你电脑的C:\Users\主机名\.ssh目录下生成密钥文件。
id_rsa是私钥,不能泄露出去。id_rsa.pub是公钥,可以放⼼地告诉任何⼈。

随后注册登录GitHub,在账户设置中选择SSH Keys,在Title中随意填写内容,在Key中填写id_rsa.pub文件中的所有内容

这样就可以在GitHub中添加好自己的公钥,和Git服务器通信时(clone,push,pull)git服务器就可以识别出你的身份了!

关联远程仓库

关联远程仓库只需要执行 git remote add 关联别名 仓库地址 命令即可
注意:别名是可以自己取名设置的,但是不要忘记就好,因为后续push的时候会用到
仓库地址在code下ssh里 形如git@github.com:wjcsw/test.git

上传到GitHub远程仓库

执行 git push 关联别名 master 命令将文件上传到GitHub服务器的master分支

上传到GitHub远程仓库后,我们就可以正常的在GitHub查看所上传的文件。设置一次关联后,我们在本地仓库上传到GitHub远程仓库都需要经过 add -> commit -> push

  • 查看关联的所有远程仓库: 执行git remote -v命令查看关联的所有远程仓库
  • 查看关联后远程仓库分支和本地仓库分支的对应关系: 执行git remote show 关联别名命令查看
  • 删除关联: 执行 git remote remove 关联别名 命令删除关联
  • 重命名关联别名: 执行git remote rename 原关联别名 新关联别名命令重命名关联别名
  • 上传到GitHub远程仓库: 执行git push 关联别名 master命令来将本地仓库的文件上传到GitHub远程仓库的master分支显示(注意:我们是可以指定上传的分支的!)

本地存在分支上传GitHub分支

执行git push 关联别名 本地仓库分支:GitHub仓库分支命令会将本地仓库存在分支上传到GitHub分支

  • 拉取远程仓库分支: 执行git fetch 关联别名 master命令来拉取master分支下的内容
  • 手动合并本地库分支: 执行git merge 关联别名/master命令来手动合并本地库分支下的内容
  • 比较拉取内容中的分支和本地分支中的不同: 首先执行git checkout 分支命令来切换到想要比较并拉取的分支,再执行git diff关联别名/分支命令来比较拉取的内容中的分支和本地分支的不同

下载远程仓库内容

下载操作等价于拉取远程的新内容,并合并到当前分支的操作

下载远程内容

执行git pull 关联别名 master命令来完成对远程仓库主分支内容的下载操作,该操作省略了本地仓库分支(当前分支),默认的将远程仓库master主分支上的内容下载到了本地仓库的master主分支

下载远程内容的完整写法 git pull 关联别名 远程仓库分支:本地仓库分支(当前分支)

克隆操作将GitHub远程仓库的所有内容下载到本地,该方式自动搭建了本地与GitHub远程仓库的关联

  • clone操作1: 执行命令git clone SSH地址将远程仓库clone到本地,已设置key,不用命令
  • clone操作2: 执行命令git clone HTTPS地址将远程仓库clone到本地,该方式需要输入GitHub口令

标签常用命令