【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👋👋👋

相关文章
|
2月前
|
编解码 Oracle Java
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
80 3
|
5月前
|
存储 JavaScript Linux
Git秘籍大公开:从基础概念到高级技巧的全面解析
在软件开发的征途中,Git如同导航明灯,以其分布式、高效的特性引领着团队前行。本篇博客将带您走进Git的世界,从诞生背景到核心操作流程,一一揭秘。我们将深入讲解工作区、暂存区、仓库区的概念,并详述Git单人本地仓库的操作步骤,包括创建、配置、提交、版本管理等。此外,还将展示Git远程仓库(如Github、Gitee)的协作魅力,通过实例演示项目克隆、多人协作、冲突解决及分支管理等高级技巧。
Git秘籍大公开:从基础概念到高级技巧的全面解析
|
2月前
|
JSON JavaScript 前端开发
《进阶篇第7章》学习vue中的ajax之后,练习vue案例-github用户搜索案例
《进阶篇第7章》学习vue中的ajax之后,练习vue案例-github用户搜索案例
17 0
|
2月前
|
Unix Shell 网络安全
git学习六:(bug总结)git@github.com: Permission denied (publickey).等
本文是关于解决在使用Git和GitHub时遇到的“git@github.com: Permission denied (publickey)”错误的指南。文章提供了详细的步骤,包括确认SSH Agent运行状态、检查密钥配置、确保密钥匹配、验证仓库URL、检查权限和代理设置,以及配置SSH文件。这些步骤帮助用户诊断并解决SSH认证问题。
132 0
|
4月前
|
网络协议 Shell 网络安全
ssh: connect to host github.com port 22: Connection refused
本文讨论了在使用Git命令操作GitHub时遇到的"ssh: connect to host github.com port 22: Connection refused"错误,分析了可能的原因,并提供了使用443端口或https协议作为解决方案,最终确定问题是由于DNS解析错误导致,通过修改hosts文件解决。
ssh: connect to host github.com port 22: Connection refused
|
3月前
|
Shell 网络安全 开发工具
fatal: unable to access 'https://github.com/wolfcw/libfaketime.git/': Encountered end of file
fatal: unable to access 'https://github.com/wolfcw/libfaketime.git/': Encountered end of file
|
4月前
|
数据采集 数据可视化 Ruby
GitHub星标破万!Python学习教程(超详细),真的太强了!
Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。 Python 的设计哲学之一就是简单易学,体现在两个方面: 1. 语法简洁明了:相对 Ruby 和 Perl,它的语法特性不多不少,大多数都很简单直接,不玩儿玄学。 2. 切入点很多:Python 可以让你可以做很多事情,科学计算和数据分析、爬虫、Web 网站、游戏、命令行实用工具等等等等,总有一个是你感兴趣并且愿意投入时间的。
|
5月前
|
网络安全 开发工具 git
【git】解决git报错:ssh:connect to host github.com port 22: Connection timed out 亲测有效
【git】解决git报错:ssh:connect to host github.com port 22: Connection timed out 亲测有效
1210 1
|
6月前
|
Shell Linux 网络安全
git生成SSH秘钥
git生成SSH秘钥
299 2
|
6月前
|
Python
GitHub爆赞!终于有大佬把《Python学习手册》学习笔记分享出来了
这份笔记的目标是为了给出一份比较精炼,但是又要浅显易懂的Python教程。《Python学习手册》中文第四版虽然比较简单,但是措辞比较罗嗦,而且一个语法点往往散落在多个章节,不方便读者总结。 我在做笔记时,将一个知识点的内容都统筹在一个章节里面,因此提炼性大大提高。而且还有《Python学习手册》中文第四版的翻译在某些章节(可能难度较大?)措辞可能前后矛盾。当知识点提炼之后就能够很快的找到一些难以理解的概念的上下文,方便吃透这些难点。