Git教程 - Git 命令与操作(git操作指南)
wxin55 2024-11-04 14:49 21 浏览 0 评论
【注】本文译自:https://www.edureka.co/blog/git-tutorial/
学习 Git 与使用该工具一样容易。这个 Git 教程的目的就是要把这个难题从您的脑海中剔除。我相信,通过这个 Git 教程,您将了解到所有的概念。
我希望您已经了解了 Git 的基本概念和术语,并在我的 Git 教程系列的第一个博客中了解了有关版本控制的所有知识。
在本教程中,您将学习:
- Git 命令
- Git 操作
- 还有一些使用 Git 有效地管理项目的提示和技巧。
在开始使用命令和操作之前,让我们首先理解 Git 的主要目的。
Git 的目的是管理一个项目或一组随着时间变化的文件。Git 将这些信息存储在称为 Git 存储库的数据结构中。存储库是 Git 的核心。
如何查看我的 GIT 存储库?
明确地说,Git 存储库是存放所有项目文件和相关元数据的目录。
Git 通过从索引中创建树形图来记录项目的当前状态。它通常采用有向无环图(DAG)的形式存在。
现在您已经理解解了 Git 的目标,让我们继续讨论操作和命令。
如何学习 Git 命令?
Git工作原理的基本概述:
- 使用 git 托管工具(如 Bitbucket)创建“存储库”(项目)
- 将存储库复制(或克隆)到本地计算机
- 将文件添加到本地存储库并“提交”(保存)更改
- 将更改“推送”到主分支
- 使用 git 托管工具对文件进行更改并提交
- 将更改“拉”到本地计算机
- 创建一个“分支”(版本),进行更改,然后提交更改
- 打开一个“拉取请求”。
- 将您的分支“合并”到主分支
Git Shell 和 Git Bash 有什么区别?
Git Bash 和 Git Shell 是两个不同的命令行程序,可让您与底层的 Gi t程序进行交互。Bash 是基于 Linux 的命令行,而 Shell 是本机 Windows 命令行。
一些操作和命令
Git中的一些基本操作有:
- Initialize (初始化)
- Add (添加)
- Commit (提交)
- Pull (拉取)
- Push (推送)
一些高级的 Git 操作有:
- Branching (分支)
- Merging (合并)
- Rebasing (变基)
首先让我简要介绍一下这些操作如何与 Git 存储库一起使用。看看下面的Git架构:
如果您已经理解了上面的图,那很好,但是如果您不了解,则不必担心,我将在本教程中逐一解释这些操作。让我们从基本的操作开始。
您需要先在系统上安装Git。如果您需要安装方面的帮助,请单击此处。
Git Bash 的用途是什么?
本 Git Bash 教程重点介绍可在 Git Bash 上使用的命令和操作。
如何浏览 Git Bash?
在 Windows 系统中安装 Git 之后,只需打开要存储所有项目文件的文件夹/目录即可;右键单击并选择“Git Bash Here”。
这将打开 Git Bash 终端,您可以在其中输入命令以执行各种 Git 操作。
现在,下一个任务是初始化存储库。
初始化(Initialize)
为此,我们使用命令 git init。请参考下面的截图。
git init 创建一个空的 Git 存储库或重新初始化一个现有的存储库。它基本上会创建一个带有子目录和模板文件的 .git 目录。在现有存储库中运行 git init 不会覆盖已经存在的内容。它会选择新添加的模板。
现在我的存储库已初始化,现在让我在目录/存储库中创建一些文件。例如我创建了两个文本文件,即 edureka1.txt 和 edureka2.txt。
让我们使用 git status 命令查看这些文件是否在我的索引中。索引保存工作树/目录的内容的快照,该快照将作为本地存储库中要进行的下一次更改的内容。
Git status
git status 命令列出了所有准备好添加到本地存储库的已修改文件。
让我们输入命令,看看会发生什么:
这表明我有两个文件尚未添加到索引中。这意味着除非在索引中显式添加了这些文件,否则无法提交对这些文件的更改。
添加(Add)
该命令使用在工作树中找到的当前内容来更新索引,然后在临时区域中准备下一次提交的内容。
因此,在更改工作树之后,并且在运行 commit 命令之前,必须使用 add 命令将所有新文件或已修改的文件添加到索引中。为此,请使用以下命令:
git add <directory>
或
git add <file>
让我为您演示 git add,以便您可以更好地理解它。
我还创建了两个文件 edureka3.txt 和 edureka4.txt。让我们使用命令 git add -A 添加文件。此命令会将所有目录中的文件添加到索引中,但尚未在索引中更新。
现在,新文件已添加到索引中,您可以提交它们了。
提交(Commit)
它指的是在给定时间记录存储库的快照。提交的快照永远不会改变,除非电焊工地完成。让我用下图来解释一下 commit 是如何工作的:
这里,C1 是初始提交,即第一个更改的快照,从该更改创建另一个名为 C2 的快照。请注意,主节点指向最新的提交。
现在,当我再次提交时,将创建另一个快照C3,现在主快照指向C3,而不是C2。
Git 的 目标是使提交尽可能轻量。因此,它不会每次提交时都盲目复制整个目录;它包括作为一组更改的提交,或从一个版本的存储库到另一个版本的“增量”。 简单来说,它只复制在存储库中所做的更改。
您可以使用以下命令提交:
git commit
这将提交暂存的快照,并将启动文本编辑器,提示您输入提交消息。
或者您可以使用:
git commit -m “<message>”
让我们尝试一下。
如您在上面看到的,git commit 命令已经提交了本地存储库中四个文件中的更改。
现在,如果要一次提交工作目录中所有更改的快照,则可以使用以下命令:
git commit -a
我在工作目录 viz 中又创建了两个文本文件。edureka5.txt 和 edureka6.txt,但它们尚未添加到索引中。
我正在使用命令添加 edureka 5.text:
git add edureka5.txt
我已将 edureka5.txt 显式添加到索引中,但没有将 edureka6.txt 添加到索引中,并在先前的文件中进行了更改。我想一次提交目录中的所有更改。请参考下面的快照。
该命令将提交工作目录中所有更改的快照,但仅包括对跟踪文件的修改,即在历史记录中的某个时刻使用 git add 添加的文件。因此, edureka6.txt 尚未提交,因为尚未将其添加到索引中。但是会提交对存储库中所有先前文件的更改,即 edureka1.txt、edureka2.txt、edureka3.txt、edureka4.txt 和 edureka5.txt。
现在,我已经在本地存储库中完成了所需的提交。
请注意,在影响对中央存储库的更改之前,应始终将更改从中央存储库拉到本地存储库,以更新在中央存储库中做出贡献的所有协作者的工作。为此,我们将使用 pull 命令。
拉取(Pull)
git pull 命令将更改从远程存储库获取到本地存储库。它合并了本地存储库中的上游更改,这是基于 Git 的协作中的常见任务。
但首先,您需要使用以下命令将中央存储库设置为原始存储库:
git remote add origin <中央存储库的链接>
现在已经设置了原点,让我们使用 pull 从原点提取文件。 为此,请使用命令:
git pull origin master
此命令会将所有文件从远程存储库的 master 分支复制到本地存储库。
由于我的本地存储库已经使用 master 分支中的文件进行了更新,因此该消息已经是最新的。请参阅上面的屏幕截图。
注意:也可以尝试使用以下命令从其他分支提取文件:
git pull origin <branch-name>
现在,您的本地 Git 存储库已使用所有最近的更改进行了更新。现在是时候使用 push 命令在中央存储库中进行更改了。
推送(Push)
此命令将提交从本地存储库传输到远程存储库。它与拉取操作相反。
将导入提交到本地存储库,而将导出将提交到远程存储库。
git push 的用途是将本地更改发布到中央存储库。积累了多个本地提交并准备与团队其他成员共享之后,可以使用以下命令将其推送到中央存储库:
git push <远程>
注:该远程引用在使用 pull 命令之前设置的远程存储库。
这将把更改从本地存储库推送到远程存储库,以及所有必要的提交和内部对象。并将在目标存储库中创建一个本地分支。
我来为您演示一下。
上面的文件是我们之前在 commit 部分中已经提交的文件,它们都是“ push-ready”的。我将使用命令 git push origin master 来将这些文件反映在中央存储库的 master 分支中。
现在让我们检查这些更改是否发生在我的中央存储库中。
是的,确实如此。 :-)
为了防止覆盖,当Git在目标存储库中导致非快进合并时,它不允许推送。
注意:非快进合并是指上游合并,即与子分支的祖先或父分支合并。
要启用这种合并,请使用以下命令:
git push <remote> –force
上面的命令将强制执行推操作,即使它会导致非快进合并。
到目前为止,我希望您已经了解了 Git 的基本命令。现在,让我们进一步学习在 Git 中进行分支和合并。
分支(Branching)
Git 中的分支只是指向特定提交的指针。Git通常更倾向于保持其分支尽可能轻量级。
基本上有两种类型的分支,即本地分支和远程跟踪分支。
本地分支只是您的工作树的另一条路径。另一方面,远程跟踪分支有特殊用途。 其中一些是:
- 他们将您的工作从本地存储库链接到中央存储库上的工作。
- 当您使用 git pull 时,它们会自动检测要从哪个远程分支获取更改。
您可以使用以下命令检查当前分支是什么:
git branch
分支时您应该经常念诵的口号是“早分支,常分支”。
要创建一个新分支,我们使用以下命令:
git branch <branch-name>
上图显示了创建新分支时的工作流程。 当我们创建一个新分支时,它源自master分支本身。
由于创建多个分支没有存储/内存开销,因此逻辑上划分您的工作比拥有大块的分支要容易得多。
现在,让我们看看如何使用提交分支。
分支包括特定提交和所有父提交的工作。如您在上图中所看到的,newBranch 已与主服务器分离,因此将创建一条不同的路径。
使用以下命令:
git checkout <branch_name> 然后执行
git commit
在这里,我创建了一个名为“ EdurekaImages”的新分支,并使用命令 git checkout 切换到该新分支。
上述命令的一种快捷方式是:
git checkout -b[ branch_name]
此命令将创建一个新分支并同时签出新分支。
现在,当我们在分支 EdurekaImages 中时,使用以下命令添加并提交文本文件 edureka6.txt:
git add edureka6.txt
git commit -m”adding edureka6.txt”
合并(Merging)
合并是将不同分支的工作合并在一起的方法。这将允许我们进行分支,开发新功能,然后将其合并回来。
上图为我们展示了两个不同的分支-> newBranch 和 master。现在,当我们将 newBranch 的工作合并到master 中时,它将创建一个新提交,其中包含 master 和 newBranch 的所有工作。
现在,让我们使用下面的命令合并两个分支:
git merge <branch_name>
上述命令中的分支名称应该是你想要合并到当前所签出分支的分支。因此,请确保您已在目标分支中检出。
现在,让我们将分支 EdurekaImages 的所有工作合并到 master 分支中。为此,我将首先使用 git checkout master 命令检出master分支,然后用 git merge EdurekaImages 命令合并 EdurekaImages。
如上所示,分支名称中的所有数据都合并到了master分支中。现在,文本文件 edureka6.txt 已添加到 master 分支中。
在 Git 中合并会创建一个特殊的提交,该提交具有两个唯一的父级。
变基(Rebasing)
这也是组合不同分支之间的工作的一种方式。变基接受一组提交,将其复制并存储在您的存储库外部。
变基的优点是它可以用于制作线性的提交序列。如果完成了重新基准化,则提交日志或存储库的历史记录将保持干净。
让我们看看它是如何发生的:
现在,我们在 newBranch 上的工作紧随 master 之后,我们有了不错的线性提交序列。
注意:重新设置基准还可以防止上游合并,这意味着您不能将 master 放在newBranch之后。
现在,要重设 master,请在 Git Bash 中键入以下命令:
git rebase master
此命令会将我们所有的工作从当前分支移至主节点。 它们看起来好像是顺序开发的,但是却是并行开发的。
提示和技巧
现在,您已经完成了本Git教程中的所有操作,这里是您应该知道的一些提示和技巧。 :-)
- 归档存储库
使用以下命令:
git archive master –format=zip –output= ../name-of-file.zip
它将所有文件和数据存储在一个 zip 文件中,而不是 .git 目录中。
请注意,这仅会创建一个快照,从而完全忽略了版本控制。当您要将文件发送给未在计算机上安装Git的客户端进行审核时,这非常方便。
- 绑定存储库
它将存储库转换为单个文件。
使用以下命令:
git bundle create ../repo.bundler master
这会将 master 分支推送到一个远程分支,该分支仅包含在文件中,而不是存储库中。
另一种方法是:
cd..
git clone repo.bundle repo-copy -b master
cd repo-copy
git log
cd.. /my-git-repo
- 隐藏未提交的更改
当我们要撤消临时添加功能或任何种类的数据时,可以临时“隐藏”它们。
使用以下命令:
git status
git stash
git status
当您要重新应用“隐藏”的更改时,请使用以下命令:
git stash apply
我希望您喜欢这个 Git Bash 教程,并学习了 Git 中的命令和操作。
相关推荐
- ES6中 Promise的使用场景?(es6promise用法例子)
-
一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...
- JavaScript 对 Promise 并发的处理方法
-
Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...
- Promise的九大方法(promise的实例方法)
-
1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...
- 360前端一面~面试题解析(360前端开发面试题)
-
1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...
- 前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?
-
Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...
- 最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式
-
看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...
- 前端分享-Promise可以中途取消啦(promise可以取消吗)
-
传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...
- 手写 Promise(手写输入法 中文)
-
前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...
- 什么是 Promise.allSettled()!新手老手都要会?
-
Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...
- 前端面试-关于Promise解析与高频面试题示范
-
Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...
- 宇宙厂:为什么前端离不开 Promise.withResolvers() ?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...
- Promise 新增了一个超实用的 API!
-
在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...
- 一次搞懂 Promise 异步处理(promise 异步顺序执行)
-
PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...
- Promise 核心机制详解(promise机制的实现原理)
-
一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...
- javascript——Promise(js实现promise)
-
1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- ES6中 Promise的使用场景?(es6promise用法例子)
- JavaScript 对 Promise 并发的处理方法
- Promise的九大方法(promise的实例方法)
- 360前端一面~面试题解析(360前端开发面试题)
- 前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?
- 最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式
- 前端分享-Promise可以中途取消啦(promise可以取消吗)
- 手写 Promise(手写输入法 中文)
- 什么是 Promise.allSettled()!新手老手都要会?
- 前端面试-关于Promise解析与高频面试题示范
- 标签列表
-
- hive行转列函数 (63)
- sourcemap文件是什么 (54)
- display none 隐藏后怎么显示 (56)
- 共享锁和排他锁的区别 (51)
- httpservletrequest 获取参数 (64)
- jstl包 (64)
- qsharedmemory (50)
- watch computed (53)
- java中switch (68)
- date.now (55)
- git-bash (56)
- 盒子垂直居中 (68)
- npm是什么命令 (62)
- python中+=代表什么 (70)
- fsimage (51)
- nginx break (61)
- mysql分区表的优缺点 (53)
- centos7切换到图形界面 (55)
- 前端深拷贝 (62)
- kmp模式匹配算法 (57)
- jsjson字符串转json对象 (53)
- jdbc connection (61)
- javascript字符串转换为数字 (54)
- mybatis 使用 (73)
- 安装mysql数据库 (55)