目录
1Git简介和安装
1.1 git介绍
1.2 git的优势
1.3 Git的安装
1.4 git协作方式
2 Git工作原理
2.1 概念介绍
2.2 git 工作流程
2.3 本地仓库远程仓库联系编辑
2.4 Git创建版本库/初始化
2.5 git底层原理
2.6 git的文件管理机制
3 在GitHub上创建远程仓库并获取token
3.1github创建一个远程仓库编辑
3.2 获取自己GitHub的token
4 创建idae项目并且通过git连接远程仓库
4.1 可视化方式详细步骤
4.2 命令行方式操作步骤
4.3实战过程问题汇集
5 git分支管理
5.1 分支的创建与合并
5.2 分支冲突解决
5.3 分支merge还是rebase?
5.4 分支常见问题
6 Git中常用命令和高级命令
6.1 git初始化和设置签名
6.2 git基础操作
6.3 分支相关的命令
6.4 其他命令
7. git其他总结
Git是分布式版本控制系统。而GitHub网站为开源项目免费提供Git存储。
补充一下分布式版本控制系统与集中式版本控制系统有何不同呢?
首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
多个人如何协作呢?
比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。
而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
完整协议支持
在线文件编辑
社交网络元素
特色工作模式
列表内容私有仓库托管
mac的安装请见我的另外一篇博客:
Git版本控制和协同工作(附带介绍Mac的brew工具)_斑马!的博客-CSDN博客
1)团队内部协作
2)跨团队协作
工作区:仓库文件里面,除了.git目录以外的内容(见下图);更通俗的理解就是我们写代码的地方。
版本库:git目录,用于存储记录版本信息;
暂缓区:版本库里面的stage;
master:git自动创建的第一个分支;
head指针:用于指向当前分支;
经过执行 git add . 命令之后会将工作区的文件添加到暂缓区中,再经过执行 git commit -m "说明文字" 命令之后,会将暂缓区的文件添加到版本库的分支当中去。
git init:(个人仓库)仓库初始化
首先我们在桌面新建一个 project 空文件夹之后,鼠标右键以 git bash here 打开 Git 终端,输入 git init 命令之后,观察 project 文件夹之后多了一个隐藏文件夹 Git 目录。这时我们就创建好了一个受 Git 管理的仓库,这个仓库就在本地。【注意】.git目录是隐藏目录,我们要想办法进入隐藏目录才可以看见该文件里面的内容。
底层通过一个哈希进行明文加密得到密文。哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
哈希算法确定,输入数据确定,输出数据能够保证不变
哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
哈希算法不可逆
Git 底层采用的是 SHA-1 算法。
哈希算法可以被用来验证文件。原理如下图所示,Git 就是靠这种机制来从根本上保证数据完整性的。
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的工作方式可以称之为快照流。
因为现在在idea中使用git,不能通过账号密码来登陆,需要通过token登陆。
1)在idea中创建完项目之后,点击菜单里面vcs -- enable version control integration--git
integration--git在idea中使用git
2)点击git后就可以进行git命令的相关操作;
3)我们先进性commit把文件从工作区放到本地仓库的暂存区,然后push
4)push之后,会显示master->define remote
5)点击 define remote后,会出现下图所示name和url,其中name我们填写在GitHub上创建的远程仓库名称,URL我们复制远程仓库的https.
6)点击OK后,idea中除了本地仓库local的分支,还会出现远程仓库remote的情况
7)此时去远程仓库看一下,还会发现我们以及可以看到本地仓库提交的内容了;
8)我们在本仓库新建一个分支,在local上面右键选择new branch from selected,此时新创建the_first_branch就是我们的第一个默认的当前分支。
9)在当前the_first_branch进行修改项目内容,修改完后,我们进行commit和push.
10)此时就可以在GitHub看到我们提交的the_first_branch分支。
11)在githu网站点击pull requests,然后点击compare & pull request,在comment里面填写相关信息,最后点击create pull request.
注意,要选择好对应的分支
12)这样就相当于把我们本地仓库的the_first_branch分支添加到了我们远程仓库的master分支。(注意选择好base的master分支,和要被合并的分支)。
13)此时我们的工作区还是本地仓库的the_first_branch,也就是说工作区还是修改后的代码,但是如果此时,我们切换到本地local的the master分支,即右键master分支,然后checkout一下,就可以看到工作区变成了master分支的代码,也就是最开始的代码。
14)此时点击idea右上方的update project按钮,会弹出两个选项。
第一个选项:Merge the incoming changes into the current branch:将传入的更改合并到当前分支中(常用);
第二个选项:Rebase the current branch on top of the incoming changes:在传入更改的基础上重新建立当前分支。
这样本地仓库里面的内容就和远程仓库一样了。
见git命令即可。
1)如何解决There isn’t anything to compare?
原因:GitHub创建的初试分支是main,并且已经初始化了,然后本地的初试分支是master,当我们想把master分支合并到main分支上的时候就会出现这种情况。
解决方法1:把远程仓库的main分支改名为master分支,最好创建GitHub分支的时候别初始化。
解决办法2:
# 切换分支至master
git checkout master
# 强制重命名master分支为main分支
git branch main master -f
# 切换分支至main
git checkout main
# 强制推送本地main分支至远程库,并覆盖远程main分支内容
git push origin main -f
解决方法3:修改本地仓库默认的master分支为master分支(rename一下就可以)
2)如何解决We were unable to authorize you in GitHub. Sorry for inconvenience, please try again later. IDEA2021?
在idea中授权即可。
3)如果网上是别人GitHub的项目,如何拉取到本地idea中?
我们也可以直接通过 IDEA 拉取代码,依次进入 File -> New -> Project from Version Control,将我们在所复制的仓库库地址 url 填入 URL,然后 Version control 选择 Git,Directory 则是我们要存放该代码的本机路径,后面拉取下来的代码将放在该路径中。
4)IDEA的GIt显示不全远程分支或者不显示远程remote
idea右上方git拉取一下(update project就行)
5)关于Support for password authentication was removed on August 13, 2021报错的解决方案?
出现原因:从 2021 年 8 月 13 日开始,我们将在对 Git 操作进行身份验证时不再接受帐户密码,并将要求使用基于令牌(token)的身份验证,例如个人访问令牌(针对开发人员)或 OAuth 或 GitHub 应用程序安装令牌(针对集成商) 上所有经过身份验证的 Git 操作。 您也可以继续在您喜欢的地方使用 SSH 密钥。
解决方案:使用token登陆。
应用:在用命令行操作的时候,把token直接添加远程仓库链接中,这样就可以避免同一个仓库每次提交代码都要输入token了
git remote set-url origin https://
其中
注意:尖括号要去掉哈。 https://[email protected]/shliang0603/Yolov4_DeepSocial.git/
6)如何解决fatal: refusing to merge unrelated histories?
在你操作命令后面加 --allow-unrelated-histories。
eg:git merge master --allow-unrelated-histories
在Git里,这个分支叫主分支,即master分支/
git branch:列出所有分支;
git branch
git checkout
git merge
git branch -d
git tag
git tag: 查看所有标签。
GitHub合并分支的时候显示有conflict?
参考:Git 解决合并分支时的冲突 - 走看看
1)显示有冲突的现象
2)产生冲突的原因?
创建分支的时候,新分支的文件内容建立在原分支的基础上.我们以当前master分支做为基准分支,首先在master分支上新建一个第一个分支the_first_branch,然后在master分支上新建第二个分支the_second_branch,当我们修改the_first_branch上面内容的时候,把the_first_branch的修改merge得到master后,如果此时再去修改the_second_branch的内容,并且想把the_second_branch的修改merge到master上,就会产生冲突,因为当前的master是合并the_first_branch后的master,而不是原来单一的master了,也就是说这两个master是不一样的,这样会导致冲突产生。
3)如何解决冲突
方法一:解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。(删掉一些冲突的代码)
自己手动修改
删除这个不能合并的分支,重新在这个最新的master分支上面新建一个分支the_second_branch(new),修改the_second_branch(new)分支内容再次合并。
注意事项:如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
从远程拉取到本地的选项如何选择?
参考:如何选择(合并冲突)
第一个选项:Merge the incoming changes into the current branch:将传入的更改合并到当前分支中(常用);
merge 是非常好的,因为它是非破坏性的操作。现有的分支不会以任何方式改变。这避免了rebase(将在下面讨论)的所有潜在缺陷。也就是把远程仓库的master分支的内容拉取到本地仓库里面,比如说我们可以通过切换本地仓库为master分支,然后执行这条命令就可以保持本地仓库的master分支是远程仓库最新的内容。
第二个选项:Rebase the current branch on top of the incoming changes:在传入更改的基础上重新建立当前分支。
rebase, 这个命令会始终把你最新的修改放到最前头。比如你对主branch进行rebase以后, 你的所有修改就会在主branch当前所有的修改之前。你会更有信心保证你的代码运行畅通无阻。通过你自己的测试以后, 你就可以放心的把代码合并到主的branch里面了。
1:在idea右上角update project的时候,发现工作区/本地仓库当前被选中分支内容并没有改变?
可能是因为在GitHub上面被修改的分支没有添加到master分支上去,需要merge到master分支上去。
2.如何解决idea的update提示Can't Update No tracked branch configured for branch master or branch?
参考:解决方案
问题原因:git不知道你要pull远程的哪个分支。
解决办法:检查远程分支是否存在,如果存在,(可进行更具体配置,不展开)
输入命令git branch --set-upstream-to=origin/master
3.push to origin/master was rejected错误解决方案?
问题原因:远程仓库里面有初始化留下的readme等文件,而本地仓库没有,这样提交的时候就会产生上述问题。(一般发生在第一次提交项目的时候)
解决方案:
1.切换到自己项目所在的目录
2.在terminl窗口中依次输入命令:
git pull
git pull origin master
git pull origin master --allow-unrelated-histories
3.在idea中重新push自己的项目:
git push -u origin master -f
git init: 数据仓库初始化;
git config –global user.name “geekfanr”:设置提交仓库时的用户名信息;
git config –global user.email “[email protected]”: 设置提交仓库时的邮箱信
git config –-list :显示当前的Git配置。
git status: 查看工作区,暂存区状态;
git add
git commit -m “注释”
git log :查看历史记录;
git diff <文件名> :将工作区中的文件与暂存区进行对比
git branch:列出所有分支;
git branch
git checkout
git merge
git branch -d
git tag
git tag: 查看所有标签。
pull=fetch+merge
git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名] [远程分支名]
git reflog :查看分支引用记录(能够查看所有的版本号
git reset:版本回退(建议加上––hard 参数,Git 支持无限次后悔)
回退到上一个版本:git reset ––hard HEAD^
回退到上上一个版本:git reset ––hard HEAD^^
回退到上 N 个版本:git reset ––hard HEAD~N(N 是一个整数)
回退到任意一个版本:git reset ––hard 版本号
git clone:下载远程仓库到本地
下载远程仓库到当前路径:git clone 仓库的URL
下载远程仓库到特定路径:git clone 仓库的URL 存放仓库的路径
git pull:下载远程仓库的最新信息到本地仓库
git push:将本地的仓库信息推送到远程仓库
Fork的作用:ork的意思是从别人的代码库中复制一份到你自己的代码库,与普通的复制不同,fork包含了原有库中的所有提交记录,fork后这个代码库是完全独立的,属于你自己,你可以在自己的库中做任何修改,当然也可以通过Pull Request向原来的库提交合并请求。
Watch,就是关注,关注后,代码库中有新的commit你都会收到通知。
Star,与watch不同,star相当于收藏,你可以方便地找到你star过的库,但是不会收到关于那个库的任何通知。