Git的理解与使用

2023-10-30

一、初识Git

  Git是一种版本控制工具,github用的就是Git系统来管理它们的网站。

1.1 分布式管理系统

  除了Git,还有Svn等版本控制系统,它们的区别在于一个是分布式一个是集中式。Svn是集中式,Git是分布式。
  他们的区别在于:集中式的版本控制系统每次在写代码时都需要从服务器中拉取一份下来,并且如果服务器丢失了,那么所有的就都丢失了,你本机客户端仅保存当前的版本信息,换句话说,集中式就是把代码放在一个服务器上集中管理,你的所有回滚等操作都需要服务器的支持。
  在分布式管理系统中,每个人的电脑都是服务器,当你从主仓库拉取一份代码下来后,你的电脑就是服务器,无需担心主仓库被删或者找不到的情况,你可以自由在本地回滚,提交,当你想把自己的代码提交到主仓库时,只需要合并推送到主仓库就可以了,同时你可以把自己的代码新建一份仓库分享给其它人。
  像集中式它们都有一个主版本号,所有的版本迭代都以这个版本号为主,而分布式因为每个客户端都是服务器,Git没有固定的版本号,但是有一个由哈希算法算出的id,用来回滚用的,同时也有一个master仓库,这个仓库是一切分支仓库的主仓库,我们可以推送提交到master并合并到主仓库上,主仓库的版本号会迭代一次,我们客户端上的Git版本号无论迭代多少次,都跟master无关,只有合并时,master才会迭代一次。

1.2 Git的安装与配置

  关于Git安装,可参考的文章很多。简单来说,从官网上下载软件,然后进行安装即可。Git功能有很多,用的较多的是Git Bash,其界面示例:

  Git在安装后,也可以在环境变量中配置,此时可以通过查看Git版本的方式来查看Git是否安装成功。所用的命令是:git -version,示例:

  软件安装后,需要用一些命令来配置一下环境,用到的命令是:git config --global
  一般来说,初次使用Git需要设置你的用户名以及邮箱,这将作为当前机器Git的标识。如果你用它来下载远程仓库一些需要登录权限的仓库会要求登录,git默认使用配置邮箱以及用户名登入。
  配置用户名的命令是:

	git config --global user.name "用户名"

  user代表用户,.name代表配置用户的名称。
  配置邮箱的命令是:

	git config --global user.email "邮箱"

  user代表用户,email代表配置用户的邮箱。

二、Git理论

2.1 四个工作区域

  Git有四个工作区域:工作区域(Working Directory)、暂存区(Stage\Index)、本地仓库(Repository)、远程仓库(Remote Directory)。图示:

  • workspace
      工作区,就是平时存放项目代码的地方。
  • Index/Stage
      暂存区,用于临时存放你的改动,事实上只是一个文件,保存即将提交到文件列表信息。
  • Repository
      仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
  • Remote
      远程仓库,托管代码的服务器,可以简单的认为是你项目组中一台电脑用于远程数据交换。

2.2 提交代码的简易流程

  Git的工作流程一般分为以下几步:

  • 1、在工作目录中添加、修改、删除文件(modified);
  • 2、将需要进行版本管理的文件放入暂存区(staged);
  • 3、将暂存区域的文件提交git仓库(committed);
  • 4、将本地git仓库修改推送到远程仓库。

  可以看出,Git所管理的文件有三种状态:已修改(modified)、已暂存(staged)、已提交(committed)。

2.3 Git所管理文件的四种状态

  版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
  Git不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方式就是用SHA-1算法计算文件的校验和。
  四种状态的切换:

  • Untracked(未被跟踪的)
      此文件在文件夹中但并没有加入到Git库,不参与版本控制,通过git add命令,状态变为Staged。
  • Unmodify(文件已经入库)
      未修改,即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处:
  1. 如果被修改,而变成Modefied;
  2. 如果使用git rm命令,移除版本库,则成为Untracked文件。
  • Modified(文件已修改)
      仅仅是修改,并没有进行其他操作,这个文件也有两个去处:
  1. 通过git add命令,可进入暂存Staged状态;
  2. 使用git checkout命令,则丢弃修改内容,返回Unmodifiy状态。这个git checkout,即从库中去除文件,覆盖当前修改。
  • Staged(暂存状态)
      执行git commit命令则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态,执行git reset HEAD filename命令取消暂存,文件状态为Modified。

三、Git命令

3.1 基础命令

git init

  该命令的作用:在本地新建一个repo(版本库)。
  进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹。

git add

  该命令的作用:将文件添加到暂存区。
  git add .命令的作用:将工作空间下所有文件添加到暂存区(new,modifyed)。建议如果一个目录是新建的,该目录下的文件都需要添加到版本库时,使用该命令,否则使用git add filename命令逐个添加文件。
  git add命令后还可以加一些参数,示例(不常用):

git add -A:将工作空间下所有文件添加到暂存区(new,modifyed,delete);
git add -u:将工作空间下所有文件添加到暂存区(modifyed,delete)。

git commit

  该命令的作用:将文件提交到本地仓库。
  常用的方式:git commit -m <commit message>,作用是将暂存区的文件提交到版本库。
  还有一个不常用的方式:git commit -am <commit message>,作用是跳过git add命令,直接将工作区所有已跟踪的文件提交到版本库,未跟踪的(untracked)文件不能使用该命令。

git status

  该命令的作用:查看本地仓库中文件的状态。
  该命令后面可以加目录,不加的话代表当前目录。此时能看到的文件状态有:新增、修改和删除。

git log

  该命令的作用:查看当前当前分支代码的提交历史。
  该命令后面常常配合一些参数使用。如:
  git log --oneline:每条log只显示一行。
  git log branchname:显示特定分支的log。
  git log --author=[author name]:显示指定作者的提交log。
  git log filename:查看某个文件的提交log。

git config

  该命令的作用:查看或修改全局配置信息。
  常用的命令:
  git config --global user.name zhangsan:配置用户名。
  git config --global user.email 123@qq.com:配置邮箱。
  git config --list:查看全局配置信息。

git stash

  该命令的作用:暂存本地修改内容(用于不想提交修改的内容,想切换分支的场景)。
  常用的命令:
  git stash list:查看暂存的历史记录。
  git stash apple --index:恢复之前暂存的某个记录。
  git stash drop --index:删除某个暂存记录。

git rm

  该命令的作用:删除本地仓库中的文件。
  比如要删除一个文件,并提交到远程分支,所用命令为:
  git rm filename:删除本地仓库中的文件。
  git commit -m 'remove filename':编写提交信息。
  git push origin master:将本地改动提交到远程(本例子中是master)分支。

git commit

  该命令的作用:编写本次提交信息。
  git commit -m "the commit message":编写本次提交信息。
  git commit --amend:修改最近一次的提交信息。

git diff

  该命令的作用:比较本地工作空间和staged区的差异。
  如果不加参数使用该命令,表示比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
  git diff commitid:查看当前仓库代码和某次提交时代码的差异。
  git diff filename:查看某个文件的(还没提交到本地仓库)修改。

git clean

  该命令的作用:从工作目录中移除没有追踪的文件。
  通常的用法是:git clean -df。-d 表示同时移除目录,-f 表示 force,因为在git的配置文件中,配置了clean.requireForce=true。如果不加-f,clean将会拒绝执行。

3.2 撤销命令

git checkout --filename

  该命令的作用:拉取暂存区的文件并将其替换工作区的文件(即回退未提交的修改)。

git reset

  该命令的作用:对本地代码库的文件进行内容回退。
  git reset HEAD:来把不小心add进去的文件从staged状态取出来,可以单独针对某一个文件操作,即:git reset HEAD - - filename,这个- -也可以不加。
  相比之下,更常用的命令是:git reset --option commitid:option有三种:
  hard:硬回滚,简单理解为回退本地提交和修改的未提交的所有内容,和最新提交的代码保持一致。
  mixed(或不使用参数):覆盖暂存区,但不覆盖工作区。
  soft:软回滚,不进行暂存区和工作区的覆盖。

  • 硬回滚的常见使用
      git reset --hard HEAD:回退到当前版本。
      git reset --hard HEAD^:回退到上一个版本。
      git reset --hard commitid:回退到指定版本。
  • 回退范围
      按改动范围排序:soft (commit) < mixed (commit + add) < hard (commit + add + local working)。
git revert

  该命令的作用:用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留。
  作为对比,git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除。
  git revert常用的命令有两种:
  git revert HEAD:撤销前一次提交。
  git revert commitid:撤销某一次提交。

3.3 分支操作命令

git branch

  git branch:列出本地所有分支,当前分支会被星号标示出。
  git branch branchname:创建一个新的分支(当用这种方式创建分支的时候,分支是基于你的上一次提交建立的)。
  git branch -m:修改分支名称。
  git branch -d:删除分支。

git checkout branchname

  git checkout branchname:切换分支。
  git checkout -b branchname:创建并切换分支。

git merge

  git merge branchname:合并指定分支代码到当前分支。
  如果出现冲突,需要手动修改。此时解可以用到git diff,解决完之后用git add 添加即可。

3.4 远程仓库操作命令

git clone

  该命令的作用:从一个指定的url拉取文件。

git fetch

  该命令的作用:获取远程分支但不做合并。
  git fetch origin dev:获取远程dev分支但不做合并。

git pull

  该命令的作用:更新远程代码到本地分支。
  git pull会首先执行git fetch,然后执行git merge,把取来的分支的head merge到当前分支。这个merge操作会产生一个新的提交。
  常用的命令:
  git pull origin dev:获取远程的dev分支和当前分支合并,实际是先执行git fetch后,再执行git merge。
  git pull origin dev:master:获取远程的dev分支和本地的master分支合并。
  git pull:将远程仓库中和本地分支同名的分支代码更新到本地分支。
  如果使用--rebase参数,会执行git rebase来取代原来的 git merge。

git rebase

  该命令的作用:会将本地的所有提交临时保存为补丁(patch),放在".git/rebase"目录中,然后将当前分支更新到最新的分支,最后把保存的补丁应用到分支上。本地的所有提交记录会被丢弃。
  rebase的过程中,也许会出现冲突,Git此时会停止rebase并让你解决冲突。在解决完冲突之后,用git add去更新这些内容即可。

git push

  该命令的作用:将本地仓库的改动提交到远程仓库。
  git push origin dev:将本地上分支上提交到远程dev分支。

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

Git的理解与使用 的相关文章

  • Sublime Text 2 的 git 提交错误[重复]

    这个问题在这里已经有答案了 我正在 Udacity 上学习 如何使用 Git 和 GitHub 课程 我正在按照示例进行操作 但遇到了问题 我自己尝试通过谷歌搜索和反复试验来解决问题大约两个小时 我认为是时候在 StackOverflow
  • 如何仅对最新合并后的提交进行变基?

    考虑以下场景 我从master那里检查了一个分支 我做了一些承诺 我合并了更新的master 我做了更多的承诺 现在我想要从第 4 点开始变基提交 以便从第 2 点开始的提交不受影响 所以如果我最初有 1 2 x x x x x x x m
  • 测量大型源树中的“接近度”

    作为我之前提出的问题的一部分找到两个来源之间的最佳匹配 https stackoverflow com questions 13898659 finding what git commit some code spawned from 其中
  • GIT:向非当前分支添加本地更改

    我通常会遇到这样的情况 我做了一些本地更改 却发现我在错误的分支上进行了更改 因此我需要在提交之前切换分支 问题是当有本地更改时我无法切换分支 有办法做到这一点吗 显然 我可以复制更新的文件 切换分支 然后将它们复制回来 但这看起来并不聪明
  • 无法使用 Git Bash 对 Visual Studio Team Services 进行身份验证

    由于身份验证失败 我无法对 Visual Studio Team Services VSTS 上的远程存储库运行任何命令 我可以通过 Visual Studio 进行拉取等操作 但只能通过 Visual Studio 不通过 Git Bas
  • Git 合并删除文件

    这是第二次发生这种情况 当我进行合并时 我后来意识到正在合并的分支中的一些文件不再位于正在合并的分支中 最新的例子是我们有一个功能分支 我一直在合并主开发分支中的更改 合并后我们丢失了很多文件 并且它们现在不存在于功能分支中 为什么会出现这
  • 在单独的终端屏幕上显示 git diff 和 git log 输出

    设置新的开发环境后 我遇到了一个奇怪的 git 行为 我不记得过去见过 我习惯于git diff and git log在终端中创建一个新屏幕并在其中显示其输出 什么less默认情况下 我用它作为我的寻呼机 然后我可以退出并返回到之前的终端
  • 中止 `git stash apply` [重复]

    这个问题在这里已经有答案了 我很遗憾应用了存储 错误的分支 我如何撤消此操作并将我的存储返回到我的存储列表 以便稍后将其应用到正确的分支 如果你还没有承诺 你应该能够git stash再次 可能与git reset HEAD first A
  • Git Add - 致命:添加文件失败

    我的 git cmd exe 窗口如下所示 git add NextFolder error unable to create temporary file No such file or directory error NextFolde
  • git log 不按时间顺序排列

    我在一个公共项目 B2G 又名 FirefosOS 上意外发现 git log 输出不是按时间顺序排列的 git clone https git mozilla org releases gecko git git log graph fo
  • 为什么 git 无法识别我的本地存储库?

    我刚刚回到一个我已经使用 Git 大约 6 个月的项目 看到了这个 cd d DEVELOP BlenderAe My repo root git status fatal not a git repository or any of th
  • github Diff 截断错误

    在 github 中发出拉取请求并审查更改时 我们收到了 Diff Truncated 错误 如下所示 任何人都可以帮助解决这个问题 拉取请求可能会触发以下提到的限制之一GitHub 支持 https stackoverflow com a
  • 如何将 git-svn 与 svn+ssh url 一起使用

    我喜欢在cygwin中使用git svn clone使用我们公司 svn 存储库的命令 这个的网址是svn ssh svn
  • 仅将单个文件放入 git 子模块/存储库中

    我在 git 源代码存储库中有一个特定文件 其中包含生产设置 密码 我想限制此文件 以便只有制作团队的成员才能看到它 但是 我想控制它的变化 我考虑过在 git 中使用子模块 然后限制对新存储库的访问 然而 git 似乎需要子模块的整个子目
  • Windows 上的 git 忽略文件名大小写更改 [重复]

    这个问题在这里已经有答案了 我有一个reactjs应用程序 我正在将所有文件名标准化为小写以符合Nodejs 最佳实践 https devcenter heroku com articles node best practices stic
  • 从 Eclipse 的历史视图中删除 ORIG_HEAD 和 FETCH_HEAD

    我最近开始使用 Eclipse Kepler 和 EGit 插件 这些分支不是我习惯的 有没有办法永久阻止这些分支的创建 我尝试手动删除它们 但它不起作用 并且我不想在下次获取或变基时保留它们 据我从对您问题的评论中了解到 您只希望这些参考
  • git update-index --no-assume-unchanged 不起作用

    我设置了assume unchanged咬了几个文件 现在我想取消它们 但这不起作用 gt git update index no assume unchanged Gemfile gt git ls files v grep Gemfil
  • 如何在没有本地存储库的情况下在远程运行 git 命令

    我有一个名为 git export 的脚本 它可以帮助我导出远程存储库 它是这样运行的 git export http host com git repo lt t tag or b branch or c commit gt local
  • 在 git 中记录前 10 个

    两个问题 如何从头到尾显示 git 中的前 10 个提交 无分行 如何指定提交索引并记录它 显示第二个或第三个 我知道 git 使用父级来链接提交 很容易从头到尾记录提交 喜欢 git log HEAD 10 但我需要从头到尾查询 可以吗
  • Git rebase --继续而不打开编辑器

    调用时git rebase continue在正常的变基冲突之后 编辑器 GIT EDITOR 打开并要求修改提交消息 因为提交消息可能包含前导 所以这可能会失败 export GIT EDITOR true git rebase cont

随机推荐

  • html safari错误,HTML5的本地存储的错误:“quota_exceeded_err Safari:DOM例外22:试图存储超过定额补充一下。”...

    Rubens Mariuzzoleiyonglin提出了一个问题 html5 localStorage error with Safari QUOTA EXCEEDED ERR DOM Exception 22 An attempt was
  • Web开发必备的 9 个开源项目

    1 AdminLTE Github Star 数 24969 Github 地址 https github com almasaeed2010 AdminLTE 2 vue Element Admin Github Star 数 19546
  • LinearAlgebraMIT_9_LinearIndependence/SpanningASpace/Basis/Dimension

    这节课我们主要学习一下 Linear Independence 线性无关 spanning a space 生成空间 basis 基和 dimension 维度 同时我们要注意这四个很重要的基本概念的描述对象 我们会说向量组线性无关 由一个
  • WIN10操作系统下如何修改MySQL5.7数据库的ROOT用户密码(亲测有效)

    由于工程项目需要 需要修改MySQL5 7数据库的ROOT用户密码 但是发现网上很多方法都是针对MySQL5 6数据库系统的 并不适合MySQL5 7数据库 一 查看MySQL5 7数据库的服务名 可以观察到 MySQL5 7数据库的服务名
  • 黑马程序员jvm笔记(四)--字节码部分心得

    10 字节码部分 这部分 主要介绍了类的字节码文件 以及从更深层的角度去理解类是怎么被加载的 jvm的内存结构 10 1 字节码文件的分析 1 获得字节码文件 得到如下的字节码文件 0000000 ca fe ba be 00 00 00
  • MySQL(十)—线上MySQL锁超时了怎么办?update操作怎么上了个表锁啊?

    文章目录 一 异常错误 二 尽量还原这个错误 1 准备数据 2 阐述业务 3 分析原因 三 线上如何解决这个异常呢 1 设置锁超时时间 2 使用online ddl方式建立唯一索引 3 动态增加服务节点 一 异常错误 先上一个出现异常的截图
  • STC89C51——定时器/计数器介绍及程序配置

    前言 本文介绍基于常见的51单片机 即如下图的芯片 AT89C51具备2个定时器 计数器 即定时器 计数器 0 定时器 计数器 1 简称 T0 T1 T0 有 4 种工作方式 T1 有 3 种工作方式 2个定时器前3种工作方式一样 但是在T
  • IS-IS协议 HCIP

    我需要 最狂的风 和最静的海 HCIP IS IS协议基本原理 场景应用 历史起源 路由计算过程 地址结构 路由器分类 邻居HELLO报文 邻居关系建立 DIS及DIS与DR的类比 链路状态信息的载体 链路状态信息的交互 路由算法 网络分层
  • IO和NIO的区别

    在这里不再过多描述IO的具体API用法 总的来说reader writer是处理字符的 而inputsream 和 outputstream是处理字节的 eg 图片什么的 其实现在大多Web应用上传图片时候也不会使用字节流而是上传一个图片存
  • elasticsearch中节点都启动但是无法形成集群问题

    近日 单台机器 8个节点的es集群 8个节点都正常started了 但是就是无法形成集群 后来看日志 日志中出现一堆的MasterNotDiscoveredException这种异常 完整日志如下 2016 04 27 15 08 22 4
  • 关于STM32软件IIC与PCF8563通信 逻辑分析仪0xA2 Missing Ack /NAK排查与解决

    最近在使用PCF8563时 准备用STM32 软件IIC通信时 改了软件IIC后 将所有函数都做了适配 但是 发现PCF正常初始化 程序无法运行 链接上逻辑分析仪后发现是一直收不到ACK 发送的A2 地址和0x08都正常 程序正常时先设置时
  • 暴力解决八皇后问题

    如题 翻到了一个以前的代码 发现是刚学c时帮同学解决八皇后问题的代码文件 足足两百行 放出来纪念一下当初傻傻的自己吧哈哈 话不多说 放代码 include
  • arm linux kernel编译问题总结

    1 make menuconfig报错 guang guang kylin Develop linux stable make menuconfig HOSTCC scripts basic fixdep Unable to find th
  • 【记录】服务器搬家记录

    服务器搬家记录 前言 零 备份数据 程序 一 备份mysql 1 先删掉无用的表和库 减小数据包大小 2 备份到本地 二 备份docker 1 提交 2 标签 3 push 4 保存挂载宿主机上的文件 三 备份定时脚本 四 开发环境 服务器
  • 完美解决:由于找不到mfc140u.dll,无法继续执行代码。

    什么是msvcp140u dll msvcp140 dll是Microsoft Visual C Redistributable的一个组件 它包含了许多用于C 编程的函数和类 如果你的系统缺少了这个文件 那么你可能会遇到 找不到msvcp1
  • js 用变量做对象key值的写法

    变量为name 对象为obj var name name var obj obj key var name jack var obj name 1 name 2 name aaa 3 console log obj name 1 jack
  • Dart中List的常用方法概述及使用案例

    在Dart中 List是一种有序的集合 它提供了许多有用的方法来操作列表数据 Flutter使用Dart语言开发 所以在Flutter中依然适用 下面是List常用的方法概述及使用案例 length属性 List的length属性返回Lis
  • pandas的时间对象

    pandas时间处理对象 pandas中有个时间库 datautil 可以使用其中的方法把多种字符串时间格式转化为时间对象 import dateutil import pandas as pd a dateutil parser pars
  • git还原到某个版本

    1 tortoisegit还原 v2还原到v1 1 1 强制还原 git reset 如果使用这种方式还原到v1 将丢失还原到v1到v2之间的所有提交及日志 1 1 1 显示日志 有save1 save2两条提交记录 1 1 2 重置版本
  • Git的理解与使用

    文章目录 一 初识Git 1 1 分布式管理系统 1 2 Git的安装与配置 二 Git理论 2 1 四个工作区域 2 2 提交代码的简易流程 2 3 Git所管理文件的四种状态 三 Git命令 3 1 基础命令 git init git