【Git|GitHub|SSH|Sourcetree 上篇】Git环境搭建及核心概念学习

简介: 当下,几乎所有开发者都要接触版本控制系统(VersionControlSystem, 简称VCS), 这种工具让他们在分工合作时避免了不必要的重复与冲突,如果遇到什么问题,也可以及时回退到之前的版本。当今最流行的版本控制系统(至少在网络开发者中是这样的)是Git,和与之关联的编程社区网站GitHub、Gitee等等。我们很少独自完成一个项目,而在分工合作的同时我们都会有与他人的工作相冲突的风险:尤其是当两个人同时尝试修改同一段代码的时候。所以我们需要有相应的机制用以避免这种情况。
本人博客: 好吃懒洋洋的CSDN博客
【Git|GitHub|SSH|Sourcetree 下篇】

✅前言

当下,几乎所有开发者都要接触版本控制系统 ( Version Control System, 简称 VCS ), 这种工具让他们在分工合作时避免了不必要的重复与冲突,如果遇到什么问题,也可以及时回退到之前的版本。当今最流行的版本控制系统(至少在网络开发者中是这样的)是 Git,和与之关联的编程社区网站 GitHubGitee等等。

另外,版本控制系统在软件开发过程中是必不可少的:

  • 我们很少独自完成一个项目,而在分工合作的同时我们都会有与他人的工作相冲突的风险:尤其是当两个人同时尝试修改同一段代码的时候。所以我们需要有相应的机制用以避免这种情况。
  • 在开发一个项目的时候,我们希望能将代码及时保存,这样就可以避免像电脑突然崩溃辛苦全部白费这样的尴尬局面。
  • 如果后期发现了问题,我们可能还会需要退回更早的版本。有的小朋友也许想到可以通过创建一堆 Code_v1.js, Code_v2.js, Code_v3.js, Code_final.js, Code_really_really_final.js 之类的文件用于保存历史版本,但这个方法不妥,容易出错。
  • 不同的团队成员也会需要创建他们自己的独特的版本(在 Git 中叫做branches (分支)),他们在这里添加一些新的功能特性,然后通过一些可控的方法(在 GitHub 中我们使用 pull request (拉取请求))将它们贡献到原来的主干项目中。

版本控制系统提供了能够满足以上需求的工具。Git 是版本控制系统的典范,而 GitHub 是一个为个人或团队操作 Git 储存库 ( Git Repositories) 提供了 Git 服务器和一系列非常实用的工具的网站 + 基础设施。它提供了报告代码错误、检查工具以及分配任务和任务状态等项目管理工具等等。

❗️ ❗️ ❗️本篇短文将带你学习到Git环境搭建Git指令Git-FlowSSH公钥配对以及GitHub远程仓库部署等等

➡️下载安装:Git下载地址,个人推荐使用迅雷下载(亲测,超好用)

⭕️内容

🕐Git三大区初认识

  • Git本地有三个工作区域:

    • 工作目录(Working Directory)
    • 暂存区(Index) 在这里插入图片描述
    • 仓库区(Repository)
    • 另外加上远程的git仓库(Remote Repository)就可以分为四个工作区域,文件在这四个区域之间的转换关系如下:

在这里插入图片描述

🕜Git基本指令

为使用 Git,开发人员使用特定命令来复制、创建、更改和合并代码。 这些命令可以直接从命令行执行,也可以使用 GitHub Desktop等应用程序执行。 以下是使用 Git 的一些常用命令(其中会有一些演示操作,注意文件目录变化):

  • 配置用户信息
$ git config --global user.name "Your Name"             
$ git config --global user.email "youremail@163.com"

该指令可以进行覆盖操作,git config演示:
在这里插入图片描述
另外,输入git log可看到你的用户信息(即提交作者),前提时有提交记录
在这里插入图片描述

  • git init 初始化一个全新的 Git 存储库并开始跟踪现有目录。 它在现有目录中添加一个隐藏的子文件夹,所以这里我们需要按下面操作使其显现,该子文件夹包含版本控制所需的内部数据结构。

在这里插入图片描述

git init 演示:在这里插入图片描述

  • git clone 创建远程已存在的项目的本地副本。 克隆包括项目的所有文件、历史记录和分支。
  • git add 暂存更改。 Git 跟踪对开发人员代码库的更改,但有必要暂存更改并拍摄更改的快照,以将其包含在项目的历史记录中。 此命令执行暂存,即该两步过程的第一部分。 暂存的任何更改都将成为下一个快照的一部分,并成为项目历史记录的一部分。 通过单独暂存和提交,开发人员可以完全控制其项目的历史记录,而无需更改其编码和工作方式。
  • git commit 将快照保存到项目历史记录中并完成更改跟踪过程。 简言之,提交就像拍照一样。 任何使用 git add 暂存的内容都将成为使用 git commit 的快照的一部分。

📌Note:git commit -m "commit message",提交时按该指令进行提交

  • git status 将更改的状态显示为未跟踪、已修改或已暂存。

git-status-add-commit-log 演示 :
在这里插入图片描述
📌Note: 一张图带你加深对commitlog理解
在这里插入图片描述

  • git branch 显示正在本地处理的分支。
  • git merge 将开发线合并在一起。 此命令通常用于合并在两个不同分支上所做的更改。 例如,当开发人员想要将功能分支中的更改合并到主分支以进行部署时,他们会合并。
  • git pull 使用远程对应项的更新来更新本地开发线。 如果队友已向远程上的分支进行了提交,并且他们希望将这些更改反映到其本地环境中,则开发人员将使用此命令。
  • git push 使用本地对分支所做的任何提交来更新远程存储库。

📌Note: 一个按键小技巧分享给大家
在这里插入图片描述以上均为git最最常用指令,如果是第一次接触git,可能此时脑袋已经懵了,但千万不要着急,上面的统统不需要背,忘记时查询即可;此外,下面还有比较常用到的指令大全;最后,如要继续学习其它指令,可到git官方网站查询

📢📢📢最最重要的来了:==本文后续操作都在Visual Studio Code编译器中进行,即将git init的文件夹用该编译器打开==

🕙git 常用命令

◻️仓库

在当前目录新建一个Git代码库
$ git init
新建一个目录,将其初始化为Git代码库
$ git init [project-name]
下载一个项目和它的整个代码历史
$ git clone [url]

◻️增加/删除文件

添加指定文件到暂存区
$ git add [file1] [file2] ...
添加指定目录到暂存区,包括子目录
$ git add [dir]
添加当前目录的所有文件到暂存区
$ git add .
添加每个变化前,都会要求确认
对于同一个文件的多处变化,可以实现分次提交
$ git add -p
删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]

◻️代码提交

提交暂存区到仓库区
$ git commit -m [message]  “message”在引号内
提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
提交时显示所有diff信息
$ git commit -v

◻️查看信息

显示有变更的文件
$ git status
显示当前分支的版本历史
$ git log
搜索提交历史,根据关键词
$ git log -S [keyword]
显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
显示指定文件相关的每一次diff
$ git log -p [file]
显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]
显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"
显示某次提交的元数据和内容变化
$ git show [commit]
显示当前分支的最近几次提交
$ git reflog

◻️分支

列出所有本地分支
$ git branch
列出所有远程分支
$ git branch -r
列出所有本地分支和远程分支
$ git branch -a

建立分支:

新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
新建一个分支,并切换到该分支
$ git checkout -b [branch]
新建一个分支,指向指定commit
$ git branch [branch] [commit]
切换到指定分支,并更新工作区
$ git checkout [branch-name]
切换到上一个分支
$ git checkout -
合并指定分支到当前分支
$ git merge [branch]
选择一个commit,合并进当前分支
$ git cherry-pick [commit]
删除分支
$ git branch -d [branch-name]

◻️标签

列出所有tag
$ git tag
新建一个tag在当前commit
$ git tag [tag]
新建一个tag在指定commit
$ git tag [tag] [commit]
删除本地tag
$ git tag -d [tag]
查看tag信息
$ git show [tag]
提交指定tag
$ git push [remote] [tag]
提交所有tag
$ git push [remote] --tags

◻️远程同步

下载远程仓库的所有变动
$ git fetch [remote]
显示所有远程仓库
$ git remote -v
显示某个远程仓库的信息
$ git remote show [remote]
增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]

拉取请求(pull request):

取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]   //远程仓库remote默认名为 origin相当于一个指针指向改地址
允许不相关历史提交,并强制合并
$ git pull origin master --allow-unrelated-histories

推送给remote repository:

上传本地指定分支到远程仓库
$ git push [remote] [branch]   //远程仓库remote默认名为 origin
强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force
推送所有分支到远程仓库
$ git push [remote] --all

◻️撤销

恢复暂存区的指定文件到工作区
$ git checkout [file]
恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]
恢复暂存区的所有文件到工作区
$ git checkout .

重置命令:

重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]
重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard 
重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]
重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]
重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]

🕥 忽略文件配置(.gitignore)

首先,看到这个名字,肯定会有疑惑什么是.gitignore文件?gitignore文件的用途是什么?

首先,我们要清楚当前运行的Git存储库中的每个文件都有以下状态之一:

  • tracked:这些是Git所知道的所有文件或目录。这些是新暂存(用 git add 添加的)和提交(用 git commit 提交的)到主仓库的文件和目录。
  • untracked:这些是在工作目录中创建的任何新文件或目录,但还没有暂存(或使用git add命令添加)。
  • ignored:这些是Git在Git存储库中完全排除、忽略和不知道的所有文件或目录。从本质上说,这是一种告诉Git哪些未跟踪的文件应该保持不跟踪且永远不提交的方式。

所有被忽略的文件都被放置在 .gitignore 文件里。.gitignore 文件是一个纯文本文件,它包含来自项目的所有指定文件和文件夹的列表,Git应该忽略和不跟踪这些文件和文件夹。在 .gitignore 内部,您可以通过提到特定文件或文件夹的名称或模式,告诉Git只忽略单个文件或文件夹。您还可以使用相同的方法告诉Git忽略多个文件或文件夹。

  • 配置语法:

    • 以斜杠“/”开头表示目录;
    • 以星号“*”通配多个字符;
    • 以问号“?”通配单个字符;
    • 以方括号“[]”包含单个字符的匹配列表;
    • 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
示例 解释
\# 此为注释 表示注释, 将被忽略
====或==/== *代表所有,即忽略.gitignore所在根目录下所有文件
*.html 忽略所有后缀名为.html的文件
file1/* 忽略 file1下面的所有文件
file1/*.css 会忽略 file1/ 目录内的所有后缀名为.css的文件, 但不包括子目录的
!.js 不忽略所有后缀名为.js的文件

Note:git 对于 .gitignore 配置文件时是按行从上到下进行规则匹配的,即如果上面的配置范围较大时,下面的配置可能无效

下面为可能无效原因:
在这里插入图片描述

在这里插入图片描述

🕖分支创建、合并、合并冲突

  • 分支简介

为了真正理解 Git 处理分支的方式,我们需要回顾一下 Git 是如何保存数据的。或许你还记得起步的内容, Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照

在进行提交操作时,Git 会保存一个提交对象(commit object)。 知道了 Git 保存数据的方式,我们可以很自然的想到——该提交对象会包含一个指向暂存内容快照的指针。 但不仅仅是这样,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。 首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象
在这里插入图片描述
📌Note: Git 的 master 分支并不是一个特殊分支。 它就跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它,并且大多数人都懒得去改动它。

  • 分支合并冲突问题

当分支merge时,如果分支A的某个文件只是在分支B的该文件上进行了一些修改,当这两个分支合并时,便会出现以下情况,此时我们进入了另一个页面,相当于时对这次合并出现的分支conflict进行处理

图1:
在这里插入图片描述
该页面我们只需要在图中step1中输入该冲突的备注信息,相当于前文当中commit是的“commit message”

图2:

在这里插入图片描述
此时是在VScode编译器中解决具体冲突

🔳总结

好的,上篇就介绍到这里,内容可能有点多,但概念还是比较简单,下篇我们将带来GitHub、Sourcetree、SSH以及Git-flow工作流等知识,敬请期待,byebye👋👋👋

相关文章
|
1月前
|
弹性计算 算法 安全
SSH学习(一)- 概念了解
整体上对SSH协议进行一个概括了解。
41 3
|
2月前
|
数据可视化 项目管理 开发工具
使用SourceTree可视化更新git代码
使用SourceTree可视化更新git代码
|
2月前
|
人工智能 运维 Linux
一文了解IntelliJ IDEA如何使用git上传代码到GitHub(附常见问题解决方案)
一文了解IntelliJ IDEA如何使用git上传代码到GitHub(附常见问题解决方案)
80 0
|
2月前
|
安全 Shell 网络安全
【Git】TortoiseGit(小乌龟)配置SSH和使用
【Git】TortoiseGit(小乌龟)配置SSH和使用
135 0
|
1月前
|
缓存 开发工具 数据安全/隐私保护
通过一篇文章带你玩转git和GitHub
在现代软件开发中,版本控制系统是不可或缺的工具。Git和Github是其中最受欢迎的组合。Git是一个开源的分布式版本控制系统,用于追踪代码的改动,而Github则是一个基于Git的代码托管平台,提供了代码托管、协作开发等功能。
81 2
通过一篇文章带你玩转git和GitHub
|
1月前
|
Linux 开发工具 git
Git与GitHub:解锁版本控制的魔法盒子
Git与GitHub:解锁版本控制的魔法盒子
30 1
|
1月前
|
存储 安全 网络安全
Git 安全远程访问:SSH 密钥对生成、添加和连接步骤解析
SSH(Secure Shell)是一种用于安全远程访问的协议,它提供了加密通信和身份验证机制。在使用 SSH 连接到远程 Git 存储库时,您可以使用 SSH 密钥对来确保安全性。以下是关于如何生成和使用 SSH 密钥对的详细步骤: 生成 SSH 密钥对
98 2
|
1月前
|
存储 弹性计算 算法
SSH学习(三)- SSH协议中的Public Key Algorithm
在SSH协议中,有两个地方涉及到公钥算法,分别是: 1. 服务端认证:服务端在进行密钥协商的时候证明自己身份,防止中间人攻击,此时为SSH-TRANS协议发生的事情; 2. 客户端认证:客户端通过PublicKey方式证明自己身份,完成SSH登录认证,此时SSH-USERAUTH发生的事情; 这两种情况下的公钥算法使用的是同一个概念,接下来本文将主要基于PublicKey公钥认证方式,学习对应的内容。
39 1
SSH学习(三)- SSH协议中的Public Key Algorithm
|
2月前
|
Linux 开发工具 git
【开发专题_03】unable to access ‘https://github.com/deviantony/docker-elk.git/‘: Failed connect to github
【开发专题_03】unable to access ‘https://github.com/deviantony/docker-elk.git/‘: Failed connect to github
|
2月前
|
安全 Shell 网络安全
Git学习---Git快速入门、Git基础使用、Git进阶使用、Git服务器使用(IDEA集成GitHub、Gitee、GitLab)、GitHub Desktop客户端
Git学习---Git快速入门、Git基础使用、Git进阶使用、Git服务器使用(IDEA集成GitHub、Gitee、GitLab)、GitHub Desktop客户端
130 0