git学习
git学习
Mario查询你的git版本
1 | git --version |
存储库状态
1 | git status |
- Tracked
- not Tracked
并非所有文件夹都应由 git 跟踪。在这里,我们可以看到所有绿色文件夹都是项目被 git 跟踪,但红色文件夹不是。
您的配置设置
Github 有很多可以更改的设置。您可以更改用户名、电子邮件和其他设置。每当你检查你的更改时,git 都会在提交中添加一些关于你的信息,例如你的用户名和电子邮件。有一个 git 配置文件,用于存储您更改的所有设置。您可以进行设置,例如要使用的编辑器等。有一些全局设置和一些特定于存储库的设置。我建议您在 github 上创建一个帐户,然后使用您创建的电子邮件和用户名。
1 | git config --global user.email "your-email@example.com" |
Now you can check your config settings:
现在您可以检查您的配置设置:
1 | git config --list |
创建存储库
创建存储库是在系统上创建新文件夹并将其初始化为 git 存储库的过程。它只是对你的项目进行编码的常规文件夹,你只是要求 git 来跟踪它。若要创建存储库,可以使用以下命令:
1 | git status |
git status 命令将显示存储库的当前状态。 git init 命令将在您的系统上创建一个新文件夹并将其初始化为 git 存储库。这会将一个隐藏 .git 文件夹添加到您的项目中。
提交
提交是一种将更改保存到存储库的方法。这是一种记录更改并使其永久化的方法。您可以将提交视为代码在特定时间点的快照。当你提交你的更改时,你是在告诉 git 以永久的方式保存它们。这样,您始终可以回到那个时间点并查看您更改了什么。
通常的流程如下所示:
Write -> add -> commit
完整的 git 流程
一个完整的 git 流,以及将代码推送到 github 如下所示:
Stage
Stage 是一种告诉 git 跟踪特定文件或文件夹的方法。您可以使用以下命令暂存文件:
1 | git init |
在这里,我们正在初始化存储库并将文件添加到存储库中。然后我们可以看到该文件现在正在被 git 跟踪。目前,我们的文件位于暂存区域,这意味着我们尚未提交更改,但已准备好提交。
Commit
1 | git commit -m "commit message" |
在这里,我们将更改提交到存储库。我们可以看到,这些更改现在已经提交到存储库中。该 -m 标志用于向提交添加消息。此消息是对所做的更改的简短说明。您可以使用此消息来记住更改的内容。缺少该 -m 标志将导致打开默认设置编辑器(通常是 VIM)的操作。在下一节中,我们将将其更改为 vscode。
Logs
1 | git log |
此命令将显示存储库的历史记录。它将显示对存储库所做的所有提交。您可以使用该 --oneline 标志仅显示提交消息。这将使输出更紧凑,更易于阅读。
更改默认编辑器
您可以将系统中的默认代码编辑器更改为 vscode。为此,您可以使用以下命令:
1 | git config --global core.editor "code --wait" |
.gitignore
Gitignore 是一个告诉 git 要忽略哪些文件和文件夹的文件。这是一种防止 git 跟踪某些文件或文件夹的方法。您可以使用以下命令创建 gitignore 文件并添加要忽略的文件和文件夹列表:
1 | node_modules |
现在,当您运行该 git status 命令时,它不会将 node_modules and .vscode 文件夹显示为 git 正在跟踪。
内部工程逻辑
Branched in git
分支是一种同时处理项目不同版本的方法。它们允许您创建单独的开发线,该线可以独立于主分支进行处理。当您想要在不影响主分支的情况下对项目进行更改时,或者当您想要处理新功能或错误修复时,这可能很有用。
有些开发人员可以处理页眉,有些开发人员可以处理页脚,有些开发人员可以处理内容,有些开发人员可以处理布局。这是如何在 git 中使用分支的一个很好的例子。
HEAD in git
HEAD 是指向您正在处理的当前分支的指针。它指向当前分支中的最新提交。当您创建新分支时,它会自动设置为该分支的 HEAD。
默认分支以前是 master,但现在称为 main。主要没有什么特别之处,它只是一个惯例。
Creating a new branch
若要创建新分支,可以使用以下命令:
1 | git branch 列出当前存储库中的所有分支 |
为什么推荐使用 git switch 而非 git checkout 进行分支切换呢
- 明确的目的性:
git checkout命令原本用于完成三个不同的任务:切换分支、检出某个特定提交或者恢复工作目录文件。这种多功能性有时会导致混淆,特别是对于新手用户。git switch命令专注于分支切换这一单一任务,使得意图更加清晰。
- 避免意外修改:
- 在旧版
git checkout中,如果不小心在工作目录中有未暂存改动的情况下切换分支,可能会丢失这些改动,因为 Git 会自动重置工作目录到目标分支的状态。 git switch默认不会允许在有未提交更改的情况下切换分支,除非显式加上-m或--merge参数来尝试合并本地更改,或者-f或--force参数强制覆盖。
- 在旧版
- 一致性与用户体验:
git switch和git restore命令是在 Git 2.23 版本后引入的,它们分别负责分支切换和文件还原,这使得 Git 的命令集更加一致和易于理解。- 用户体验得到了改善,因为开发者不需要记忆
git checkout的各种行为差异,而是可以根据命令名字直观地了解其功能。
- 简化命令行选项:
- 创建并切换分支的操作,之前需要用
git checkout -b实现,现在可以直接通过git switch -c完成,二者功能相同,但是后者更加符合命令逻辑。
- 创建并切换分支的操作,之前需要用
- 友好错误提示:
git switch在处理不可行的分支切换时,提供的错误信息更加清晰和友好,可以帮助开发者更快识别问题并采取正确的行动。
总结来说,git switch 是为了提升易用性和减少潜在错误而推出的专门用于分支切换的新命令,它旨在提供一种更为安全、更专注且更易于理解的方式来管理 Git 分支。
应用场景
git checkout命令
git checkout 是一个全能型命令,过去不仅用于切换分支,还包括恢复工作目录文件到特定版本以及创建新分支并立即切换到该分支等功能。例如:
1.分支切换
使用 git checkout <branch-name> 命令可以快速切换到目标分支。
1 | #将当前分支切换到名为 main 的分支 |
2.创建新分支
使用 git checkout -b <new-branch-name> 命令可以快速创建并切换到新分支。
1 | #将创建一个名为 feature-branch 的新分支,并立即切换到该分支 |
3.撤销修改
有时候我们可能会误修改了某些文件,需要将其还原到之前的状态,这时候就可以使用 git checkout 命令来撤销修改。使用 git checkout -- <file> 命令可以将指定文件还原到最近一次提交的状态。
1 | # 将还原 index.html 文件到最近一次提交的状态 |
4.切换提交版本
使用 git checkout <commit-id> 命令可以切换到指定的提交版本。
1 | # 将切换到提交 ID 为 abc123 的版本 |
5.还原文件到指定版本
有时候我们可能需要将某个文件还原到指定的提交版本,而不影响其他文件的状态。 使用 git checkout <commit-id> -- <file> 命令可以将指定文件还原到指定的提交版本。
1 | # 将 index.html 文件还原到提交 ID 为 abc123 的版本 |
git switch命令
git switch 是一个新引入的命令,用于切换分支。与传统的 git checkout 相比,git switch 更加专注于分支切换操作,具有更清晰明了的命令用法。
1.分支切换
使用 git switch <branch-name> 命令可以快速切换到目标分支。
1 | # 将当前分支切换到名为 main 的分支。 |
2.创建新分支
使用 git switch -c <new-branch-name> 命令可以快速创建并切换到新分支。
1 | # 将创建一个名为 feature-branch 的新分支,并立即切换到该分支。 |
3.切换到上次访问的分支
有时候我们可能需要快速切换到上次访问的分支,而不需要记住分支名。使用 git switch - 命令可以快速切换到上次访问的分支。
1 | # 切换到上次访问的分支。 |
合并分支(merge)
Fast-forward merge
这很容易,因为您尝试合并的分支通常位于前面并且没有冲突。
完成分支的工作后,可以将其合并回主分支。这是使用以下命令完成的:
1 | git checkout main |
这是一个快进的合并。这意味着 bug-fix 分支中的提交直接合并到分支中 main 。当您想要合并已推送到远程存储库的分支时,这可能很有用。
Not fast-forward merge
在这种类型的合并中,master 分支也有效,并且有一些不在 bug-fix 分支中的提交。这不是一个快进的合并。
完成分支的工作后,可以将其合并回主分支。这是使用以下命令完成的:
1 | git checkout main |
如果命令相同,快进合并和不快进合并有什么区别?
区别在于解决冲突。在快进合并中,没有冲突。但是在不快进的合并中,存在冲突,并且没有解决它们的捷径。您必须手动解决冲突。决定,保留什么,丢弃什么。VSCode 有一个内置的合并工具,可以帮助您解决冲突。
重命名分支名
您可以使用以下命令重命名分支:
1 | git branch -m <old-branch-name> <new-branch-name> |
删除分支
您可以使用以下命令删除分支:
1 | git branch -d <branch-name> |
检出分支
您可以使用以下命令检出分支:
1 | git checkout <branch-name> |
列出所有分支
您可以使用以下命令列出所有分支:
1 | git branch |
Git diff
这是一个 git diff 信息性命令,显示两个提交之间的差异。它用于将一个提交中所做的更改与另一个提交中所做的更改进行比较。Git 将同一文件的更改版本视为两个不同的文件。然后,它为这两个文件命名并显示它们之间的差异。
How to read the diff
a -> file A and b -> file B
—- indicates the file A
+++ indicates the file B
@@ indicates the line number
这里的文件 A 和文件 B 是同一个文件,但版本不同。
Git 将显示在文件 A 和文件 B 中所做的更改。它还将显示发生更改的行号以及更改的少量预览。
比较工作目录和暂存区
1 | git diff |
此命令显示与暂存区域相比,工作目录中未暂存的更改。仅此命令不会显示在文件 A 和文件 B 中所做的更改,您需要提供选项来显示更改。
将暂存区域与存储库进行比较
1 | git diff --staged |
此命令显示上次提交与暂存区域之间的更改(即已暂存并准备提交的更改)。
分支之间的比较
1 | git diff <branch-name-one> <branch-name-two> |
此命令比较两个分支之间的差异。例如:
比较两个分支之间差异的另一种方法是使用以下命令:
1 | git diff branch-name-one..branch-name-two |
比较特定提交
1 | git diff <commit-hash-one> <commit-hash-two> |
此命令比较两个提交之间的差异。
Git Stash
“存储”是一种将更改保存在临时位置的方法。当您想对文件进行更改但还不想提交它们时,它非常有用。然后,您可以稍后返回到该文件并应用更改。
冲突的更改将不允许您在不提交更改的情况下切换分支。另一种替代方法是使用该
git stash命令将更改保存在临时位置。
1 | git stash |
此命令将更改保存在临时位置。它就像一堆更改,您可以稍后访问。
命名藏匿处
您还可以使用以下命令命名存储:
1 | git stash save "work in progress on X feature" |
查看藏匿清单
您可以使用以下命令查看存储列表:
1 | git stash list |
应用储藏室
您可以使用以下命令应用存储:
1 | git stash apply |
应用特定存储
您可以使用以下命令应用特定存储:
1 | git stash apply stash@{0} |
这是 stash@{0} 藏匿处的名称。您可以使用该 git stash list 命令获取存储的名称。
应用和删除存储
您可以使用以下命令应用和删除存储:
1 | git stash pop |
删除藏匿处
此命令应用存储并将其从存储列表中删除。
1 | git stash drop |
将存储应用于特定分支
您可以使用以下命令将存储应用于特定分支:
1 | git stash apply stash@{0} <branch-name> |
清理藏匿处
您可以使用以下命令清除存储:
1 | git stash clear |
Git Tags
标签是一种标记存储库中特定点的方法。当您想要记住代码的特定版本或想要引用特定提交时,它们非常有用。标签就像便笺一样,您可以将其附加到提交中。
创建标签
您可以使用以下命令创建标签:
1 | git tag <tag-name> |
此命令创建具有指定名称的新标签。标记将附加到当前提交。
列出所有标签
您可以使用以下命令列出所有标签:
1 | git tag |
此命令列出存储库中的所有标签。
标记特定提交
您可以使用以下命令标记特定提交:
1 | git tag <tag-name> <commit-hash> |
将标签推送到远程存储库
您可以使用以下命令将标签推送到远程存储库:
1 | git push origin <tag-name> |
删除标签
您可以使用以下命令删除标签:
1 | git tag -d <tag-name> |
删除远程存储库上的标记
您可以使用以下命令删除远程存储库上的标签:
1 | git push origin :<tag-name> |