版本控制器之Git理论与实战

1.创建git本地仓库:git init

2.配置git

(1)设置用户名:git config [--global] user.name "your name"(加上--global选项表示这个机器上的所有仓库都会使用这个配置)

(2)查看配置:git config -l

(3)设置e-mail地址(一定是要真实的):git config [--global] user.email "你的邮箱"

(4)删除对应的配置:git config [--global] --unset 对应的配置

3.认识工作区,暂存区,版本库

(1)工作区:写代码的文件/目录或者其他文件的目录

(2)暂存区(stage/index):一般存在./git/index中,可以把暂存区称为索引

(3)版本库:.git目录就是版本库,版本库里面所有文件都能被git管理起来

三者关系

注意:通过新建/粘贴进目录的文件,只是存储在了工作区中,必须要通过git add或者git commit指令才能添加到仓库中进行管理。

4.查看提交日志:git log(显示从最近到最远的commit时的日志消息)

可以加上--pretty=oneline参数进行格式化输出日志

5.查看.git目录结构

默认的master分支:./git/refs/heads/master

6.修改文件

(1)查看当前仓库的状态

git status(用于查看你上次提交之后是否有对文件进行再次修改)

(2)查看被修改的文件内容

git diff 文件名(用来显示暂存区和工作区文件的区别)

git diff HEAD -- 文件名(查看版本库和工作区文件的区别)

7.版本回退

(1)git reset [--soft] [--mixed] [--head] [HEAD]

(2)git reflog(记录本地每一次命令)

从版本三回退到版本一

从版本一回退到版本三

(3)refs/heads/master文件保存当前master分支的最新commit id

当我们回退版本时,只是修改HEAD指针的指向

8.撤销修改

(1)工作区撤销修改:git checkout -- [file]

工作区撤销修改(直接删除代码),但是当我们写了很多代码时,难道我们还要花很多时间去删除我们写的代码吗,万一在我们删除的过程中搞出了BUG,那不炸了吗?

所以git为了解决这个问题,推出了一个指令

(2)暂存区中撤销修改:

先使用git reset --mixed HEAD [file]将工作区的修改进行回退到上一个版本

再使用git checkout -- [file]撤销工作区的内容

(3)在版本库中撤销修改

9.删除文件

(1)第一种情况:当我们不小心将工作区的文件删除了,由于删除也是一种修改,那么我们可以撤销修改

(2)第二种情况:当我们确定从版本库中删除一个文件时,那么该如何操作呢?

先在工作区和暂存区中删除文件,git rm filename

然后再进行提交

10.分支管理

(1)什么是分支

(2)创建分支(*表示HEAD指向的分支)

新创建的分支dev和master分支指向同一个修改

(3)切换分支:git checkout 分支名

git chekout 分支名

(4)合并分支:需要将dev分支合并到master分支,那么就不能在dev分支上进行合并,而是切换到master分支上进行合并。

git merge 分支名

(5)删除分支:如果当前正处于dev分支下,那么就不能删除dev分支

git branch -d 分支名

11.合并冲突

(1)创建并切换分支:git checkout -b 分支名

当出现合并冲突时,要手动解决冲突并再次提交

12.分支管理策略

(1)当处于Fast forward模式下,删除分支后,查看分支历史信息时,会丢掉分支信息,看不出最新分支是合并的分支还是正常提交的。

(2)当我们合并冲突时,解决冲突问题后,会在进行一次新的提交,即使我们删除了dev1分支,但是我们还是可以看出master分支是由其他分支进行合并的。

禁用Fast forward模式进行合并分支(禁用Fast forward模式时会创建一个新提交)

git merge --no-ff -m "merge with no-ff" dev2

(3)BUG分支

假设现在我们正在dev2分支下进行开发,但是开发到一半发现master分支上有BUG,需要解决(每一个BUG都可以创建一个临时的分支进行解决,解决后再合并分支,最后将临时分支进行删除)

但是现在dev2分支开发到一半还不能提交,那怎么办呢?

git stash可以将当前工作区信息进行储藏,被储藏的内容可以在将来的某个时间恢复出来。

git stash list:查看工作现场存储到哪里去了

git stash pop表示恢复工作现场,同时也把stash删除了

当我们修复了master分支的BUG时,我们需要将BUG分支合并到master分支中,如果我们直接在master分支上合并

BUG分支,会导致在master分支上出现冲突,容易给master分支修改错。

解决方法:在自己分支上先进行合并master分支,如果有冲突在自己分支上解决,解决了再让master分支进行合并自己的分支

13.删除临时分支

当我们在企业中开发时,每添加一个功能都会创建一个新分支,把这个分支叫做feature分支。

但是今天在feature分支上开发了一半,被产品经理叫停了,所以要销毁开发到一半的feature分支

常规的git branch -d 分支名是删除不了的,可以换成git brach -D 分支名

13.远程操作

在上面的内容都是基于本地进行的,也就是在我们计算机上,但是Git是分布式版本控制系统

什么是分布式版本控制系统呢,分布式控制系统通常有一台充当"中央服务器"的主机,但这个主机只是用来方便大家修改。那么有了它即使本地出现故障了,我们也可以直接从中央服务器哪里进行拉取内容。

(1)远程仓库

什么是远程仓库,就是使用一台24小时开机的服务器充当,比较出名的就是GitHub/gitee

(2)新建远程仓库

新建远程项目仓库

填写信息

创建成功

对远程仓库进行设置:开源or私有

刚建的仓库默认只有master分支

(3)本地克隆远端仓库

git clone 远程仓库链接

可以使用SSH,也可以使用HTTPS进行克隆,使用SSH需要将我们的公钥放到服务器上,有Git服务器进行管理

HTTPS就没有什么要求,可以直接clone

演示一下如何使用SSH进行clone

(1)先创建SSH Key

如果成功,就可以在用户主目录中找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件

id_rsa是密钥(不要泄漏给别人),id_rsa.pub是公钥(随便告诉)

(2)添加自己的公钥到远端仓库

点击ssh公钥进行设置

然后就可以clone了

(3)查看远程仓库(远程主机默认名称是origin)

git remote -v(-v显示详细信息)

(4)向远程仓库推送文件(在本地配置的邮箱和用户名要和远端的邮箱和用户名要一样)

git三板斧:

git add .(提交当前所有修改)

git commit -m "修改日志(认真填写)"

git push <主机名> <本地分支名>:<远程分支名>(将本地分支推送到远程并合并)

Git push <主机名> <本地分支名>(当远程分支名和本地分支名一样)

(5)拉取远程仓库

git pull <远程主机名> <远程分支名>:<本地分支名>

git pull <远程主机名> <远程分支名>(如果远程分支和当前分支合并)

14.配置Git

在日常开发中,我们有些文件不想或者不应该提交到远端,例如保存了数据库的密码的配置文件

那么如何让Git忽略这些文件呢?

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件填进去,Git就自动忽略这些文件了。

那么这个.gitignore文件是要我们自己创建吗?

当然不是,gitee在创建仓库的时就会为我们自动生成,我们只需要勾选一下就行

当然我们也可以自己在本地创建一个.gitignore文件

现在我们在.gitignore文件中写入*.so和*.ini,表示我们需要忽略这两种文件

现在我已经将.gitgnore文件push到我的远端仓库了,现在我要验证当我在

工作区中添加.so和.ini文件时,git status会不会显示添加文件,不会就证明忽略成功了

所以我们的.gitignore文件生效了.

但是可能还有一种情况,就是我想添加到一个文件到Git中,但是这个文件被.gitignore忽略了,根本添加不了

我们可以使用git add -f filename来进行添加

但是也可能是我们的.gitignore文件写的有问题,那么可以使用git check-ignore指令进行检查

git告诉了我们,.gitignore的第二行忽略了该文件,所以我们就可以知道修改那个规则了。

还有一种情况,假设我们需要git忽略以.开头的部分隐藏文件,我们在.gitignore写了.*

那就尴尬了,*.也将我们的.gitignore文件也忽略了,这个时候我们可以在.gitignore文件

中添加一条例外规则

!.gitignore #表示不忽略.gitignore文件

15.给指令配置别名

在你使用git时候,有时候你会觉得指令实在太长了,让人敲的头疼,所以git推出了指令简化

git config --global alias.简化后的指令 被简化的指令(--global表示全局参数,也就是在当前主机下的所有仓库都适用,如果不加只是当前仓库适用)

现在我需要将git log --pretty=oneline简化成git olog

当然,初学者还是不建议使用这个,等我们工作了用熟悉了再进行简化我们的工作

16.标签管理

(1)标签定义

标签tar,可以理解为对某次的commit的一个标识,相当于给这次的commit起了一个别名

我们知道commit是用很长的commid id来标识了,现在出现了标签就可以让人很容易记录了commit的版本,当我们想要回退到那个版本时,直接使用标签就可以很快定位了。

(2)操作标签

在创建一个新标签之前,我们先切换到需要打标签的分支上,现在我需要在master分支上打标签

打标签:git tag -a 标签名 -m "标签说明" commit_id(也可以使用git tag 标签名)

默认的标签是打在最新提交的commit上的,那么如何给指定的commit打上标签呢?

找到commid id就行了

查看所有标签:git tag(标签不是按时间进行排序的,而是按字母进行排序)

查看单个标签详细信息

删除标签

现在我需要删除v0.9这个标签

由于我们创建的标签都是存储在本地,不会自动推送到远程,所以打错的标签可以直接在本地删除,

但是如果我们想要推送某个标签到远程

git push 远程主机名 标签名

如果本地有多个标签,也可以一次性全部推送

当我们的标签已经推送到远端了,那么我们该如何删除呢?

(1)先从本地删除

再从远端删除

17.多人协作开发(重要)

(1)多人协作开发一(多个人在同一个分支下进行开发)

现在我已经在Linux上clone下我的项目仓库了,然后我会在windows下clone同一个项目仓库模拟另一个开发者

如果没有windows版本的git,可以先去安装,直接上网搜就有了

在windows上先创建一个存放项目文件的目录.git,再右键点击该目录,打开git bash here

然后将远端仓库克隆下来

注意我这里只是模拟了两个用户,实际中每一个用户都有自己的gitee/github账号的,如果要进行多人协作开发,需要将用户添加进开发者,用户才有权限进行提交代码

现在准备工作已经完成,但是我们的远端仓库只有一个master主分支,在实际中,任何情况下都是不能直接在master分支上进行修改代码的,这个是为了保持主分支的稳定性,所以在我们开发新功能时,需要建立新的分支。

既然我们创建远程分支成功了,我们就需要拉取到本地

拉取分支完成了,现在我们要切换到dev分支了,但是有一个问题我们切换分支是切换本地的,那么如何切换远程的呢?我们可以将本地分支和远程分支进行关系链接:git checkout -b dev origin/dev

有老铁就会好奇,为什么在Linux上需要重新创建一个本地的dev分支,在windows上确不需要重新创建

这个是由于Git2.23+版本智能切换功能,当git发现你的本地没有dev分支,但在远程中存在/origin/dev分支,且分支名完全匹配,那么就会自动帮你在本地创建dev分支并和远程的dev分支建立关系链接。

到这里为止,你就可以愉快的和你的小伙伴进行开发了。

现在我要在dev上进行一次开发,并push到远程

那么我们来看看码云上的仓库状态

那么我们的代码就推送到了码云上

假设现在你的小伙伴要和你协同开发,碰巧也要对file.txt进行修改,并推送

但是推送失败了,你和你的小伙伴提交出现冲突了,那么如何解决呢?

git已经提示我们了,先git pull把最新提交从origin/dev上抓下来,然后再本地进行合并,并解决冲突,再进行push

冲突已解决,重新提交推送

看看码云上面是否有我们的提交

现在我们的代码已经提交到远端的dev分支上了,但是我们的最终的目的是将开发后的代码合并到master主分支上

让我们的项目运行最新的代码

在本地master分支进行合并dev分支之前先将远端master分支进行pull一下,保证本地的master是最新的内容。

然后再切换到dev分支上,合并master分支,这么做是为了当dev分支和master分支有冲突时,可以在dev分支上进行解决,而不是直接在master分支上解决

最后将本地master分支推送至远端

查看远端仓库验证一下

(2)多人协作开发二(多个人在不同分支下进行开发)

一般而言,是不会在同一个分支下进行多人开发的,而是一个需求或者功能点就要创建一个feature分支

现在假设有两个需求,你和你的小伙伴需要分别开发一个需求,所以你和你的小伙伴都要建立自己的feature分支

在上面我们已经知道了在码云上创建远程分支,那么这次我会从本地创建分支,然后再推送到远端

先在本地创建feature-1分支,再创建function1文件,将该文件进行提交和push

下面到你的小伙伴进行开发了

到这里我们就可以看出多人在不同分支开发的好处了,在本地他看不见你的,你看不见他的,所以根本不用担心冲突问题,你们互不影响

看看码云上状态

现在你们就可以在自己的分支上进行专业的开发了

但是突然有一天你的小伙伴生病请假了,但是他的需求还没开发完,需要你帮他开发,于是他把他的分支名

feature-2告诉你,所以你接下来就需要在你的机器上切换到feature-2分支进行开发

先将远端f仓库拉取下来

在本地创建feature-2分支和远端feature-2分支进行关系链接,并切换到feature-2分支上

所以在本地就出现了function2文件了,下面你就可以愉快的帮你的小伙伴进行开发了

看看远程状态

过了几天,你的小伙伴回来了,那么他就需要先获取到你帮他开发的内容,接着你的开发,或者你开发完了他也要看一下你写的代码

那是为什么呢?

是由于你的小伙伴没有指明本地feature-2和远程feature-2的链接,git已经给出提示了

现在你和你的小伙伴在各自的分支下开发完毕了,所以都需要合并到master分支上了。

由于你的小伙伴先开发完,那么他先开始merge

还是老习惯,先切换到master分支下进行pull,然后切换到feature-2分支下进行merge,最后切换到master分支下进行marge,最后将master进行push

看看远程仓库

当你的小伙伴的代码push了,你的开发也完成了,也要进行merge操作

也是老习惯,先切换到master分支下进行pull,然后切换到feature-1分支下进行merge,这时候,feature-1可能解决了冲突,feature-1有了新内容,为了保证远程分支是最新的,所以最好push一下,为什么呢?

因为在实际开发中master的merge操作一般不是由我们在本地进行操作,其他人员操作的时候,肯定是先pull远程的master分支,最后切换到master分支下进行marge,最后将master进行push(如果merge时有冲突,不要忘记commit才能push)

看看远程仓库

到这里就合并成功了,那么功能开发完毕了,feature-1和feature-2分支对我们没用了,可以在远程中删除了

然后我们在本地查一下看看远程分支是否删除了

我们看到远程的还存在,不要慌,这个只是记录而已,把记录删除就行了

git remote prune origin (将远端不存在的分支进行删除)

然后再删除本地分支

相关推荐
星海拾遗5 小时前
git rebase记录
大数据·git·elasticsearch
南棱笑笑生6 小时前
20251217给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通ov5645【只能预览】
linux·c语言·开发语言·rockchip
ljh5746491196 小时前
PhpStorm 2022.3 版本中,修改使用 Git 提交时看到弹出式的对话框模式
ide·git·php·phpstorm
Sleepy MargulisItG7 小时前
【Linux网络编程】应用层协议:HTTP协议
linux·服务器·网络·http
G31135422737 小时前
Linux 内核设计中的核心思想与架构原则
linux·架构·php
zhuzewennamoamtf7 小时前
Linux内核platform抽象、数据结构、内核匹配机制
linux·运维·数据结构
云闲不收8 小时前
git rebase
git
江上清风山间明月8 小时前
git pull和git checkout在恢复文件的区别
git·pull·checkout
Kira Skyler9 小时前
ELF文件解析 elf.o 文件主要内容.md
linux
海鸥819 小时前
in argocd ‘/tmp/_argocd-repo/../.git/index.lock‘: No space left on
git·argocd