git--操作大全

一、基本介绍

Git是一个文件版本管理工具,可以较为方便的进行文件管理,其为分布式的版本管理和同步软件

git只用于维护本地仓库,git也可以与远程代码托管中心进行联动,将本地仓库和远程仓库进行同步,远程仓库可以是GitHub或者国内的码云等

git是分布式的,即本地仓库有完整的版本记录,远程仓库同样也有,并且是通过版本编码进行链式追踪,类似区块链的概念

所以,如果本地库和远程库在建立联系前,分别有自己的版本,此时就应该选择或者强行覆盖一方,或者先进行合并再进行后续的操作

1.1 安装

直接官网下载安装包,按照正常软件安装方式即可安装完成

1.2 基本工作原理

img

  • git 的本地仓库有几个核心概念
    • 工作区,即电脑上正常的文件夹,用于日常工作
    • 暂存区,为一个临时存储区域,在代码修改后,可以先将修改添加到暂存区,等修改完毕后,再提交到本地仓库区
    • 版本库,即工作区目录下的隐藏文件夹.git,里面有用于存储暂存区的index文件,还有版本管理文件

1.3 基本工作流程

img

1.4 基本配置

  • 配置签名(即用户名和邮箱)

此处的用户名和邮箱,与远程代码托管中心的信息毫无关系,只是本地仓库使用的用户标示

#设置仓库级别的签名
git config user.name name
git config user.email youremail

#设置全局签名
git config --global user.name name
git config --global user.email youremail

1.5 基本命令介绍

1.5.1 查看本地仓库状态

包括当前所在分支,当前分支提交数量,当前工作区内是否有待提交变化,本质是展示 HEAD指向的分支仓库状态、暂存区状态,以及工作区有变化但尚未add的记录

git status 
1.5.2 查看版本提交记录
git log  #最全的方式展示commit日志
1.5.3 查看指定文件修改记录
git blame filename #展示指定文件的历史修改和提交记录

二、本地仓库使用

2.1 创建

2.1.1 命令创建本地仓库

为指定文件夹创建本地仓库

此处的文件夹,可以是全新的,也可以是存量的,因为初始化的本质只是在指定文件夹下面创建了.git文件夹(当然前提需要安装git,才能通过该文件夹进行版本和分支管理)

#以存量文件夹为基础,创建本地仓库
cd dirname
git init 

#直接创建文件夹及本地仓库
git init dirname #如果文件夹不存在,则会自动创建,类似将以上两个命令合并成一个命令
2.1.2 通过远程仓库创建本地仓库-clone

将远程仓库拷贝至本地仓库

  • clone即以远程仓库为模板,创建本地仓库
  • 默认会将远程仓库的所有分支clone下来,同时设置本地库的远程库,默认远程库别名是origin
git clone url  dirname  # 将远程url仓库拷贝到dirname文件夹,会自动为该文件夹创建.git

git clone url #将远程URL仓库拷贝到本地,并自动在当前文件夹下创建以远程仓库名称为名字的本地文件夹
  • 注意,clone的意思,即将远程仓库克隆到本地仓库
2.1.3 clone远程仓库的指定分支

clone会在本地创建仓库,同时设置本地仓库的远程库

也可指定clone的分支

git clone -b branchname url

2.2 工作区与暂存区交互

2.2.1 添加指定文件至暂存区追踪
git add filename  filename  filename  #可一次性添加多个

git add * #将当前文件夹下所有文件添加

git add *.js  #将所有js文件添加至staging area 暂存区
2.2.2 添加当前文件夹至暂存区
git add ./
  • 添加整个文件夹,包括子文件夹
git add dirname/
2.2.3 文件修改变化添加至暂存区

对某个文件修改后,需要先add将修改内容添加至暂存区,再使用commit提交至本地仓库

git add filename  #先提交至暂存区,即历史版本
2.2.4 将文件或文件夹从暂存区移除

即停止对某文件的变化追踪

git rm --cached filename #将指定文件从暂存区移除,停止追踪
2.2.5 将文件或文件夹从工作区及暂存区均移除

从暂存区移除,最后提交的话,也会从本地仓库内移除,可以认为暂存区就是一个修改延迟执行的机制,可以对即将修改的东西进行变更,最终确定后,再commit至本地仓库最终执行

git rm filename 
git rm -f filename  #强行删除,当以上领命删除不了的时候使用
2.2.6 重置暂存区

将暂存区重置到与上一次提交保持一致,但是此时工作区文件不会发生变化,相当于让暂存区与本地仓库当前版本对齐

git reset #重置当前暂存区,与上一次提交的时候保持一致

2.3 暂存区与本地仓库区交互

2.3.1 暂存区提交至本地仓库

将暂存区的变化,最终提交至本地仓库,生成一个版本号,或者提交记录

git commit  #会自动进入vim 编辑器,在编辑器中编写此次提交的描述,适用于可能需撰写较多备注内容的场景
git commit -m "comments" #不会自动进入vim编辑器,直接提交,适用于提交备注内容较少的场景
2.3.2 本地仓重置暂存区
git reset --soft [index]

2.4 分支操作

分支是git区分其他版本管理工具的一大特点,可以在本地创建分支,也可以在远程仓库创建,同时可以在分支之间进行切换,也可以在需要的时候进行分支合并,同时将合并结果在本地和远程仓库之间同步,感觉也是产品同学的一个文档管理工具

2.4.1 创建分支
git branch branch name
2.4.2 查看分支
git branch # 查看当前仓库所有分支,以及当前活跃分支(所在分支)
2.4.3切换分支
git chechout branchname #切换至指定分支
git checkout -b newbranchname #创建并切换至新分支
2.4.4 删除分支
git branch -d branchname #删除指定分支
2.4.5合并分支
2.4.5.1 merge

merge在合并的时候,不会动参与合并任何分支的历史commit记录及对应hash值,只是生成一个新的commit

git checkout branchnameA #首先切换到作为此次合并的主分支上
git merge branchnameB #会将指定分支合并到主分支,主分支目前一般是main,也可以是其他分支
2.4.5.4 rebase

rebase 并不会生成新的commit,而是对参与合并的分支的历史commit记录重新生成,最后融合两个分支的历史提交记录对应的hash值,使得最后的合并结果呈现线性状态

git checkout branchnameA
git rebase branchnameB 
2.4.5.3合并冲突

git不仅会合并 文件数量差异,同时也会合并同一文件内的内容差异

2.4.6 解决合并冲突

主要解决当合并分支的时候,文件内容冲突

  1. 首先修改冲突
  2. 然后使用add将修改标记为冲突已解决

2.5 版本切换

2.5.1 查看提交版本记录

主要查看的是commit的记录,而非暂存区的记录

git log #会展示较为全部的信息,但是只能展示该版本之前的提交记录
git log --pretty = oneline  #每个提交记录,单行展示
git log --oneline #展示更加简单,只会展示版本号的后几位,比较适用于只是查看提交message的
git reflog  #会展示每次提交记录对应的HEAD值,主要是可以展示 如果想回到某个版本,相对当前版本,需要移动的步数,可以展示所有的commit和reset历史
2.5.2 版本前进与回退

版本间的切换,本质是在移动版本的指针(HEAD),以下展开说明操作HEAD的几种方式

#1、基于索引值(推荐)
#index 即版本索引值,可以使用git reflog直接查看简短的索引值或者版本号
#hard 参数左右为撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
git reset --hard [index] 

#2、基于^符号
#该方法只能往后退,每一个^代表往后回退多少步(版本)
git reset --hard HEAD^ #回退到上一步(版本)
git reset --hard HEAD^^  #回退到上上步(版本)
git reset --hard HEAD^filename  #将某文件回退到上一个版本

#3、基于~符号
#该方法也是只能往后退,但相较于^,不用再多加^,直接后面跟想回退多少步(版本)即可
git reset --hard HEAD~2 #往前回退两个版本,
2.5.3 hard–soft–mixed

三种模式主要区别在于是否对工作区、暂存区、本地仓库进行版本回退操作

参数工作区暂存区本地仓库
soft不切不切(待commit)切换至指定版本
mixed不切(待add)同步切换切换至指定版本
hard同步切换同步切换切换至指定版本
  • soft
    • 不会改动工作区和暂存区的内容和状态,只会动本地仓库,将本地仓库的状态变到指定版本的状态,此时,工作区或暂存区相较于该指定版本的变动,均处于待commit状态
    • 本质只是移动了下本地库的版本指针
  • hard
    • 会强行将工作区和暂存区的内容和状态全部切换为指定版本的状态,这一般也是我们希望看到的
    • 即会移动版本指针,也会以指定版本重置暂存区(到指定版本对应的暂存区状态)
  • mix
    • 是以上两个命令的混合,即不会改动工作区,但会动暂存区,将暂存区调整到指定版本状态,此时工作区相较于指定版本的所有改动都处于 待add状态
2.5.4 永久删除文件的找回
  • 如删除操作已经提交至本地仓库,则可使用版本切换的方式
git reset --hard [index]
  • 如果只是加入到了暂存区,则可
2.5.5 查看指定文件的修改记录
git blame filename #会罗列出指定文件的所有历史修改记录

2.6 文件比较

2.6.1 查看尚未缓存的改动

会罗列出当前工作区内有修改但尚未缓存的所有文件及其内容差异(删除或添加)

本质是查看当前工作区文件内容与暂存区当前对应文件内容之间的差异点

git diff #列出所有有过内容修改的文件的对应修改差异
git diff filename #指定文件
2.6.2 查看已缓存的改动

本质是查看暂存区与本地仓库,当前状态 各个文件的内容差异

git diff --cached
git diff --cached filename #指定文件
2.6.3 查看尚未缓存与已缓存的所有改动

本质是罗列工作区与暂存区、暂存区与本地仓库之间的所有差异

git diff HEAD #与当前指针指向的版本对比
git diff [index] #与指定版本号的版本进行对比
git diff HEAD filename #指定文件

三、远程仓库

以下主要以GitHub为远程仓库为例,因为GitHub用的人最多

3.1 fork

fork即将感兴趣的库拿到自己的远程库内

直接在远程代码平台,找到库,然后点击fork即可,这样就可以自由的拉取和修改该库了

3.2 pull request

3.2 代码拉取方式介绍

  • HTTPS:

不需要设置ssh,只需要输入账号密码即可进行远程库的操作(pull、push、fetch),后面可能会逐步淘汰

  • ssh

需设置ssh,本地生成并添加到远程库,后续操作的时候需要输入所设置ssh的密码,推荐

四、本地和远程仓库同步

主要讲解本地和远程仓库之间进行文件和版本同步的操作

4.1 前期准备–配置git

4.1.1 本地创建ssh-key

主要是通过ssh的方式与远程仓库进行交互,后续https(即交互时需要登录远程仓库账号)方式会逐渐取消(GitHub)

ssh-keygen -t rsa -C "your_email@youremail.com" #邮箱填写远程仓库平台的邮箱
#会提示输入ssh的密码,后续使用时需输入此处设置的密码,如果不想后续每次操作都输入密码,则此处不填写密码
#然后查看.pub后缀文件内的内容,配置在GitHub即可(码云同样的操作流程)
4.1.2 验证ssh是否配置成功
ssh -T git@github.com  #terminal输入,会提示输入上一步设置的ssh本机密码,验证成功会提示successfully
4.1.3 为本地仓库添加远程仓库地址

需要为本地仓库创建远程仓库链接,才能进行后续操作

可为本地仓库添加多个远程仓库链接

#先进入本地仓库目录
cd dirname
git remote add [shortname]  url #shortname为远程仓库的别名,url即远程仓库的ssh 链接
4.1.4 查看本地仓库当前远程仓库

可通过命令查看当前本地仓库添加或者连接的远程仓库

git remote #查看当前添加的所有远程仓库的别名/名称
git remote -v #可查看当前本地仓库创建的所有远程仓库链接
4.1.5 删除本地仓库的远程仓库
git remote rm [shortname]
4.1.6 重命名本地仓库的远程仓库
git remote rename old_name  new_name  #重命名本为本地仓库添加的远程仓库的别名

4.2 本地至远程

  • 将本地仓库推送至远程库的时候,可以指定远程库,同时指定要推送的分支名
  • 如果本地仓库设置的远程库只有一个,且分支只有一个,可以简化为 git push
4.2.1 将本地仓库推送至远程仓库

将本地分支版本推送到远程仓库分支版本并合并,可指定推送的远程仓库、分支

git push [shortname] branchnameA:branchnameB  
#shortname为添加时为远程仓库起的别名,branchnameA 本地分支名 branchnameB为远程分支名
#如果本地你分支名和远程分支名相同,则可省略,如下
git push [shortname]  branchname
4.2.2 强制推送至远程仓库

慎用,如果本地仓库和远程仓库有差异,比如版本记录差异等,此时会强制使用本地仓库内容覆盖掉远程仓库内容

git push --force [shortname] branchnameA:branchnameB 
4.2.3 删除远程仓库指定分支

即可以在本地操作删除指定远程仓库的指定分支

git push [shortname] --delete  branchname #删除远程仓库指定分支

4.3 远程至本地

远程至本地(fetch或pull),因为是对远程仓库的读操作,所以一般不需要进行身份验证,但ssh还是需要

4.3.1 从远程仓库下载新分支与数据

此时会生成一个本地的版本库和HEAD,类似一个待合并的分支

git fetch [shortname] branchname #从远程仓库获取远程仓库有但本地仓库没有的新数据
git checkout FETCHHEAD #查看刚才fetch的最新数据
4.3.2 合并新数据

当拉取下来后,便可进行分支合并,类似本地分支合并的操作

git checkout branchname #首先切换到想合并到的分支
git merge [shortname]/branchname #合并分支
4.3.3 直接拉取并合并

会直接从指定远程库的指定分支 拉取最新数据并直接和本地仓库的当前分支进行合并

git pull [shortname] branchname #从shortname的远程库的branchname拉取新数据并合并
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值