Git的基础使用

133 阅读11分钟

简介

git定义:Git是目前世界上最先进的分布式版本控制系统(没有之一)。

特点:高端大气上档次

版本控制系统:不但能自动记录每次文件的改动,还可以让同事协作编辑

安装git

1.地址:git-scm.com/downloads

2.备注:在安装的过程中,所有选项使用默认值即可。

3.成功标志:右键出现Git标志

创建SSH Key

1.命令创建ssh

命令:ssh-keygen -t rsa -C "youremail@example.com"

注:输入命令后一路回车,使用默认值即可

img

2.找到秘钥对

在c盘中的用户目录下admin目录下找到.ssh目录,其中里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

3.github添加key

操作路径:右上角头像---settings---SSH and GPG keys---New SSH key

Title可以填任意名字

key文本中粘贴id_rsa.pub 文件的内容

点击”Add SSH key“

注:GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送

配置信息

即:在本地第一次用git时需要配置信息

工作目录:被Git管理的项目目录

使用前配置信息:

\1. 配置提交人姓名: git config --global user.name 张三(提交人名字)

\2. 配置提交人姓名: git config --global user.email 111111111@qq.com(提交人邮箱)

\3. 查看git配置信息: git config --list

注意:修改配置信息,只需重复命令

上传项目

注:即本地没有仓库,想要把本地项目上传到github

1.在github上新建一个仓库用于存储本地的项目

2.在本地建立git仓库

命令:git init

显示仓库:左上角【组织】-【文件夹和搜索选项】-【查看】-显示隐藏的文件、文件夹或驱动器

2.查看文件状态--(在工作目录(红色)还是暂存区(绿色))

命令:git status

3.把文件放置到暂存区

命令:git add 文件名 //(git add .// 表示放置文件夹的全部内容)

4.把文件放置到本地仓库

命令:git commit -m 第一次提交(提交信息)

5.把文件放置到线上仓库

命令:git push -u github.com/用户名/仓库名字.gi… master(分支名称)

注意:

  • 第一次提交需要输入账号和密码

  • -u 记住推送地址及分支

  • -f 表示强制推送,当推送期间报错时,可以使用强制推送,但是会有严重后果

  • 修改后更新文件,只需重复上述代码,同一仓库下次推送只需要输入git push即可

6.查看提交记录

命令:git log

克隆项目

注:即在本地没有项目,想要克隆github仓库中的项目到本地进行开发

1.第一次克隆线上仓库

命令:git clone github.com/用户名/仓库名字.gi…(仓库地址)

2.第二次后只拉取更新后的文件

命令:git pull 远程仓库地址 分支名称 (可以简化为git pull)

分支管理

分支概念

分支概念:git中的分支非常的轻量,可以把分支当成一个文件,文件里面记录了分支所指向的commit id

master概念:项目每次提交,git会把它们串成一条时间线,叫主分支,即master,其中HEAD指向master,master指向最新提交

git-br-initial

新建分支

新建分支:当在项目里新建一个test分支时,master和test都会指向同一个提交,而HEAD是一个特殊的指针,他永远指向你当前所在的位置,用于表示当前分支在test上

命令:git branch dev

)image

分支操作

分支操作:当当前分支在dev上时,工作区的修改和提交时针对于dev分支,操作一次,dev指针向前移动一步,而master指针不动(test分支一样),分支操作需要提交后才能保存到仓库,才能进行切换分支操作

git-br-dev-fd

1.切换分支

命令:git checkout master或git switch master

注:当在dev分支上修改了原文件,但是没有提交到仓库的前提下,把分支切换熬master分支上时,master分支可以看到dev分支修改的内容。原因:对于分支来说,工作区和暂存区是公共,未进行提交时,相当于在本地修改了文件,仓库并不能保存所做的修改

2.创建并切换到dev分支

命令:git checkout -b dev或git switch -c dev(相当于两条命令)

3.查看当前分支

命令:git branch (后面加-v参数表示详细信息)

分支合并

概念:当在dev分支上的工作完成后,可以把dev合并到master上,合并分支有三种方法,分别是merge、rebase、cheer-pick

merge

merge方法:merge合并分支有三种区别,分别是fast-forward、no-ff、squash

fast-forward

概念:即快速合并。当待合并的分支在当前分支的下游,也就是没有分叉时,会产生快速合并。该模式下,删除分支后,会丢掉分支信息。

思路:从test分支切换到master分支,然后直接把master指向dev的当前提交,完成合并。

命令:

git checkout master

git merge test

操作演示:

image

no-ff

概念:即非快速合并,只需加上--no-ff参数。当不想快速合并时,可以强制指定为非快速合并

思路:从test分支切换到master分支,在master分支上新建一个提交节点,然后把master指向该节点,完成合并。

命令:

git checkout master

git merge –no-ff test

演示

iamge

squash

概念:svn的合并分支时采用的就是这种方式

思路:squash会在当前分支新建一个提交节点,squash和no-ff非常类似,区别只有一点不会保留对合入分支的引用

命令:

git checkout master

git merge –squash test

演示:

image

分支删除

注:开发时不需要删除分支,开发完成后可删除分支

删除dev分支:当dev和master合并完后,可以删除dev分支,则剩下一条master分支

命令:git branch -d dev

git-br-rm

分支总结

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>或者git switch <name>

创建+切换分支:git checkout -b <name>或者git switch -c <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

分支冲突

冲突描述

描述:在dev分支上进行开发,开发完在分支上进行提交,然后切换到master分支,并在master分支上进行修改,修改后在master分支进行提交,演示如下

git-br-feature1

当分支冲突并进行了合并操作时,Git用以下方法标记出不同分支的内容

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
解决冲突

思路:把Git合并失败的文件手动编辑为我们希望饿内容,在提交,图解如下

image

拓展:

查看分支合并图

命令: git log --graph --pretty=oneline --abbrev-commit

分支分类

bug分支

应用场景:需要修复bug时创建该分支

1.修复bug时,需要通过创建新的bug分支进行修复,然后合并分支,最后删除bug分支

2.当有工作未完成时,要把工作现场git stash一下,然后进行第一点操作,修复bug,再git stash pop回到工作现场

3.在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

feature分支

应用场景:当有新功能添加时创建该分支

1.需要新增功能时,需要通过创建新的feature分支进行可开发,然后合并dev分支,最后删除feature分支

2.当要丢弃一个没有被合并过的分支,需要通过git branch -D feature强行删除

团队开发流程

fork团队项目

描述:将公司项目fork 到自己的github

操作路径:打开负责人给的项目链接---点击项目中右边的fork按钮

注:fork 即创建源项目代码库的分支,并拷贝到自己的账号中。

查看自己的仓库

描述:切换到自己的github中,查看是否存在已fork的项目

克隆项目到本地

描述:在本地工作目录区克隆自己github中的项目

实现步骤:

1.在本地新建一个空文件夹,命名和项目名一致

2.克隆项目:git clone github.com/H3-eng/test…

注:git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快(创建ssh参考上面操作)

3.可选操作

  • 查看远程分支:git branch(此时显示只有master分支)

管理远程主机

  • 列出所有远程主机(名字): git remote
  • 显示更详细的信息(名字+网址):git remote -v
  • 添加远程主机:git remote add main git@github.com:michaelliao/learngit.git
  • 删除远程主机:git remote rm main(主机名)
  • 远程主机重命名:git remote rename main(原主机名) mainner(新主机名)
  • 注意:克隆仓库时,所使用的远程主机自动被命名为origin

dev分支进行开发

1.创建并切换dev分支:git checkout -b dev或git switch -c dev

2.查看当前分支:git branch (*表示当前分支)

3.查看分支追踪仓库:git branch -vv

4.设置分支跟踪远程分支:git branch --set-upstream-to=main/master dev

5.拉去跟踪分支的代码:git pull

项目合并

1.开发完成后正常进行提交操作(add、commit)

2.切换到主分支(master):git checkout master或git switch master

3.master合并dev分支:git merge dev

4.删除分支:git branch -d dev(可选操作)

5.上传代码到自己github:git push

6.在自己的github提交请求合并代码

版本回退

1.查看文件提交的历史记录

命令:git log

注:git log命令显示从最近到最远的提交日志,添加--pretty=oneline参数可以省略部分的显示信息

命令:git log --pretty=oneline

2.回退到上一个版本

注:在git中用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

命令:git reset --hard HEAD^

3.重新恢复被去除的版本

命令:git reset --hard 64ec117

注:64ec117表示版本号,版本号只需前几位即可,git会自动去找

方法一:命令行窗口没有被关掉,可以找到被去除的版本ID

方法二:命令行窗口关闭

命令:git reflog

注:该命令用来记录每次的提交信息

撤销操作

1.checkout撤销操作

命令: git checkout -- new.txt

注:

场景一:一种是new.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

场景二:一种是new.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

2.reset撤销操作

注:可以把暂存区的修改撤销掉,重新放回工作区

命令:git reset HEAD new.txt

命令:git checkout -- new.txt (撤销工作区的修改)

3.文件提交到本地仓库后撤销操作

注:即版本回退

总结:

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

删除文件

1.删除步骤

(1)手动删除文件

(2)使用命令删除仓库的文件

命令:git rm new.txt

参考来源:

廖雪峰老师的git教程: <www.liaoxuefeng.com/wiki/896043…