最新万字长文肝Git--全流程知识点包您满意【建议收藏】,面试C C++卡顿

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

#然后重新下载阿里的yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#清理缓存
yun clean all


### Windows系统下


Git的官方下载地址是:[Git的下载地址](https://bbs.csdn.net/topics/618668825)![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/df1cf85420ecafa6e8aa131f6b2d0405.png)  
 下载好安装包之后,一直点击下一步即可安装。再次就不在赘述。


### 5.本地版本库操作


Windows下安装好Git之后会出现Git Bash 和Git GUI两个应用程序,其中Git Bash是Git的命令行工具,而Git GUI则是Git的可视化工具(一般很少用)。


#### 创建本地版本库


创建本地版本库分为两步:  
 第一步是创建一个空文件夹,命名为: git\_learn。  
 第二步就是在该文件夹下执行`git init` 命令将该文件夹变成git可以管理的版本库。  
 执行第二步之后,在 git\_learn目录下会出现一个名为.git的隐藏文件夹,该文件夹就是git的版本库。**切记不要手动修改.git文件夹下的任何内容,以免本地版本库不可用**。


本地版本库建好之后就可以在git\_learn文件夹下创建一个文件进行测试了。这里创建了一个名为readme.txt的文件。  
 添加到暂存区  
 通过`git add readme.txt`命令可以将readme.txt文件提交到暂存区(关于暂存区的概念后面会详细介绍)。如果有多个文件需要添加的话,可以执行`git add .` 命令。  
 提交到版本库  
 因为git的本地都是有完整版本库的,所以还需要将前面创建的readme.txt文件提交到本地版本库的当前分支,默认是master。命令格式是`git commit -m '<message>'` ,其中 
 
 写入你的提交备注。 
 


#### 工作区和暂存区


这里有两个很重要的概念,一个是工作区,另一个是暂存区(Git特有的概念)。  
 工作区  
 工作区就是你电脑上能看到的目录(不包括隐藏文件),例如:git\_learn目录就是一个工作区。


暂存区  
 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库,其中最重要的是暂存区(stage)。


还有Git为我们自动创建的第一个分支叫master,以及指向master的一个指针叫HEAD。


前面提到了工作区,暂存区,`git add`命令和`git comit` 命令。那么他们之间有啥关系呢?下面就用一张流程图展示一下:![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/b2ce33d4b8a4954872200ac1f6a7a48c.png)  
 通过add命令将工作区中ABC文件夹提交到暂存区stage,在通过commit命令将stage中的ABC文件夹提交到当前分支master。


#### 管理修改


Git管理的是修改而非文件。这里的修改指的是对工作区的任何操作,包括新增文件;删除文件;修改文件等等。哪怕是在文件中增加一句话或者删除一个字符都可以算是修改。下面就举例说明下,还是以readme.txt文件为例:


1. 第一次在readme.txt文件中增加一个词语 gittest。然后执行`git add readme.txt`,并通过命令`git status`查看状态。*hello world  
 gittest*![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/4ffee539bf227cd9dad9790127c8474c.png)
2. 第二次再在readme.txt文件上添加一行内容`git tracks changes`。*hello world  
 gittest  
 git tracks changes*


直接执行`git commit -m 'git tracks changes'`命令。然后通过 `git status` ,可以发现第二次的修改没有提交。这是因为第二次的修改没有先提交到暂存区中。![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/743f1f99f849f77d02df84bda8185d23.png)  
 我们的操作过程是`第一次修改 -> git add -> 第二次修改 -> git commit`。当使用`git add` 命令后,在工作区中的第一次修改被放入暂存区中,准备提交,在工作区中的第二次修改没有被放入暂存区中,所以,`git commit`只负责把暂存区中的修改提交到当前分支。所以第二次的修改没有提交。**也就是说,所有的修改必须先通过git add 提交到暂存区,然后通过git commit 提交到当前分支。**。在实际开发中一般是将所有修改合并起来add,然后在一起commit。


#### 删除文件


当前分支上有一个已经废弃不用的文件,该如何删除呢?比如要删除一个名为test1.txt文件。只需要两行命令。



git rm test1.txt
git commit -m “remove test.txt”


### 5.Ubuntu搭建私有的git仓库


前面介绍了在实际开发中,一般会拿一台电脑作为“中央仓库”,充当中央仓库的电脑需要安装一个代码仓库软件,这里选用开源软件GitLab,它是基于git实现的在线代码仓库软件,提供web可视化管理界面,可以在本地部署。通常用于企业团队内部协作开发。当然,如果你不想搭建私人的git仓库,那么也可以直接使用最大的同性交友网站Github(使用与GitLab类似)。  
 那么该如何在Ubuntu上安装GitLab软件,搭建私有的Git仓库呢?


1. 安装必须的一些服务



#更新apt源
sudo apt-get update
#安装依赖包,运行命令
sudo apt-get install curl openssh-server ca-certificates postfix
sudo apt-get install -y postfix


2. 接着信任 GitLab 的 GPG 公钥:



curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null


3. 配置镜像路径  
 由于国外的下载速度过慢,所以配置清华大学镜像的路径。



sudo vi /etc/apt/sources.list.d/gitlab-ce.list


在该文件中写入如下代码



deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu xenial main


4. 安装gitlab-ce



sudo apt-get update
sudo apt-get install gitlab-ce


安装gitlab-ce成功之后。  
 5. 修改外部url  
 在gitlab配置文件/etc/gitlab/gitlab.rb中修改外部url,改为自己的ip地址或者域名。



sudo vi /etc/gitlab/gitlab.rb


找到external\_url,修改其默认的地址,这里改成了我本机局域网IP:`192.168.40.138`



external_url ‘http://192.168.40.138/’ ## 本机的局域网ip地址为192.168.41.128


6. 执行配置  
 前面步骤顺利的话就可以执行配置了,该过程可能需要较长的时间。



sudo gitlab-ctl reconfigure


7. 启动GitLab



sudo gitlab-ctl start


可以通过`ps -ef|grep gitlab` 命令查看GitLab是否启动成功。  
 8. 进行浏览器访问  
 GitLab成功启动之后就可以通过浏览器访问GitLab的主页了。在浏览器上输入`http://192.168.40.138/`;![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/007607f795a03151dbffb652caa2ff86.png)  
 默认输入的用户名是root用户,输入的密码是root的账户密码。  
 至此GitLab的安装就全部结束,我们也成功的搭建了属于自己的Git仓库。


#### GitLab的使用


##### 添加用户


点击设置按钮,进入设置栏,选中`Users->New User` 进入添加用户页面。![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/badd4f03f338aaef74e05ac39ddbf6b6.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/443166f217dd0dccd0f3921f9d53ba21.png)  
 输入姓名,用户名,和邮箱即可注册添加新用户。


##### 添加团队


用户添加好之后,就是将用户添加到团队中,GitLab中默认会有一个名为GitLab Instance的团队,你也可以添加自己的团队,这里我添加了一个名为ai\_edu的团队。并在团队中添加了两个成员。![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/c8eb725c80dea181cce22db2f4859b54.png)  
 选中要添加成员的团队,在右侧会出现一个添加Add user(s) to the group的栏目。再此栏目中所有用户并添加到团队中。用户的角色有游客,测试人员,开发人员,管理者,拥有者等几个不同的角色。![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ee33cdf08be8f220d9016044577d6116.png)


##### 新建远程仓库


说完了用户和团队的设置后,现在就进入了重点了,如何新建一个远程仓库。同样也是比较方便。操作步骤是:`Project->Your projects->New project`![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ca24814f25bcf1cea6760e1c7ccb4a1c.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/361459ee281603deba682cbf46ff1997.png)  
 这里新建了一个名为git\_test的远程仓库,仓库的所有这是属于ai\_edu团队。![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/62056bd59e80b387c42fc091728e4cf6.png)


这里仓库的权限等级有三个等级,分别是:Private(只有你团队的人才能拉取和推送代码),Internal(除了黑名单之外的用户可以拉取和推送代码)。Public (所有的用户都可以拉取)。


#### SSH key的配置(生成公钥和私钥)


为啥要配置SSH key呢?这是因为GitLab与你的电脑是通过SSH协议来通信的。说白了,如果你没有配置SSH key的话,则你不能推送代码到远程库。这里首先在你本地生成公钥和私钥文件,然后把公钥文件的内容复制到GitLab上。


1. 配置用户名



git config --global user.name “username”


3. 配置邮箱



git config --global user.email address@gmail.com


address@gmail.com 替换成你实际的邮箱地址。不需要加单引号。  
 4. 生成公钥和私钥



ssh-keygen -C ‘you email address@gmail.com’ -t rsa


如果简单些的话可以直接填写`ssh-keygen`  命令。邮箱地址可以填写前面设置的邮箱地址。  
 2 找到公钥文件id\_rsa.pub,复制公钥内容到GitLab![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/572bb36c1ac4fd7b1160acaadac788dd.png)


## 6. 分支管理


### 创建与合并分支


分支的概念:分支就是每次提交创建的点所连接成的时间线。这条时间线就是一个分支,默认的话只有一个主分支master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交,HEAD指向的就是当前分支。  
 一开始的时候,master分支就是一条线,Git用master指向最新的提交,再用HEAD指向master,就能够确定当前的分支以及当前分支的提交点。  
 每次提交,master分支都会向前进移动一步,这样随着你不断提交,master分支的线也会越来越长。其结构如下图所示:![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/de5d16a2fe189f7f916b0d473599348e.png)


##### 1. 创建dev分支


当我们新创建一个分支dev时,Git会创建一个指针dev指向master分支当前的提交点。当切换到dev分支后,HEAD指针会指向dev。也就是说**HEAD始终是指向当前分支的**。



git checkout -b dev


git checkout 加上-b参数表示创建并切换到dev分支上,相当于下面两条命令。



$ git branch dev
$ git checkout dev


执行该上面的命令之后的git的提交时间线如下图所示:![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/6f51403e2b3600558a0c74ef8d24e458.png)  
 当在dev分支上提交代码(未改变master分支)之后,dev分支会不断的向后推进。而master指针的指向则不会变。![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/04ab029486f6bd9d5981aefea166f33e.png)`git checkout`命令是一个比较特殊的命令,传入不同的参数会有截然不同的效果。例如:`git checkout -- file` 命令,表示的意思是撤销file文件中所有的修改。所以Git还提供了`git switch`命令用于创建和切换分支。



创建并切换到新的dev分支

git switch -c dev

切换到已有的master分支

git switch master


##### 2. 查看所有分支


分支创建好之后,可以通过`git branch`命令进行查看。


##### 3. 分支合并


当团队成员在dev分支上开发完毕之后,就可以将dev分支上的内容合并到master分支上,合并分支的原理就是将master指针指向dev的当前提交。Git合并分支只是改了下指针,工作区的内容没有改变。![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/e4fcf783e2b8589f82070229f1984f10.png)


其合并的命令分两步,第一步是切换到master分支,第二步是合并dev分支



#切换到master分支
git checkout master
#合并dev分支
git merge dev


4. 删除dev分支  
 现在dev分支的内容也合并到了master分支上了,可以将dev分支删除了。**Git删除dev分支其实就是删除dev指针**。删除之后又只剩下master分支了。需要注意的是必须要先切换到master分支上再进行删除dev分支的操作。删除dev分支的命令如下:



git branch -d dev


### 解决冲突


在团队协作过程中,难免会碰到各种修改冲突。那么该如何解决这些冲突呢? 例如:你和你同事分别修改了readme.txt文件,那么当你们同时提交时就会出现冲突。又或者在你在master分支和feature1分支上分别修改了readme.txt文件。那么当你合并feature1分支到master分支时就会出现冲突。举个栗子吧:


1. 在feature1分支上给readme.txt文件中加上了文本`处理冲突`。然后提交到feature1分支。
2. 切换到master分支,给readme.txt文件中加上文本



冲突处理
master有冲突


然后提交到master分支上。  
 3. 将feature1分支合并到master分支,此时就会出现合并冲突。如下图所示:


冲突之后,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。如下图所示:  
 处理冲突的方式就是**编辑冲突内容。然后重新提交。**



$ git add README.md
$ git commit -m “解决冲突”


### 分支管理策略


通常情况下,Git在合并分支时,会使用Fast forward模式。但是,这种模式下,删除分支后,会丢掉分支信息。如下图所示,删除dev分支之后,分支的信息也就就丢失了


![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ec7cc64de55b85a8e9dfa40c9d6a6539.png)  
 如果要强制禁用Fast forward模式,Git会在merge时生成一个新的commit。当删除分支时就不会丢失分支信息。其命令是 `git merge --no-ff -m "merge with no-ff" dev`  
 准备合并dev分支,其中`--no-ff`参数,表示禁用Fast forward,因为本次合并要创建一个新的commit,所以加上`-m`参数。把commit描述写进去。


### Bug分支


当你接到一个修复代号为01的bug的任务时,很自然地,你会创建一个分支issue-01来修复它,但是,如果这是你正在dev分支上进行的工作还没有提交,提交吧,可是你在dev上的工作只进行了一般,还没法提交,预计完成还需1天的时间。但是,现在必须要在两个小时内修复代号01的bug。这时候该怎么办呢?你不是期望有一个功能可以隐藏你当前在dev上未提交的工作,然后,切换到issue-01分支修改bug呢。  
 通过stash功能可以满足你的愿望,将当前工作现场隐藏起来。如下图所示:执行`git stash`命令之后,新建的hello.html文件就从工作区中消失了。![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/7484ae5c5a1b1ac6ea21c7a2fdde1f99.png)


#### 保存工作现场



git stash


git stash命令可以将当前未提交的工作隐藏起来。让你的工作区变的干净清爽。


#### 查看工作现场


git stash list 可以查看当前仓库所有已经保存的工作现场。



git stash list


#### 恢复工作现场


现在代号为01的bug已经修复好了,你可以继续切换到dev分支上进行开发了。那么这时候你需要做的第一件事就是恢复之前保存的工作现场。恢复工作现场的命令是:



git stash apply


#### 删除工作现场


通过`git stash apply` 命令可以恢复工作现场。但是,恢复之后工作现场还在。那么这时候我们还需要一个命令来删除工作现场。其命令是:



git stash drop


#### 恢复并删除工作现场


恢复工作现场一条命令,删除工作现场又是一条命令。未免有点繁琐了吧。有没有将两者合二为一的命令呢?答案是有的:通过下面的命令就可以实现:



git stash pop


在master分支上修复了bug后,我们想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?这种方法也不是不行,如果该BUG涉及的修改过多,这样的方式就显得有点捉襟见肘了。那么我们能不能把修改BUG做的提交复制到当前的dev分支呢?答案是有的:



git cherry-pick 821ea4d


通过`git cherry-pick` 命令可以将单个的提交复制到当前分支。可以通过 git log 查看提交的提交的版本号。


### feature分支


添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。  
 前面介绍可以通过`git branch -d branchname` 命令删除分支。但是,如果被删除的分支还没有合并到主分支的话,用该命令删除的话分支的话,Git会抛出一个错误提示并不能删除该分支。如下:要删除一个名为feature-01的分支。但是该分支还没有被merge。这时候就需要强制删除分支的命令了。



git branch -D feature-01


其中feature-01为待删除的分支名。其实就是将`-d`参数换成`-D`参数。


### 远程仓库(多人协作)


前面说了那么多,好像都是一个人在本地操作,没有涉及到多人协作的情况。这在团队开发中肯定是不可能的啦,因为我们是一个team。那么多人协作的情况涉及哪些操作呢?


#### 克隆远程仓库


前面第三章已经搭好了私有的Git仓库管理器GitLab。同时也创建了一个名为git\_test的仓库。现在要做的就是将远程仓库克隆下来。克隆的命令是`git clone`



git clone http://192.168.40.138/ai-edu/git_test.git


其中`http://192.168.40.138/ai-edu/git_test.git` 是远程仓库的地址。  
 当然也可以在IDEA上直接通过图形界面操作,还省去了导入项目的过程。其操作步骤是:


1. 选中`File->New->Project from Version Control->Git`。如下图所示:![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/d6beb0186a47dffd857208dc69d2a95d.png)
2. 在URL中填入远程仓库的地址,点击Clone按钮。如下图所示:![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/a8b7ac17918bdfabb9eefc2597fe94e9.png)**需要注意的是默认情况下只会克隆master分支,其他的分支不会被克隆下来。其他的分支需要通过git pull命令拉取,后面会详细介绍。**


#### 查看远程分支


通过`git remote`命令可以查看远程仓库,远程仓库默认的分支名称是origin。  
 通过`git remote -v` 命令可以查看远程仓库详细的信息,包括远程仓库的地址。



$ git remote -v
origin http://192.168.40.138/ai-edu/git_test.git (fetch)
origin http://192.168.40.138/ai-edu/git_test.git (push)



![img](https://img-blog.csdnimg.cn/img_convert/c44a7a812664488de56adcf3f5675356.png)
![img](https://img-blog.csdnimg.cn/img_convert/5b83c097b3be50da1a2b7f858a0cbf20.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

可以查看远程仓库详细的信息,包括远程仓库的地址。



$ git remote -v
origin http://192.168.40.138/ai-edu/git_test.git (fetch)
origin http://192.168.40.138/ai-edu/git_test.git (push)



[外链图片转存中...(img-DD8lyYFu-1715875952207)]
[外链图片转存中...(img-KQ1IUCmF-1715875952208)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值