Git 教程 - Git 命令与操作
【注】本文译自: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 中的命令和操作。
版权声明: 本文为 InfoQ 作者【信码由缰】的原创文章。
原文链接:【http://xie.infoq.cn/article/00161e52c0e89f646bafa11a6】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论