# 一、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

  1. 在本地新建文件夹下打开Git Bash。

  2. 粘贴以下文本,替换为您的GitHub电子邮件地址。

    $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    
  3. 将SSH私钥添加到ssh-agent。如果您使用其他名称创建密钥,或者要添加具有其他名称的现有密钥,请使用私有密钥文件的名称替换命令中的id_rsa

$ ssh-add ~/.ssh/id_rsa

​ ③Add the SSH key to your GitHub account.

  1. 将SSH密钥复制到剪贴板。

    如果SSH密钥文件的名称与示例代码的名称不同,请修改文件名以匹配当前设置。复制密钥时,请勿添加任何换行符或空格。

    $ clip < ~/.ssh/id_rsa.pub
    # Copies the contents of the id_rsa.pub file to your clipboard
    

    **提示:**如果clip不起作用,则可以找到隐藏的.ssh文件夹,在您喜欢的文本编辑器中打开文件,然后将其复制到剪贴板。

  2. 在任何页面的右上角,点击您的个人资料照片,然后点击设置。(In the upper-right corner of any page, click your profile photo, then click Settings.)

  3. 在用户设置边栏中,点击SSH和GPG密钥。(In the user settings sidebar, click SSH and GPG keys.)

  4. 单击“ **新建SSH密钥”**或“ 添加SSH密钥”。(Click New SSH key or Add SSH key.)

  5. 在“标题”字段中,为新密钥添加一个描述性标签。例如,如果您使用的是个人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".)

  6. 将您的密钥粘贴到“密钥”字段中。(Paste your key into the "Key" field.)

  7. 单击添加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

Last Updated: 7/15/2020, 10:34:45 PM