关于 GIT 你需要知道的一切
我相信你能想象版本控制代码的重要性,它能让我们回滚更改、恢复丢失的数据等等。
我敢打赌,你肯定认识一些人(不是我,呵呵),他们通过创建文件副本来控制版本,并且给文件起的名字也越来越有创意……
这可能也是 1972 年之前人们对其代码进行版本控制的方式,当时发布了SCCS (源代码控制系统) ,这是有史以来第一个集中式版本控制软件之一。
但我们在这里并不是要谈论 SCCS,我们现在真正感兴趣的是GIT,这个分布式开源版本控制软件明年(2005 年 7 月 4 日)将迎来 20 周年纪念。
目录
1.什么是GIT?
GIT 是一个开源的分布式版本控制系统,于 2005 年推出,由 Linus Torvald (yh,Linux 内核创建者)开发。
使用 GIT,我们可以在本地控制项目的版本 (在工作文件夹中),并将所有更改同步到远程存储库(例如在 GitHub 上)。
2.GIT如何工作?
想象一下一个物理文件柜,里面有一个文件夹,里面存放着所有项目文件。每当有人需要操作某个文件时,他们必须拿起它,从文件夹中取出,完成后再放回文件夹。这样,两个人就不可能同时操作同一个文件,从而完全避免了任何可能的冲突。
但 GIT 不是这么运作的! (感谢上帝)
这就是集中式版本控制系统的工作方式,其中用户需要“签出”和“签入”文件,即每当有人需要处理特定文件时,他们都需要签出该文件,将其从存储库中删除,然后在工作完成后签入该文件,将其返回到存储库。
在像GIT这样的分布式系统中,多个人可以访问同一个远程仓库的文件。每当有人需要操作某个文件时,他们只需将文件(或整个仓库)克隆到本地计算机,然后将修改发送回远程仓库即可。这使得多个人可以同时处理同一个项目,甚至可以操作相同的文件。
这使得大型开源项目能够分发,来自世界各地的人们可以在同一个项目上工作,管理修改和可能的冲突(是的,合并冲突可能会在这里发生)。
3.安装GIT
GIT适用于主要操作系统(Windows、Linux、MacOs……),安装过程非常简单,可以通过命令行或通过git-scm.com上的官方安装程序完成。
3.1 在 Windows 上
要在 Windows 上安装 GIT,只需访问官方网站并下载安装程序。然后按照说明操作即可,然后我们就可以在终端中使用 GIT 命令了。
3.2 在 Linux 上
对于 Linux,我们可以使用以下命令安装GIT :
sudo apt install git-all
通过这样做,GIT必须准备好在我们的终端中运行。
3.3 在 MacOS 上
对于 Mac,安装GIT最简单的方法是安装Homebrew,然后在终端中运行以下命令:
brew install git
然后GIT必须准备好在我们的终端中运行。
4.配置GIT
安装后,使用以下命令配置 GIT非常重要:
git config --global user.name "[username]"
# e.g. John Doe
git config --global user. email "[email@email.com]"
# e.g. johndoe@email.com
此外,可以通过删除
--global标签来为某些本地存储库配置特定用户。
5. 启动本地存储库
配置完GIT后,我们可以启动本地仓库了。为此,我们可以从头开始创建一个新的仓库,也可以克隆一个现有的远程仓库。
5.1 从头开始(git init)
要启动新的存储库,只需导航到所需的存储库根文件夹并运行以下命令:
git init
通过这样做,.git将在项目文件夹内创建一个目录,该目录将负责此本地存储库的工作文件夹中的版本控制。
5.2 克隆现有存储库(git clone)
克隆现有的远程存储库就像从头开始创建一个新的一样简单。为此,只需使用以下git clone命令,将要克隆的远程存储库 URL放在我们要下载存储库的文件夹中:
git clone [repository-url]
然后必须将整个存储库克隆到我们的本地机器并自动链接到相关的远程存储库。
git remote有了克隆的存储库,我们将来就不再需要使用该命令。
6. 使用 GIT
在我们的本地存储库中,我们可以创建项目所需的文件,但它们不会被 GIT 自动同步,当有任何需要版本控制的更改时,我们需要报告它。
因此,我们可以根据需要操作文件,并在完成所需的更改后将更新的文件发送到 GIT。
要做到这一点,重要的是要理解版本控制中存在3 个阶段的无限流程 (是的,无限) :
MODIFY -> STAGE -> COMMIT
-
修改:版本控制的第一阶段,在这里我们可以找到与上一个可用版本相比已更改的文件。
-
阶段:版本控制的第二阶段,这是我们放置想要添加到下一次提交的修改后的文件的地方。
-
提交:版本控制的最后阶段,当我们确认更改时,将阶段中修改的文件发送到本地存储库。
提交修改后的文件后,我们在本地存储库中有一个新版本,该版本可以再次接收更新,再次进入“已修改”状态,然后放入“阶段”,再次“已提交”,确认更新的版本等等(因此,“无限”哈哈)。
值得注意的是,提交不会覆盖已修改文件的旧版本,而是包含指向最后一个版本的指针的新版本,从而跟踪 GIT 跟踪的每个文件的版本。
6.1 添加和提交(git add 和 git commit)
虽然听起来很复杂,但执行版本控制流程其实非常简单。由于所需的修改已经完成,我们使用以下命令将要提交的修改文件添加到暂存区:
git add [filename]
git add -A-> 将所有修改过的文件一次性添加到暂存区。
git add *.[extensão-do-arquivo]-> 将所有修改过的、具有指定文件扩展名的文件一次性添加到暂存区(例如git add *.html)
我们可以使用以下命令随时检查当前本地存储库状态git status:
请注意,当我们git status在存储库中创建新文件后运行时,新文件显示为“未跟踪”。这意味着该文件是全新的,仍然需要添加到任何提交中才能被GIT跟踪。
可以让 GIT 忽略存储库中的特定文件或文件夹。为此,我们只需在根文件夹中添加一个名为 的文件,
.gitignore并在其中写入应忽略的文件或文件夹的名称。注意:被忽略的文件和文件夹将不再出现在 GIT 跟踪中,甚至不会显示为“未跟踪”。要重置跟踪,只需从
.gitignore文件中删除相应的名称即可。
要包含文件,我们可以git add使用要添加的文件的名称(在本例中为“index.html”)运行命令:
这样,通过重新运行,git status我们可以看到新文件已添加到“阶段”,并最终准备好在下一次提交中发送,这可以使用以下命令完成:
git commit -m "[descriptive-message]"
提交具有唯一的 ID(哈希码)并且是IMMUTABLE 的,即一旦确认就无法修改。
git commit -a-> 执行直接提交,将所有修改过的文件添加到暂存区并提交它们。
成功提交文件后,运行时git status我们会注意到没有更多修改过的文件需要上传,因为所有修改都已通过上次提交有效地保存在我们的本地存储库中。
此外,还可以通过查看存储库的提交日志来验证所做的更改git log,使用命令显示所有提交的一些元数据,例如哈希码、分支、作者、日期等。
可以重复整个过程以添加项目所需的新文件,修改它们并通过进行新的提交将它们发送到本地存储库。
git log -N-> 显示最后 N 次提交的日志。
git log [branch-A] [branch-B]-> 显示“branch-B”中但不在“branch-A”中的提交日志。
git log --follow [filename]-> 显示更改指定文件的提交日志,即使文件名称已更改。
git diff-> 列出与存储库中最新可用版本相比所做的更改。
git diff [nome-do-arquivo]-> 列出对指定文件相对于存储库中其最新可用版本所做的更改。
6.2 提交前后撤消更改
在提交之前,对本地存储库所做的任何更改都可以撤消或更改,但一旦提交,就无法更改。这是因为提交是不可变对象,这意味着不可能编辑或更改提交中的数据。
但是,我们可以创建新的提交来撤消更改,或者更正先前提交中的错误信息。无论哪种方式,我们都可以使用以下命令之一:
git checkout -- [filename]
# Discards changes made to the local file before the commit (irreversible action)
git reset --hard HEAD
# Discards changes made to a file that is in stage (before the commit)
git reset --hard HEAD~1
# Discards the last commit made in the local repository (only the last commit)
git commit --amend
# Creates a new commit, replacing the last commit made in the local repository
git revert [commit-hash]
# Creates a new commit, reverting the changes of the specified commit
7. 了解分支
分支只不过是存储库的一个分支,到目前为止,所有操作都是在分支上执行的master/main'。
默认情况下,在存储库中创建的第一个分支是
master/main,它是存储库的主分支。
7.1 为什么要使用分支?
乍一看可能没什么,但分支为项目开发提供了巨大的力量。
假设我们正在开发一个 Web 平台,并且想要测试一个新功能,但是我们的代码库已经托管或与其他人共享,任何有问题的更改都可能给他们带来不好的体验。我们该怎么办?
如果你一直在想复制粘贴项目文件夹,创建一个新的“测试版本”,那你就对了!嗯,差不多了……
使用 GIT,我们可以对分支做类似的事情。由于它们是分支,我们可以简单地创建一个名为“测试”的新分支,这样我们就可以在完全独立的分支中拥有一个项目版本,随时可以进行迁移,而不会危及主分支。
7.2 创建分支(git branch)
创建分支意味着创建存储库的并行副本,该副本可以独立处理,而不会影响master/main分支。为此,我们只需运行以下命令:
git branch [branch-name]
运行
git branch没有特定分支名称的命令必须显示存储库中可用分支的列表,其中“*”标记当前正在使用的分支。
在运行该git branch test命令之前,该git branch命令仅返回master分支。
创建新分支后,我们可以运行以下命令在可用分支之间切换:
git checkout [branch-name]
运行git checkout test命令后我们可以看到活动分支被切换了。从那一刻起,所有提交的信息都会被发送到test仓库的该分支master/main,而不会对分支产生影响。
我们可以根据需要创建任意数量的分支,并且可以使用以下命令与现有分支进行交互:
git checkout -b [branch-name]-> 使用给定名称创建一个新分支并直接切换到它。
git branch -d [branch-name]-> 删除指定分支。
git branch -m [new-name]-> 将当前分支的名称更改为给定的名称。
7.3 合并分支(git merge)
当完成不同分支上的工作后,并且我们确信所做的更改不会对项目造成任何问题,我们可以将当前分支合并master/main到分支中,将当前分支中的所有更改应用到存储库的主分支。
要合并分支,我们需要切换到将接收更改的分支并运行以下命令:
git merge [branch-name]
# Merge the given branch into the active branch
在这里,由于我们在分支上test,我们应该使用命令切换到分支mastergit checkout,然后git merge使用我们要合并的分支的名称(在本例中为“test”)运行命令。
通过这样做,在分支上完成的所有工作test (在本例中是文件的创建style.css)都将合并到分支中master。
7.4 合并冲突
如果一个或多个文件在同一行上发生更改并且无法自动完成合并,则合并不同的分支git merge可能会导致一些冲突。
当出现这种情况时,我们可以运行git status命令来检查哪些文件存在冲突。
在进行合并之前,我们需要解决冲突,要么定义哪些更改应该发生,要么检查所有更改是否相互兼容。为此,GIT 会在冲突的文件中插入标记来帮助解决问题。
解决冲突后,我们只需要将修改后的文件放回舞台,提交新的无冲突版本,然后git merge再次运行命令,该命令必须成功合并而不会出现任何问题。
8. 与远程存储库同步
我们已经知道可以将本地存储库连接到远程存储库并远程同步所有工作,使其保持最新。
为此,我们需要运行git push命令,将所有提交从本地存储库发送到远程存储库,但首先我们需要**配置一个远程存储库。
8.1 配置远程存储库
启动远程仓库非常简单。这里我们将使用GitHub来完成。
首先,我们需要在我们的 GitHub 帐户中启动一个新的空存储库(只需选择一个名称并单击“创建存储库”):
接下来,我们需要通过在本地存储库中运行以下命令来配置远程存储库和本地存储库之间的关系:
git remote add origin [remote-repository-url]
git remote -v-> 显示实际连接到本地存储库的远程存储库的 URL。
正确连接远程存储库后,我们需要使用以下命令将本地分支的名称更改为“main” master/maingit branch -m main (如果本地分支已命名,请忽略此步骤main):
保持本地存储库的主分支与我们要推送到的远程存储库的主分支同名非常重要。
最后,完成上述步骤后,我们可以使用以下命令首次将本地存储库与远程存储库同步:
git push -u origin main
当我们运行git push -u origin main命令时,我们可能需要输入我们的GitHub 凭证 (用户和访问令牌)。
如果您不知道什么是GitHub 访问令牌,或者您没有设置访问令牌,请单击此处。
我们也可以通过使用 GitHub CLI 配置身份验证来解决此问题。点击此处了解如何操作。
验证后,git push应该成功运行,并将本地存储库中的所有提交与远程存储库同步。
8.2 第一次之后的 Git 推送(git push)
完成上述所有步骤后,仅使用命令即可完成新的同步git push,无需任何其他参数,如下所示。
在这种情况下,使用GitHub CLI
git push绕过了运行命令所需的身份验证。您可以点击此处了解详情。
8.3 更新本地仓库(git pull)
使用分布式远程存储库,可能会远程 进行更改(直接在远程存储库中),从而导致我们的本地存储库过时。
考虑到这一点,更新本地存储库并同步我们在远程存储库中获得的任何更改非常重要,以确保本地项目始终具有远程存储库中可用的最新版本。为此,我们可以运行以下命令:
git pull
想象一下,我们的远程存储库中直接创建了一个新文件 ,因此我们的本地存储库现在已经过时了。README.md
在本地存储库中,我们可以使用上面提到的方法同步来自远程存储库的更改。git pull
我们运行命令时返回的前 7 行
git pull是命令的返回值git fetch。换句话说,如果我们git pull在不先运行git fetch命令的情况下运行该命令,GIT 将同时运行两者以从远程存储库检索更新并将其同步到本地存储库。
git fetch-> 从远程存储库获取更新,但不同步本地存储库(需要git pull)。
9. 结论
所有这些让我们确信,GIT 是程序员日常生活中必不可少的版本控制系统,了解它的主要命令和用法可以成为我们技术水平的转折点。最终,随着本地和远程存储库的同步和更新,以及我们迄今为止所学到的一切,我们已经准备好继续使用这个强大的版本控制系统了。
后端开发教程 - Java、Spring Boot 实战 - msg200.com





















