Git从入门到精通

2023-11-09

Git

Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式,不需要服务器端软件支持。Git不仅仅是个版本控制系统,它也是个内容管理系统(CMS)、工作管理系统等。

git常用命令

git提交本地分支到远程分支 - 搜索技术 - 博客园

Git与SVN区别点

Git是分布式的,SVN不是。这是Git和其他非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。

SVN是集中式版本管理系统的代表,中央代码库存储着所有代码提交者的代码,而每个项目的参与者只负责代码的提交,中央代码库则保存着完整版的所有代码。

Git则是建立在本地库基础之上的分布式版本管理工具,最终可以使得任何代码的提交者都可以成为“中央代码库”。Git的根本思想和基本工作原理主要是在本地复制一个“代码库”,每次提交的代码均是推送到本地代码库中,节约了由于网络带宽所带来的限制,不至于出现提交5MB的代码而需等待20分钟的情况。另一方面,一旦中央代码库的服务器出现“崩溃”,那么任何“本地库”均可以还原中央代码库。

    • Git与SVN的存储方式不同。Git把内容按元数据方式存储,而SVN是按文件。

    • Git分支和SVN的分支不同,分支其实就是版本库中的另外一个目录。

    • Git没有一个全局的版本号,而SVN有一个全局的版本号。

    • Git的内容完整性要优于SVN。Git的内容存储使用的是SHA-1哈希算法,这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

在使用Git前我们需要先安装Git。Git目前支持在Linux/Unix、Solaris、Mac和Windows平台上运行。

linux下安装git

执行如下命令,安装Git。

yum -y install git

安装后,可以直接在命令行操作。

windows下安装git

完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。

在开始菜单里找到"Git"->"Git Bash",会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。

Git 工作流程

一般工作流程如下:

  • 克隆 Git 资源作为工作目录。git clone
  • 在克隆的资源上添加或修改文件。
  • 如果其他人修改了,你可以更新资源。
  • 在提交前查看修改。
  • 提交修改。add  commit
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

基本概念 

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

"HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。

  • 图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

  • 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。

  • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

  • 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

  • 当执行 git rm --cached <file> 命令时,会直接从暂存区删除文件,工作区则不做出改变。

  • 当执行 git checkout . 或者 git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。

  • 当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

基础配置 

执行如下命令,查看Git版本号 

git --version


执行如下命令,配置用户名称。

说明:

需要将下面命令中的username修改为要配置个人的用户名称。

git config --global user.name "username"


执行如下命令,配置电子邮件地址。

说明:

需要将下面命令中的test@XXX.com修改为要配置个人的电子邮件地址。

git config --global user.email test@XXX.com

执行如下命令,查看所有配置信息。

git config --list

git config --list

Git版本库又名仓库,英文名repository。可以把版本库简单的理解成一个目录,Git可以管理目录中的所有文件,并跟踪每个文件的修改、删除,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

先在本地创建一个目录。

初始化操作


执行如下命令,使用当前目录作为Git仓库,进行初始化。

该命令执行完后会在当前目录生成一个.git 目录。

git init

克隆操作

使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)。

克隆仓库的命令格式如下。

git clone <repo> <directory>

参数说明:

  • repo:Git仓库地址。

  • directory:本地目录。

a. 执行如下命令,克隆Ruby语言的Git代码仓库Grit。

如:

git clone git://github.com/schacon/grit.git mytest


Git本地仓库有三大区域:工作区、暂存区、版本区。创建、修改文件等操作是在工作区,git add命令是将工作区的内容添加到暂存区,git commit命令将临时存区内容添加到本地仓库中。

基本操作

Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。

本章将对有关创建与提交你的项目快照的命令作介绍。

Git 常用的是以下 6 个命令:git clonegit pushgit add 、git commitgit checkoutgit pull,后面我们会详细介绍。

说明:

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库

添加文件


git add命令语法如下。

添加一个或多个文件到暂存区。

git add [file1][file2]...


添加指定目录到暂存区,包括子目录。

git add [dir]


添加当前目录下的所有文件到暂存区。

git add .

提交文件


git commit命令语法如下。

提交暂存区到本地仓库中。

git commit -m 'message'

参数说明:

  • -m:添加-m参数表示可以直接输入后面的message,如果不加-m参数,表示不直接输入message的,而是会调用一个编辑器来让您输入这个message。

  • message:备注信息。

提交暂存区的指定文件到仓库区。

git commit [file1] [file2] ... -m 'message'

执行如下命令,将Aliyun.txt文件提交到暂存区。

git add Aliyun.txt
执行如下命令,查看当前仓库文件状态。

git status

回退版本

git reset命令用于回退版本,可以指定退回某一次提交的版本。git reset命令语法如下。

git reset [--soft | --mixed | --hard] [HEAD]

参数说明:

  • --mixed:默认,可以不用带该参数。用于重置暂存区的文件,使文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。

  • --soft:用于回退到某个版本。

  • --hard:参数用于撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。

  • HEAD:

HEAD和HEAD~0表示当前版本。

HEAD^和HEAD~1表示上一个版本。

HEAD^^和HEAD^2表示上上一个版本。

HEAD^^^和HEAD^3表示上上上一个版本。

执行如下命令,查看历史提交记录。

git log

文件比较

git diff命令用于比较文件的不同,即比较文件在暂存区和工作区的差异。git diff命令显示已写入暂存区和已经被修改但尚未写入暂存区文件的区别

git diff HEAD -- Aliyun.txt

分支管理


1. 查看分支。

执行如下命令,查看分支。

git branch


2. 创建分支。

执行如下命令,创建分支。

git branch test


3. 切换分支。

a. 执行如下命令,切换分支。

git checkout test


b. 执行如下命令,查看分支是否已经切换。

git branch


5. 删除分支。

a. 执行如下命令,删除分支。

注意:如果您要删除的分支是当前工作分支,必须切换到其他分支后,才能删除。

git branch -d test

不能跨分支查看其他分支的文件。
执行如下命令,将test2分支合并到当前master分支。

git merge test2
 

查看当前分支包含的文件

ls 

要在其他分支操作,切换到该分支,执行编辑,add,commit即可

撤销文件

1. 文件修改后还没有被放到暂存区,撤销修改就能回到版本库未修改前状态。

git checkout Aliyun.txt

实际为重新从版本库拿了一份到本地,将本地的修改给覆盖了。

2. 文件修改后添加到暂存区,需要先撤销暂缓区文件的更改,再继续撤销本地的修改。

git reset HEAD Aliyun.txt

git checkout Aliyun.txt

这里如果没有reset,直接checkout,则会发现没有变化。

如果删除了工作区的文件,可以再checkout一份。

git checkout Aliyun.txt

直接删除不需要的文件。

执行如下命令,从仓库中删除b.txt文件。

git rm b.txt

执行如下命令,将删除操作提交到仓库。

git commit -m 'delete b.txt'

 执行操作后,工作区的b文件被删除。

git标签

如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。

比如说,我们想为我们的 runoob 项目发布一个"1.0"版本。 我们可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD)"v1.0"的标签。

-a 选项意为"创建一个带注解的标签"。 不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。

$ git tag -a v1.0 

Git 远程仓库(Github)

Git 并不像 SVN 那样有个中心服务器。

目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员能够连接的服务器上。

(git本地版本库是无法让其他人员访问的)github是国外的。

国内的 Git 托管服务——Gitee(gitee.com)。 

详细教程见菜鸟教程

 本地生成SSH key (SSHkey是为了连接github仓库)

$ ssh-keygen -t rsa -C "youremail@example.com"

 github上创建SSH key并粘贴本地生成的key

验证是否成功,输入以下命令:

$ ssh -T git@github.com

 

说明已成功连上 Github。 

在github远程仓库创建仓库

可以从这个仓库克隆出新的仓库,也可以把本地仓库的内容推送到GitHub仓库。

# 提交到 Github
$ git remote add origin git@github.com:tianqixin/runoob-git-test.git
$ git push -u origin master

 

 push出现的异常 

参考:

git push 异常问题及Personal access token的使用 - 简书

 在github生成accesstoken

 push成功

如果在github仓库上进行了修改,则使用如下命令,将修改更新至本地版本库master分支

(此时本地工作区未更新)

$ git fetch origin

使用以下命令将更新同步到本地,操作后,本地工作区更新。

$ git merge origin/master

删除远程仓库你可以使用命令:

git remote rm [别名]

 如origin就是那一串git地址的别名

Git 服务器搭建

参考Git 服务器搭建 | 菜鸟教程

自己搭建一台 Git 服务器作为私有仓库使用。 

之前老徐提供的就是一个git服务器私有仓库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git从入门到精通 的相关文章

  • 如何修复 git 中的“警告:忽略名称损坏的引用”?

    我正在 OSX 上工作 在特定的存储库中 每当我在输入 git 命令后按 Tab 键自动完成 git diff clicks tab 我现在看到大量警告 warning ignoring ref with broken name refs
  • 为什么在将应用程序部署到 Heroku 时会出现此错误?

    使用 git hub 将应用程序部署到 heroku 时遇到某种错误 问题是 我不理解 heroku 日志和随之而来的错误 这是 Heroku 日志 Marcuss MacBook Pro Weather App marcushurney
  • 使用 git,如何在冲突期间“使用他们的”?

    使用 git 如何执行 使用他们的 类型的分支合并命令 该命令应该用原始版本覆盖我的本地版本 要将您的 master 替换为 origin master git checkout master git branch M master old
  • 为什么会导致合并冲突?

    这是我的 git 存储库的初始快照 在树枝上master file m1包含 L1 在树枝上dev file m1包含 L1 L2 如果我尝试合并dev from master 这会导致冲突 git checkout master Swit
  • jenkins构建完成后如何将更改推送到github?

    我有一个 jenkins 作业 它从 github 克隆存储库 然后运行 powershell 脚本来增加文件中的版本号 我现在正在尝试将该更新文件发布回 github 上的原始存储库 因此当开发人员提取更改时 他会获得最新的版本号 我尝试
  • git:显示所有已修改的文件 - 已暂存和未暂存

    我需要一个命令给我所有修改过的文件 这包括暂存 即新添加的文件 和非暂存更改 在普通列表我可以在脚本中使用它 虽然这个问题可能听起来很熟悉 但我只找到接近我想要做的命令 git ls files m 列出 非分阶段 修改但忽略了上演的和新的
  • GITLAB SSL证书问题:无法获取本地颁发者证书

    我正在尝试在 gitLab 中推送我的第一个项目 但出现此错误 致命 无法访问 https git SSL证书问题 无法获取本地颁发者证书 最后我在这里找到了解决方案https newbedev com invalid ssl certif
  • Docker 错误:无法找到包 git

    我正在使用图像nginx这是基于dockerfile ubuntu 连接到 docker 容器的 shell docker exec it
  • 是否可以在一台机器上使用 GitHub 和 GitLab?

    我的账户位于GitHub and GitLab 我生成了 RSA 密钥并将其添加到我的帐户中GitLab 但现在我需要与GitHub在第二个项目上 我知道GitLab和GitHub都使用git 请告诉我是否可以在一台机器上使用 GitHub
  • CodeCommit 错误 Elastic Beanstalk (AWS)

    运行后 pip install upgrade awsebcli 尝试执行以下操作时出现以下错误 eb deploy 无法将代码推送到 CodeCommit 存储库 错误 CommandError 处理 git 命令时发生错误 错误代码 1
  • 如何将 git 存储库转换为 Mercurial?

    我一直在使用 git 作为源代码存储库开发 java 应用程序 我想与其他 java 开发人员分享该项目 hg 似乎是他们最常用的 我的问题是如何将 git 存储库转换为 hg 如果我尝试谷歌搜索 将 git 转换为 hg 并且每次搜索命中
  • 如何通过pygit2获取当前签出的Git分支名称?

    这个问题应该与 如何获取Git中当前的分支名称 https stackoverflow com questions 6245570 how to get current branch name in git 获取 git 当前分支 标签名称
  • 以最小的努力在多台计算机之间同步代码

    我希望能够跨多台计算机 准确地说是 3 台 同步源代码和整个项目 我尝试过使用 git 但从来没有获得过无忧无虑的体验 也许是因为我从来没有投入很多精力 所以 我理想中想要的是 能够将文件夹及其所有子文件夹添加到 同步 列表 基本上 一旦我
  • 为什么“git diff”在“git add”之后报告没有文件更改

    这是为什么git diff认为没有变化 即使git status将它们报告为modified git status On branch master Your branch is ahead of origin master by 2 co
  • Git Grep 颜色选项解释和/或比较

    我正在尝试自定义我的 Git 颜色 读完后文档 https git scm com docs git config 我找到了我想要设置的选项 除了 Grep 之外 一切都工作正常 我意识到 我过去并没有真正使用过它 我想用相同的调色板为其设
  • Capistrano 3 运行每个命令两次(新安装)- 配置问题

    我刚刚完成第一次 Capistrano 安装 大部分内容都保留为默认设置 我配置了我的服务器 其身份验证 远程文件夹以及对 git 存储库的访问 我使用 capistrano 将 php 代码部署到我的服务器 上限分期部署 and 上限生产
  • 使用 git-cvsserver 和 CVS 工作副本获取 commitid 或“git描述”

    我有一些自动化工具可以通过以下方式访问 git 存储库cvs and git cvsserver 我希望这些工具能够看到他们签出的内容的提交 ID 这是否记录在CVS元数据目录 None
  • 如何在 NetBeans 中执行“git Blame”?

    NetBeans 内置了对 git 的支持 我可以做一个git blame在 NetBeans 内 如果是这样 怎么办 I googled https www google nl search q netbeans git blame它 但
  • git 奇怪的彩色终端响应[重复]

    这个问题在这里已经有答案了 最近我被下面的彩色终端响应吓死了 它是由 git push 命令触发的 Does anybody have a clue where this colored response comes from 只是猜测 但
  • 具有服务器端挂钩的托管 Git 解决方案?

    已经有一个类似的 版本控制托管解决方案 带有预提交挂钩 关于SO的问题 然而 提出这个问题的用户只需要客户端钩子 我正在寻找一个允许您配置的 Git 主机服务器端 hooks 我寻找这个的原因是为了防止开发人员能够在特定分支上 push f

随机推荐

  • 使用lev00生成电荷密度等高图

    以graphene为例 INCAR SYSTEM graphene ISTART 0 ICHARG 2 Startparameter for this run PREC A Electronic Relaxation ENCUT 500 N
  • 两两配对问题

    1 两两配对差值最小 题目描述 给定一个长度为偶数的数组arr 将该数组中的数字两两配对并求和 在这些和中选出最大和最小值 请问该如何两两配对 才能让最大值和最小值的差值最小 分析 主要是利用了c 里面对数组的一个排序函数sort 数组名
  • 【python】pip与conda的区别

    pip pip只能用来管理包 pip install能在任何环境中安装python包 也仅限python包 conda 现在听说只能通过anaconda和miniconda来安装 待科普 安装后可以使用conda来创建虚拟环境和管理包 关于
  • OVP过压保护IC高耐压36V,首选钰泰ETA7008/ETA7014

    深圳市展嵘电子有限公司有需要的上帝可联系小陈 136 6225 3950 3412 1522 98产品描述 ETA7008是一颗非常适合用于无线充和移动电源的高耐压保护IC 性价比非常好 有很大程度防止移动电源容易过压烧毁的可能 ETA70
  • [react基础]关于v6版本route的变化,以及常见应用模式

    该说不说 在做这些之前 你要记得一件事 route不是react或者vue等原本就有的组件 需要你手动下载 然后导入 原本的框架只是最终挂载到一个html界面上 别再问我为啥你扒下来的代码为啥不好使了 讨厌 gt lt 下载指令去看我另一篇
  • Log4j(四)——Log4j1与Log4j2的区别

    前言 几乎每个大型应用程序都包含自己的日志或跟踪API 为了符合这一规则 欧盟SEMPRER项目决定编写自己的跟踪API 这是在1996年初 经过无数次的增强 几个版本和大量的工作之后 API演变成了log4j 这是一个流行的Java日志包
  • Linux下Node.js引用模块报错Error: Cannot find module

    1 问题描述 背景 scrapyd上传的py文件 使用execjs调用Linux中的js文件 其中js引用了crypto js 但是报错找不到这个模块 已安装 适配多个解密 const CryptoJS require crypto js
  • linux反向路径检查,【问题解决】linux中反向查找java安装路径

    问题描述 常用的which java whereis java只能定位到执行路径 或只能展示一部分java路径 无法找到安装路径 可使用ls lrt反向查找 即将文件以建立时间先后顺序的倒叙排列显示 依次执行 ls lrt usr bin
  • Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsExc

    浏览器输入相应URL访问自己的localhost出现白页 且控制台打印 Failed to obtain JDBC Connection nested exception is com mysql cj jdbc exceptions Co
  • OpenGL ES 三种类型修饰 uniform attribute varying

    1 uniform变量 uniform变量是外部application程序传递给 vertex和fragment shader的变量 因此它是application通过 函数glUniform 函数赋值的 在 vertex和fragment
  • Lua——table(表)的使用

    文章目录 一 基本知识 二 table的构造 1 使用步骤 2 示例演示 三 table的操作 1 操作语法 2 示例演示 一 基本知识 1 table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型 如 数组 字典等 2 Lua
  • @JsonFormat注解不生效问题分析及解决方案

    JsonFormat pattern yyyy MM dd HH mm ss timezone GMT 8 出现的问题在于我后台VO用了LocalDateTime格式返回 想配置一个全局的时间格式化 这个就不做介绍了 百度一下就有 这么配置
  • 【vue+antd】上传图片 - 使用customRequest方法自定义上传

    基于antdv 1 7版本 实现图片墙UI 图片的base64格式上传 删除 回显及进度条等功能 1 HTML div class form item content style width 560px div class clearfix
  • 线程通信基础示例(synchronized 与 Lock + Condition实现线程通信)

    目录 一 synchronized 实现线程通讯 代码示例 二 Lock Condition 实现线程通讯 代码示例 Lock Condition 实现线程通讯的优点 一 synchronized 实现线程通讯 什么是线程通讯 可以将线程分
  • jquery

    jquer 概念 一个JavaScript框架 简化JS开发 jQuery是一个快速 简洁的JavaScript框架 是继Prototype之后又一个优秀的JavaScript代码库 或JavaScript框架 jQuery设计的宗旨是 w
  • OpenCV中的立体图像创建深度图

    OpenCV中的立体图像创建深度图 1 效果图 2 源码 参考 这篇博客将介绍如何从立体图像创建深度图 1 效果图 原图 VS 视差图效果如下 可以看到结果受到高度噪音的污染 通过调整 numDisparities 和 blockSize
  • C++ - max_element

    在C 中 要找到一个数组中的最大元素 可以使用 std max element 函数 以下是使用步骤 包含
  • VS2022中关于scanf函数报错解决方法

    VS虐你千百遍 但是你还是对他如初恋啊 首先我们先了解一下什么是scanf函数 在我们刚开始学习c语言的时候不妨会接触到这个家伙 scanf函数是一个输入流函数 读取你从键盘输入的值重新给变量赋值 int X 0 int Y 0 scanf
  • firefly_Adobe I / O运行时入门(Project Firefly)

    firefly The Adobe I O Runtime is a serverless platform which allows you to deploy an application that can to respond to
  • Git从入门到精通

    Git Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件 Git与常用的版本控制工具CVS Subversion等不同 它采用了分布式版本库的方式 不需要服务器端软件支持 Git不仅仅是个