git与仓库学习笔记完结

小涛 社区会员 2021-11-11 01:31:52

git配置文件上传还算比较成功,简单说一下吧

首先自己以及下载过git了也当时配置好了用户邮箱之类什么的,就直接开始讲解怎样使用git将代码传到仓库吧:

首先我们的目标是在codeChina上面新建一个仓库并为它生成密钥,然后通过git命令将文件上传到仓库中:

CODE.CHINA地址:https://codechina.csdn.net/about#

请添加图片描述

首先我们需要注册账号:这里我已经注册成功

请添加图片描述

首先创建一个学习小组:也就是组织

请添加图片描述

一些简单的步骤我就先不赘述了直接开正题吧:

显示在桌面右键点一下会有一个Git Bush Here

在这里插入图片描述

 

然后你去生成ssm密钥,这个C 后面的xxx....是一个名字,不重要,我这里使用了我自己的qq邮箱

ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
​

请添加图片描述

为了清晰易懂我借用一张图片说明:

在这里插入图片描述

然后便生成了密钥在我们的C盘里面,截图中有这个路径,我们对应找到以后

请添加图片描述

打开刚刚的codeChina网站,找到设置里面的SSH密钥经行补充完善

请添加图片描述 请添加图片描述

请添加图片描述

配置成功:

请添加图片描述

请添加图片描述

然后我们在codechina自己创建的那个组织里面自己创建一个新项目就好。

接着我们在自己电脑上创建一个文件夹用来放文件:我创建了一个叫做codechina的文件夹,一开始是没有那个my_way这个项目的请添加图片描述

然后我们需要将那个readme文件克隆到这个文件夹中:

在本地目录空白处右键菜单,点击Git Bash Here。

在这里插入图片描述

输入git clone+刚刚的git链接

请添加图片描述

中途要是和我出现一样的情况就写yes就好

然后文件夹中就出现了:

请添加图片描述

这里插入一下git怎样连接gitee仓库:其实很多步骤一开始都一样。

有时候,我们可能是先在本地有了工程文件,然后再在gitee上创建仓库的。此时,可在本地库上使用命令 git remote add把它和 gitee的远程库关联,如下

git remote add origin git@gitee.com:linxinfa/mytest.git

如果在使用命令 git remote add时报错:

git remote add origin git@gitee.com:linxinfa/mytest.git
fatal: remote origin already exists.

说明本地库已经关联了一个名叫 origin的远程库,此时,可以先用git remote -v查看远程库信息:

git remote -v
origin git@gitee.com:linxinfa/mytest.git (fetch)
origin git@gitee.com:linxinfa/mytest.git (push)

我们可以删除已有的远程库

git remote rm origin

再关联远程库

git remote add origin git@gitee.com:linxinfa/mytest.git

添加文件:将需要上传的文件复制粘贴到这里面,执行git命令

请添加图片描述

首先cd my_way进入这个文件夹里面

git add -A 添加所有文件夹

git commit - m "你的文件夹名"(可以不写):提交文件

git push -u origin master

倘若出现这个报错:

fatal: not a git repository (or any of the parent directories): .git

那就是没有初始化,需要输入git init命令生成.git文件

请添加图片描述 请添加图片描述

添加完成刷新界面:

请添加图片描述

常用的git命令

git init                        #把当前目录变成git可以管理的仓库
git add readme.txt              #添加一个文件,也可以添加文件夹
git add -A                      #添加全部文件
git rm test.txt                 #删除一个文件,也可以删除文件夹
git commit -a -m "some commit"  #提交修改
git status                      #查看是否还有未提交
git log                         #查看最近日志
git reset --hard HEAD^          #版本回退一个版本
git reset --hard HEAD^^         #版本回退两个版本
git reset --hard HEAD~100       #版本回退多个版本
git remote add origin +地址     #远程仓库的提交(第一次链接)
git push -u origin master       #仓库关联
git push                        #远程仓库的提交(第二次及之后)
​

分割线----------------------------------------------------------------------------------------------------

分割线----------------------------------------------------------------------------------------------------

分割线----------------------------------------------------------------------------------------------------

接下来开始学习分支:

首先讲解一波分支的代码:

请添加图片描述

分支操作    命令
创建分支    git branch <name>
创建叫name的分支,但仍然停留在当前分支。
删除分支    git branch -d <name>:参数为-D则为强制删除。
git push origin --delete <name> :删除远程仓库的叫name的分支,同名的本地分支并不会被删除,所以还需要单独删除本地同名分支
git branch -dr <remote>/<branch-name>:没有删除远程分支,只是删除 git branch -r 列表中的追踪分支。一般只有git push命令可以修改远程仓库。
切换分支    git switch <name>
git checkout <name>
创建+切换分支 git switch -c <name>
git checkout -b <name>
上方两条命令一个意思:如果分支存在则只切换分支。不存在则创建叫name的分支,然后切换到该分支。相当于两条命令:git branch <name>,git checkout <name>
查看分支    git branch:查看本地分支,当前分支前面会标一个*号。
git branch -r:查看远程分支。
git branch -a:查看本地分支和远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话)。
git branch -vv:查看本地分支对应的远程分支。
重命名分支   git branch -m oldName newName
​

首先自己换了一个之前自己在git和学长创建了一个小组项目,就用这个试学一下,首先还是一样的步骤,先创建一个文件夹拉取,请添加图片描述

然后我打算新建分支使用git branch <分支名>,但是却报错了:

请添加图片描述

fatal: Not a valid object name: 'master'.

这个报错的原因是我们需要先建立一个主分支,当前连主分支都没有

报错原因就是当前没有 master 分支,无法新建分支。 可以使用以下命令查看当前分支:

git branch

使用git branch这个命令后你会发现什么都没有输出,证明你还没有主分支

解决方案

新建 master 分支: git 提交一次代码就会自动保存到 master 分支。

请添加图片描述

然后就可以创建新分支了:

请添加图片描述

然后我们切换到Dark这个分支:git checkout Dark

我们使用这个分支去创建目录文件:

请添加图片描述

创建好了之后我们使用Dark分支先添加到缓存区:git add folder请添加图片描述

然后我们使用pull将刚刚的文件推送上去:(在此之前我们需要先将dark这个分支推送上去。因为是在本地创建的):git push origin Dark

请添加图片描述

将分支推送的过程也就是顺带将新创建的文件push上去啦

请添加图片描述

git log命令

请添加图片描述

git status命令:

请添加图片描述

主要来说一下重点吧:git是怎样解决冲突的?冲突是怎样产生的呢?

首先,倘若我们使用不同的分支去提交代码其实并不会有冲突,因为这样是分别提交到了不同分支的仓库中,直到合并分支的时候才会出现问题:

冲突来源于合并:

不同分支的 commit 是不会产生冲突的,因为 commit 提交到的是当前分支的 本地库。 只有将分不同分支的本地库进行合并才会产生冲突。所以: 合并本地库会产生冲突 拉远程分支的代码也会产生冲突

通常产生的情况:

两个人写同一个文件就可以 先提交的不会有冲突,后拉取的会有冲突 同一个机器,不同分支,写同一个文件,也可以产生冲突

制造方法:

A 、B 两分支操作同一个文件的同一行代码。 A 分支 commit B 分支 commit B 合并 A,就会产生冲突

这里我们就使用刚刚创建的folder下面的file2.txt做示范吧:

首先我们需要切换为主分支并且拉去代码:

请添加图片描述

git pull origin xxx分支名称

请添加图片描述

 

 

然后我们去修改一下这个folder里面的file2.txt,(为了方便理解操作,我们还是切换到Dark分支做修改提交,然后Master分支做修改提交后合并制造冲突)

首先切换到Dark分支进行操作:请添加图片描述

我们再修改了以后需要add添加一些修改文件:git add .这里可能会报一个错:

warning: LF will be replaced by CRLF in folder/file2.txt. The file will have its original line endings in your working directory

请添加图片描述

解决方法:git config --global core.autocrlf false

原因就是:

原因是路径中存在 / 的符号转义问题,false就是不转换符号默认是true,相当于把路径的 / 符号进行转义,这样添加的时候就有问题

然后我们提交加推送:git commit -m "注释信息...." + git push origin master

请添加图片描述

然后我们切换到主分支去修改这个文件:

请添加图片描述

然后我们同样添加提交推送,这里插入一下知识小结:

1.git status 查看工作区代码相对于暂存区的差别

2.git add . 将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录

3.git commit -m ‘注释’ 将缓存区内容添加到本地仓库

4.git pull origin master先将远程仓库master中的信息同步到本地仓库master中

5.git push origin master 将本地版本库推送到远程服务器,

6.origin是远程主机,master表示是远程服务器上的master分支和本地分支重名的简写,分支名是可以修改的

操作完成后出现了冲突:MERGING

请添加图片描述

这就是因为我们操作了同一个文件,导致了冲突!此时我们切换分支就会报错:

请添加图片描述

解决方案:我们首先git status查看一下仓库状态:

请添加图片描述

我们看到了这个以后其实有两种解决办法,第一种也就是网上很多人说的:git reset --hard head

这个指令是回滚的意思,git默认当前版本是HARD,上一个版本就是HEAD^

上上一个版本就是HEAD^^

当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

但是这个指令会导致你的代码丢失,所以并不是一个好的方法,那么第二个解决方法就是手动修改,你自己通过git status 去找到对应的冲突地方然后:请添加图片描述

手动改成:

请添加图片描述

然后我们再次add 加 commit 加pull三步走:

请添加图片描述

OK解决啦!

最后说一下自己的理解,一开始确实在制造冲突上面有一些绕,首先我们加入创建了两个分支,一个叫Dark一个叫Light,然后我们首先处于Dark分支,我们假设Dark分支与Light分支一开始都只有一个叫file.txt的文件,然后我们在Dark上面创建一堆其他的东西然后添加提交加推送后,我们切换到Light分支首先进行合并会发现没有任何报错,因为我们只增不减,没有涉及到双方都触碰的文件,我一开始理解git冲突就是不可以随意触碰别人的代码,要是你直接碰了别人的代码就会报错但是后来自己尝试了好几遍发现不是这样的!!

重点理解一下什么才是冲突:两个已经提交的分支的相同文件相同位置的的不同操作进行了合并!!!!

重要的话说三次:

两个已经提交的分支的相同文件相同位置的的不同操作进行了合并叫冲突

两个已经提交的分支的相同文件相同位置的的不同操作进行了合并叫冲突

两个已经提交的分支的相同文件相同位置的的不同操作进行了合并叫冲突

也就是说,要是我现在是Dark分支,我里面的file.txt里面写的一句话:我是Dark,主分支里面也有一个file.txt里面写的我是master,我们谁去推送了谁就是老大,也就是说要是dark提交了,然后此时master傻乎乎的merge了一下Dark,master在同样的文件中写的所有代码都会一下子被覆盖!!!!所以记住无论谁只要push了就是老大,但是一山难容二虎,要是两个分支都提交了再进行merge就会出现MERGING!

重新梳理一下,现在有Dark和Light两个分支,我们两个分支都有一个叫做test.txt文件。Dark分支里面的文件写的是:我叫Dark,Light分支里面的文件写的是:我叫Light,然后我们目前是Dark分支,我们修改了这个文件里面的内容为:我是新一代Dark!,然后我们add+commit+push到Dark分支,然后我们切换到Light分支,此时要是直接merge Dark就会发现你的文件内容从我叫Light变成了我是新一代Dark!,因为这个git是会区分主次的!你前面的修改了然后推送成功就会变成主!其他的人现在只要merge你的分支都会变成你的样子,然后我们怎样知道冲突呢?那就是,回到刚刚Dark分支已经add+commit+push这一步,然后我们还是切换到Light分支,此刻我们不要去马上merge合并,因为这样就会成功把现在为主的master代码覆盖过来,我们要先修改这个test.txt文件,修改完了以后我们也去在Lignt分支add+commit+push,然后一切完了以后我们再来merge Dark就会出现Dark|MERGING冲突报错!因为现在Light也去Push了也成了所谓的主,此时就有两个主了,就会报错了!然后你现在切换到Dark分支立马执行merge Light,你会发现同样是冲突错误!那么这个怎么解决呢?我前面说的使用git reset --hard head 知识回滚,并不是解决问题的真正方法,真正方法就是在两个王的基础上培养一个王中王!那就是在MERGING错误的时候你找到并打开错误文件,会有这样的样子:

<<<<<<< HEAD和=======中间的是你自己的代码, 
 =======  和>>>>>>>中间的是其他人修改的代码
​
​

你现在重新修改这个文件然后add+commit+push后,切换到light就可以直接merge Dark了!

 

其余的一些知识点:

在这里插入图片描述

  • Workspace:工作区,就是你平时存放项目代码的地方

  • Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息

  • Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

本地的三个区域确切的说应该是git仓库中HEAD指向的版本:

在这里插入图片描述

 

  • Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。

  • WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。

  • .git:存放Git管理信息的目录,初始化仓库的时候自动创建。

  • Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。

  • Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。

  • Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。

在这里插入图片描述

git分支中常用指令:

​
# 列出所有本地分支
git branch
​
# 列出所有远程分支
git branch -r
​
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
​
# 新建一个分支,并切换到该分支
git checkout -b [branch]
​
# 合并指定分支到当前分支
$ git merge [branch]
​
# 删除分支
$ git branch -d [branch-name]
​
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

 

常见的版本控制工具

我们学习的东西,一定是当下最流行的!

主流的版本控制器有如下这些:

  • Git

  • SVN(Subversion)

  • CVS(Concurrent Versions System)

  • VSS(Micorosoft Visual SourceSafe)

  • TFS(Team Foundation Server)

  • Visual Studio Online

版本控制产品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),现在影响力最大且使用最广泛的是Git与SVN

版本控制分类

1、本地版本控制

记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。 请添加图片描述

 

2、集中版本控制 SVN

所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改

请添加图片描述

所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS

3、分布式版本控制 Git

每个人都拥有全部的代码!安全隐患!

所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。

不会因为服务器损坏或者网络问题,造成不能工作的情况!

请添加图片描述

Git与SVN的主要区别

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。

图片

Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。Git可以直接看到更新了哪些代码和文件!

Git是目前世界上最先进的分布式版本控制系统。

 

 

 

未解决的小问题:

假如我当前本地是主分支,和另一个分支second一模一样,然后我在主分支新建了一个one.txt文件,我add➕commit后,我push origin second,而不是push origin master ,然后我checkout到second分支后我pull发现新文件并没有过来,只有merge master才可以过来,那么我就好奇我在push的时候push origin 后面加的这个远程仓库好像并没有什么区别,这是为什么呀

...全文
546 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
牟云峰 2021-11-11
  • 打赏
  • 举报
回复

楼主的小问题解决了吗?

小涛 社区会员 2021-11-13
  • 举报
回复 1
@牟云峰 哈哈解决啦

110

社区成员

发帖
与我相关
我的任务
社区描述
训练、训练、训练!
其他 其他
社区管理员
  • 实训001
  • 非鱼up
  • andy421
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

自律训练,自信挑战!

试试用AI创作助手写篇文章吧