git源码仓库学习

x33g5p2x  于2021-11-22 转载在 其他  
字(6.5k)|赞(0)|评价(0)|浏览(744)

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了!

未解决的小问题:

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

解答:

git push 实际上是 将你的当前分支推送到 远程同名分支
git push origin master 实际上是将你的本地master分支推送到远程的master分支,不管你当前在哪个分支上,所以 你的 git push origin second 只是将你的本地 second 分支推送到远程second分支,而不是将你本地的master分支推送到远程的master分支
git push origin master:second 才是将你的本地master分支推送到远程的second分支

相关文章

目录