# 一、Git命令行操作
# ①本地操作
# 1、本地库初始化
git init
#初始化本地库
#注意:.git目录中存放的是本地库相关的子目录和文件,不要删除也不要修改。
# 2、设置签名
形式:用户名:xxx Email地址:xxx@xxx.com
作用:区分不同开发人员的身份,这里的用户名和email地址与远端库的账号密码没有任何关系
git config user.name xxx
git config user.email xxx@xxx.com
#信息保存位置:./.git/config文件
##项目级别/仓库级别:仅在当前本地库范围内有效
git config --global user.name xxx
git config --global user.email xxx@xxx.com
#信息保存位置:当前系统家目录/.gitconfig文件
##系统用户级别:登陆当前操作系统的用户范围
#优先级就近原则:项目级别优先于系统用户级别
#必须要有两者之一的级别签名,否则不允许
# 3、添加
将工作区的“新建/修改”添加到暂存区
git add 文件名.后缀名
# 4、查看状态
查看工作区、暂存区的状态
git status
#绿色是已被add到暂存区,可以继续执行commit,也可以把它从暂存区移除
#红色是没有add到暂存区
###如果是已被commit的文件,然后被修改了,会自动检测到被修改此时也是查看状态红色,需要重新add再commit的操作(或者是直接"git commit -a")。其中add再commit分步的操作中,执行add之后,还可以执行'git reset HEAD 文件名.后缀名'来撤回add操作。
# 5、提交
将暂存区的内容提交到本地库
git commit -m "注释信息" 文件名.后缀名
# 6、从暂存区移除
git rm --cached 文件名.后缀名
# 7、日志查看
多屏显示控制方式:空格向下翻页,按b向上翻页,按q退出
git log
#每个记录全部信息显示
git log --pretty=oneline
#每条记录显示一行且完整哈希值显示
git log --oneline
#每条记录显示一行且七位哈希值显示(只显示当前版本以前的版本)
git reflog
#显示了HEAD版本指针需要移动的次数
# HEAD@{移动到当前版本需要的步数}
# 8、版本前进后退
reset命令的三个参数对比
--soft:仅仅在本地库移动HEAD指针
暂存区 | 工作区 | |
---|---|---|
本地库 |
此时只有本地库后退版本,暂存区与工作区相对没有变,所以git status的话会显示绿色
--mixed:在本地库移动HEAD指针,重置暂存区
工作区 | ||
---|---|---|
本地库 | 暂存区 |
此时,本地库和暂存区后退版本,暂存区和工作区有差异,相当于是工作区被修改,所以git status的话会显示红色
--hard:在本地库移动HEAD指针,重置暂存区,重置工作区
本地库 | 暂存区 | 工作区 |
- [x] 基于索引值操作[推荐]
git reset --hard 索引哈希值的一部分
#例如:
#git reset --hard a6ace91
- [x] 使用^符号:只能后退
git reset --hard HEAD^
#注:一个^符号表示后退一步,n个^符号表示后退n步
- [x] 使用~符号:只能后退
git reset --hard HEAD~n
#注:表示后退n步
# 9、删除文件并找回
前提:删除时,文件存在时的状态提交到了本地库
操作:git reset --hard [指针位置]
- 删除操作已经提交到本地库:指针位置指向历史记录
- 删除操作尚未提交到本地库:指针位置使用HEAD
# 10、比较文件差异
git diff [文件名]
#将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本] [文件名]
#将工作区中的文件和本地库历史记录比较
git diff HEAD
#不带文件名比较工作区中的所有文件
# ②远程库操作
# 1、创建本地库使用
使用git init初始化
# 2、创建远程库
github上面新建远程仓库
# 3、在本地创建远程库地址别名
git remote add 别名 github上的https下载地址
#在git本地保存一个以后的要使用的远程仓库地址,并且取一个别名
git remote -v
#查看保存的远程地址
# 4、推送操作
git push 别名 分支名
# 5、克隆操作
git clone github上的https下载地址
- 完整的把远程库下载到本地
- 创建好之前起好的远程地址别名
- 初始化本地库
# 6、邀请加入团队
在github仓库界面,点Settings,再点Collaborators,然后输入需要邀请的用户的github账号。
在被邀请用户中接受邮件,点击相应链接,然后完成邀请。
最后被邀请用户就可以通过git push对仓库进行推送操作了。
# 7、远程库修改的两种拉取方式
- 是fetch和merge操作的合并,所以fetch+merge=pull
方式一:用fetch和merge操作
#1.抓取远程仓库修改的数据到本地分支上(读操作不需要密码),使用过后本地文件并没有变(抓取到本地的<远程地址别名/分支名>上)需要被合并到本地开发分支上
git fetch <远程地址别名> <分支名>
#2. 切换分支到远程仓库的分支上,可以查看刚才拉取的数据,可进行相应的检查修改之类的操作
git checkout <远程地址别名/分支名>
#3.再切换到本地分支上
git checkout <分支名>
#4.将远程分支合并到本地分支上,即本地文件就有了拉取的内容了
git merge <远程地址别名/分支名>
方式二:直接使用pull一步到位
git pull 远程地址别名 分支名
# 8、团队协作开发时冲突的解决
git push 远程地址别名 分支名
#如果远程仓库文件内容和本地文件内容有冲突,执行push之后会报错,需要pull一下
git pull 远程地址别名 分支名
#pull之后进入MERGING(合并中)的状态,进入文件中出现了冲突的表现,需要把特殊符号删除修改之后再进行合并
<<<<<<< HEAD
xxxxxxxx edit by a
=======
xxxxxxxx edit by b
>>>>>>> e85bff69c91a3ba196cb37315e57020d9fd27aec
#然后就和本地分支冲突解决一致
git add 文件名
git commit -m "注释信息" #(注意:不需要加文件名!!)
#再重新push到远程仓库
git push 远程地址别名 分支名
# 9、跨团队协作fork操作
帮助的人在被帮助人的github上点击fork,然后再帮助人的仓库中有了项目
#1.帮助的人把自己仓库的项目克隆到本地
git clone github上fork后的的https下载地址
#2.本地修改并提交到本地库
git commit -m "注释信息" 文件名
#3.推送到帮助的人的远程仓库中
git push 帮助人的远程地址别名 分支名
#4.帮助人点击pull request,在点new pull request,再点create pull request、
#5.被帮助人再点击pull request,然后审核代码,最后Merge pull request合并代码。
#6.被帮助的人将远程库修改拉取到本地
git pull 被帮助人的远程地址别名 分支名
# 10、通过ssh免密登陆克隆到本地
一、本地新建一个文件夹
二、添加新的shh密钥
①Checked for existing SSH keys
②Generated a new SSH key and added it to the ssh-agent
在本地新建文件夹下打开Git Bash。
粘贴以下文本,替换为您的GitHub电子邮件地址。
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
将SSH私钥添加到ssh-agent。如果您使用其他名称创建密钥,或者要添加具有其他名称的现有密钥,请使用私有密钥文件的名称替换命令中的id_rsa。
$ ssh-add ~/.ssh/id_rsa
③Add the SSH key to your GitHub account.
将SSH密钥复制到剪贴板。
如果SSH密钥文件的名称与示例代码的名称不同,请修改文件名以匹配当前设置。复制密钥时,请勿添加任何换行符或空格。
$ clip < ~/.ssh/id_rsa.pub # Copies the contents of the id_rsa.pub file to your clipboard
**提示:**如果
clip
不起作用,则可以找到隐藏的.ssh
文件夹,在您喜欢的文本编辑器中打开文件,然后将其复制到剪贴板。在任何页面的右上角,点击您的个人资料照片,然后点击设置。(In the upper-right corner of any page, click your profile photo, then click Settings.)
在用户设置边栏中,点击SSH和GPG密钥。(In the user settings sidebar, click SSH and GPG keys.)
单击“ **新建SSH密钥”**或“ 添加SSH密钥”。(Click New SSH key or Add SSH key.)
在“标题”字段中,为新密钥添加一个描述性标签。例如,如果您使用的是个人Mac,则可以将此键称为“个人MacBook Air”。(In the "Title" field, add a descriptive label for the new key. For example, if you're using a personal Mac, you might call this key "Personal MacBook Air".)
将您的密钥粘贴到“密钥”字段中。(Paste your key into the "Key" field.)
单击添加SSH密钥。(Click Add SSH key.)
三、在github项目页面上拷贝ssh的链接
git@github.com:rayhomie/webproject.git
四、在本地新建文件夹中使用cmd命令行
git clone git@github.com:rayhomie/webproject.git
# 二、Git分支管理
# ①什么是分支管理
在版本控制过程中,使用多条线同时进行推进多个任务。
# ②分支管理的好处
# 1、同时推进多个功能的开发,提高开发效率。
# 2、各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。彼此互相独立。
# ③分支命令操作
# 1、创建分支
git branch 分支名
# 2、查看分支
git branch -v
# 3、切换分支
git checkout 分支名
# 4、合并分支
#步骤一:切换到需要被修改的分支(被合并的,可以理解为主线)上
git checkout 分支名1
#步骤二:执行merge命令
git merge 分支名2
#总结:此时就是'分支2'的内容合并到了'分支1'上面
# 5、解决冲突
冲突的表现:
<<<<<<< HEAD
hhhhhhhhhh edit by hot_fix #当前分支内容
=======
hhhhhhhhhh edit by master #另一分支内容
>>>>>>> master
冲突的解决:
- 第一步:编辑文件,删除特殊符号
- 第二步:把文件修改到满意为止,保存退出
- 第三步:git add 文件名
- 第四步:git commit -m "注释信息"(注:此时commit后面一定不能带具体文件名)
# ④git rebase 变基
git rebase 的两个用途:
- git合并代码方式主要有两种方式,分别为:
- merge处理合并代码,这是大家比较能理解的方式。
- rebase处理合并代码,中文此处翻译为衍合过程。
- 合并多次commit
git rebase -i [startpoint] [endpoint]
其中-i
的意思是--interactive
,即弹出交互式的界面让用户编辑完成合并操作,[startpoint]
[endpoint]
则指定了一个编辑区间,如果不指定[endpoint]
,则该区间的终点默认是当前分支HEAD
所指向的commit
(注:该区间指定的是一个前开后闭的区间)。
在查看到了log日志后,我们运行以下命令:
git log # 查看提交日志
git rebase -i 36224db # 合并 HEAD 到 36224db 之间的提交
# or或者
git rebase -i HEAD~3 # 合并 HEAD前三次 所有的提交
- pick:保留该commit(缩写:p)
- reword:保留该commit,但我需要修改该commit的注释(缩写:r)
- edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- squash:将该commit和前一个commit合并(缩写:s)
- fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
- exec:执行shell命令(缩写:x)
- drop:我要丢弃该commit(缩写:d)
按照上面的命令根据我们的需求,我们修改vim编辑器上面没有注释的部分,即可。
# ⑤git revert 反做
参考:Git恢复之前版本的两种方法reset、revert(图文详解)
如果我们先要撤销提交操作的话,目前有两种方法回退(reset)、反做(revert)
# 回退
回退是指退到过去的某个版本,现在版本到该版本之间的提交都将被放弃
# 反做
原理: git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:
适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法
git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb9861
反做之后会产生一个新的提交。
# 三、Git基本原理
# ①哈希
是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
①不管输入数据的数据量有多大,输入同-一个哈 希算法,得到的加密结果长度固定。
②哈希算法确定,输入数据确定,输出数据能够保证不变。
③哈希算法确定,输入数据有变化,输出数据一定有变化, 而且通常变化很大。
④哈希算法不可逆。
Git底层采用的是SHA-1算法。
# ②Git保存版本的机制
Git把数据看作是小型文件系统的一组快照。每次提交更新时Git都会对当前项目中的全部文件制作一个快照并保存这个快照的索引。为了高效,如果项目中的文件没有修改,git不再重新存储该文件,而是只保留一个链接指向之前储存的文件,只去创建当前改变了的文件的快照。所以git的工作方式可以称之为快照流。
# ③Git分支管理的本质是创建和移动指针
很大程度提高了开发效率
学习链接:https://www.bilibili.com/video/BV1pW411A7a5?p=1