课程
无论您是软件开发者、数据科学家、数据工程师,还是机器学习从业者,Git 都是处理代码不可或缺的工具。它让团队能够同时协作同一项目,并提供清晰的修改历史,便于跟踪与管理更新。
在本文中,我将带您了解最常用的 Git 命令、它们的语法,以及如何在日常工作中应用!
基础 Git 命令
使用 Git 的基本步骤包括创建仓库、复制已有仓库以及编辑代码。本节将详细介绍这些基础 Git 功能,并给出实现它们的语法。
需要安装 Git?请按照本指南在您的系统上安装 Git。
git init
git init 命令用于创建一个新的 Git 仓库或重新初始化一个已有仓库。
运行该命令后,您当前的目录会变成一个 Git 仓库,从而可以跟踪其中的变更。该目录下会新增一个隐藏的 .git 文件夹,Git 会在此存储与项目相关的所有元数据、版本历史和日志。
git clone
要将一个 Git 仓库从某处复制到另一处,我们使用 git clone 命令。它通常用于从 GitHub 或 GitLab 等远程服务器复制现有仓库(包括日志和版本)到本地计算机。
步骤 1: 进入您想克隆的 GitHub 仓库并点击“Code”。

git clone 命令
步骤 2: 按图所示复制 URL。

git clone 基本命令
步骤 3: 前往您希望在本地克隆该仓库的目录,执行以下命令:
git clone <copied_URL>
git status
git status 命令会显示以下详细信息:
- 已修改的文件(已更改但未暂存)。
- 未跟踪的文件(Git 未跟踪的文件)。
- 已暂存的文件(已暂存、可提交)。
语法如下:
git status

Git status 命令
git add
git add 命令将您的更改添加到暂存区。它告诉 Git:当用户执行提交命令后,仓库应更新这些更改。
git add .:暂存对所有文件的更改。git add <file_name>:仅将某个特定文件的更改加入暂存区。
git commit
git commit 命令会将您已做出的(或已暂存的)更改保存到本地仓库。每次运行 git commit,Git 都会在该时刻为您的仓库创建一个快照。这样您就可以在需要时回滚到先前的提交。
语法如下:
git commit -m "commit_message"
提交消息是对该次提交所做更改的简要描述。
与远程仓库协作
GitHub 在其远程服务器上托管了各类应用,便于开发者进行跟踪与管理。本节我们将了解如何通过 Git 命令提取、传输并与这些远程仓库交互。
想了解 GitHub 的工作方式?先从GitHub 概念入门开始,理解仓库、拉取请求与协作最佳实践。
git remote add
git remote add 命令在您的本地 Git 仓库与远程 Git 仓库之间创建连接,使您能够在两者之间推送和拉取更改:
git remote add <repo_name> <remote_url>
<repo_name>:远程仓库的昵称(默认是“origin”)。<remote_url>:远程仓库的 URL。
git push
git push 命令会将您的远程仓库与本地仓库同步。执行后,远程仓库将反映您在本地提交的所有更改。
git push <remote> <branch>
<remote>:远程仓库的别名(默认是“origin”)。<brach>:您要推送的分支名称。
还有一些 git push 的变体,例如:
git push ---all origin
上述命令会将您所有本地分支推送到远程仓库。
git push --force origin main
上述命令会用您的本地 main 分支覆盖远程仓库的 main 分支。使用时请谨慎,因为远程 main 分支可能会失去其全部历史。
git pull
git pull 命令会获取并将远程仓库中的更改与本地仓库合并。
git pull 实际上是两个命令的组合:git fetch 和 git merge。
首先,git fetch 会从远程仓库检索所有更改,包括新的提交、标签和分支。随后执行 git merge,将这些更改集成到当前本地分支。
语法如下:
git pull origin feature-branch
以上命令会从远程仓库的 feature_branch 获取数据,并将其合并到您当前的本地分支。
git fetch
git fetch 命令允许您在将更改合并到本地之前,先查看远程仓库中的更改。它会下载更改并更新到远程跟踪分支。对于不熟悉该概念的读者,远程跟踪分支是远程仓库分支的副本。
例如,以下命令会下载远程仓库中的更改,并将其更新到 origin 名下的远程跟踪分支:
git fetch origin
Git 中的分支与合并
Git 分支允许开发者在不影响主仓库的情况下独立开发新功能或修复缺陷。准备就绪后,通过合并将变更集成到主代码库。下面我们来探索此过程中涉及的关键命令。
git branch
git branch 命令用于列出、创建或删除分支。分支是您仓库的另一个版本。
如果您正在为应用开发新功能,您可以创建并在一个新分支上工作。变更准备就绪并通过测试后,您可以将该新分支合并回主分支。这使您能够独立开发新功能,而不直接影响主干。
git branch:输出仓库中所有分支的列表。git branch <branch_name>:创建名为“branch_name”的新分支。git branch -d <branch_name>:删除名为“branch_name”的分支。
git checkout
git checkout 命令可执行两类操作:在分支之间切换,或将文件还原到先前状态。
- 切换分支: 在 Git 2.23 之前,
git checkout branch_name用于从当前分支切换到另一分支。除切换外,它还可用于创建并切换到新分支。
以下命令会创建名为“feature_branch”的新分支并切换到该分支:
git checkout -b feature_branch
不过,在最新版 Git 中,恢复文件的操作已由 git switch 替代 git checkout。
- 还原文件: 您可以丢弃对某文件所做的更改,并将其还原到之前的版本,命令如下。
git checkout -- <file-name>
您也可以从其他分支还原某个文件,如下所示:
git checkout <branch-name> -- <file-name>
git merge
如果您在新分支上完成了一些工作,可以使用 git merge 将其合并到主分支以引入这些更改。Git 有两种合并方式:
- 快进合并(Fast-forward): 假设您从主分支创建了名为 "feature_x" 的新分支并在其上工作。如果自您创建 "feature_x" 以来主分支没有任何更新,那么 Git 不会在主分支上新建一个合并提交,而是直接将主分支的指针前移到 "feature_x" 的最新提交。
- 三方合并(Three-way merge): 如果 "feature_x" 和主分支都有编辑,Git 会合并这些更改,并在主分支上创建一个新的合并提交。
例如:
C---D---F (feature-branch)
/
A---B---E---G (main)
在提交 B 处创建了功能分支 C。创建该分支后,主分支又有了额外提交 E 和 G。因此将功能分支合并到主分支时,会在主分支上生成一个新的合并提交 M,如下所示:
C---D---F (feature-branch)
/ \
A---B---E---G---M (main)
git rebase
git rebase 是另一种在分支间集成更改的方式,但其工作方式与 git merge 不同。合并会保留主分支与功能分支的完整历史;而变基会重写提交历史,使其更线性、更干净。
此外,合并需要额外的合并提交,而变基不会创建新的提交。Git 变基通常包括两步:
- 切换到功能分支
- 变基到主分支。
例如:
C---D---F (feature-branch)
/
A---B---E---G (main)
- 步骤 1: 执行
git checkout feature_branch。 - 步骤 2: 执行
git rebase main:将整个功能分支移动到主分支之上,把提交C、D、F重新应用为C’、D’、F’,置于主分支最新提交G之后。这样会创建如下所示的线性提交历史:
A---B---E---G---C'---D'---F' (main)
鉴于合并与变基经常被混淆,下面总结二者的差异:
|
合并 |
变基 |
|
保留两个分支的完整提交历史。 |
重写提交历史,使其线性化。 |
|
会创建一个额外的合并提交。 |
不会创建额外提交。 |
|
历史中能看到分支结构。 |
让提交历史看起来像一条直线。 |
|
适用于追踪各分支的提交历史,包括合并时间线。 |
当您需要清晰、易理解的提交历史时使用。 |
想进一步了解如何处理远程分支?请在这篇分步教程中学习如何使用 git checkout 检出并跟踪远程分支。
Git 历史与撤销更改
Git 提供多种命令用于查看历史并在开发的不同阶段撤销更改。这里讨论相关命令。
git log
git log 命令会显示当前分支的完整提交历史。它包含四个关键字段:提交、作者、日期和提交消息。

git 提交历史
- Commit:唯一 ID。
- Author:作者姓名与邮箱。
- Date:提交更改的时间戳。
- Commit message:提交说明。
git diff
git diff 会展示仓库不同状态之间的差异——无论是比较当前工作目录与暂存区、暂存区与上一次提交,还是比较两个文件或分支,您都可以按需指定。
git diff—— 显示当前工作目录与暂存区的差异。git diff -- cached:显示暂存区与上一次提交之间的差异。git diff commit1 commit2—— 比较commit 1与commit 2之间的差异。git diff branch1..branch2—— 比较branch 1与branch 2的差异。
git reset
git reset 命令可通过将当前 HEAD 重置到某个先前状态来撤销更改。要将 HEAD 移动到之前的提交,reset 命令可搭配三种模式使用:“soft”、“mixed” 和 “hard”。
- Soft:回退到之前的提交,但保留当前更改在暂存区,便于稍后重新提交。
git reset --soft HEAD~1
- Mixed: 回退到之前的提交,并将当前提交的更改从暂存区移除,但这些更改在工作目录中仍会保留。
git reset --mixed HEAD~1
- Hard: 指向之前的提交,同时从工作目录和暂存区中移除当前提交带来的更新。
git reset --hard HEAD~1
需要在 Git 中撤销更改?请在这篇详细指南中了解 git reset 与 git revert 的区别。
Git 暂存与清理
在使用 Git 时,您可能需要在不提交的情况下临时搁置更改,或清理让仓库变得杂乱的不必要文件。此时,Git 的暂存与清理命令会非常有用。
git stash
假设您想回到之前的状态,但又不想提交当前的进度;您可以使用 git stash。它会临时保存未提交的更改,并将工作目录重置为上一次提交的状态。
git stash pop
如果您之前进行过 stash 并希望将这些更改重新应用到工作目录,使用 git stash pop。它会将最新的暂存更改应用到当前目录,并从暂存列表中移除。
git clean
git clean 命令会删除 Git 仓库中的未跟踪文件。请先使用 git clean -n 预览将被删除的内容,再执行清理命令!
想清理您的 Git 历史?了解如何将多个提交合并为一个,请查看这篇Git squash 教程。
Git 配置与用户设置
Git 允许您在不同层级配置用户设置。我们来逐一了解。
git config
git config 命令允许您根据需要自定义 Git 设置。可以在三个层级进行配置:本地(local)、系统(system)和全局(global)。
- 系统层级: 覆盖范围最广,需要 root 级权限。
- 全局层级: 为当前用户的所有仓库应用配置。
- 本地层级: 针对当前 Git 仓库的配置。
以下是一些常见的 git config 命令:
git config -list:显示所有层级的 Git 设置。git config --global user.name "Your_name":将系统上所有仓库的 Git 用户名设置为 “Your_name”。git config --global user.email "your.email@example.com":为系统上所有仓库设置邮箱地址。
我们知道在初始化 Git 仓库时,默认主分支是 master。但您可以用以下命令将其重命名为任意名称:
git config --global init.defaultBranch "srujana_master"
在上述命令中,我们将全局层级(系统中所有仓库)的默认 master 分支替换为 "srujana_master"。
您还可以应用其他全局层级设置。例如,将默认文本编辑器更改为 VS Code,运行:
git config -global core.editor "code-w"
您也可以创建自定义 Git 命令。例如:
git config --global alias.slice branch
上述命令为 branch 创建了一个新别名 slice。因此,如果您要创建新分支,可以执行 git slice branch_name,而无需输入 git branch branch_name。
Git 命令汇总
以下是我们为您整理的 Git 命令总结,便于随时查阅:
|
命令 |
说明 |
示例用法 |
|
|
初始化一个新的 Git 仓库。 |
|
|
|
克隆一个已有的 Git 仓库。 |
|
|
|
检查工作目录中文件的状态。 |
|
|
|
将文件添加到暂存区。 |
|
|
|
将已暂存的更改提交到本地仓库。 |
|
|
|
添加远程仓库连接。 |
|
|
|
将提交的更改推送到远程仓库。 |
|
|
|
从远程仓库获取并合并更改。 |
|
|
|
从远程仓库获取更改但不合并。 |
|
|
|
列出、创建或删除分支。 |
|
|
|
在分支间切换或还原文件(较旧的方法)。 |
|
|
|
在分支间切换(新版本中更推荐)。 |
|
|
|
将一个分支的更改合并到另一个分支。 |
|
|
|
将一个分支上的提交重新应用到另一个分支,以获得更干净的历史。 |
|
|
|
查看提交历史。 |
|
|
|
显示仓库不同状态之间的差异。 |
|
|
|
通过将 HEAD 重置到之前的状态来撤销更改。 |
|
|
|
临时保存未提交的更改并重置工作目录。 |
|
|
|
将最新的暂存更改应用到工作目录。 |
|
|
|
从仓库中移除未跟踪的文件。 |
|
|
|
在系统、全局或本地层级配置 Git 设置。 |
|
使用 Git 的最佳实践
高效使用 Git 不仅仅是跟踪更改——更在于维护一个干净、有条理且具备协作性的工作流。遵循最佳实践有助于确保您的仓库保持有序、提交历史有意义,开发过程顺畅。
以下是使用 Git 时值得养成的一些关键习惯:
- 频繁提交: 使用 Git 等版本控制的首要目的之一是随时间有效跟踪更改。与其一次提交多个更改,不如将每项更改分别提交,便于之后理解每个提交修改了什么。
- 撰写清晰的提交消息: 每次提交都配上一条清晰的说明,描述该提交的内容。下次回溯提交历史时,更容易知道每个提交对代码做了哪些更改。
- 使用分支: 为每个新功能或缺陷修复创建分支,在其上开发并合并。这样能将新开发工作与主项目隔离,是最佳实践。
- 使用 .gitignore: .gitignore 文件包含与项目相关但无需跟踪的文件和目录,通常包括自动生成文件、构建产物、日志、临时文件以及平台特定文件。忽略它们可以避免不必要的日志与版本跟踪,保持历史干净。
结语
Git 是一个强大的工具,能够用于跟踪更改、与他人协作,并维护结构良好的开发工作流。本文介绍了关键的 Git 命令与最佳实践,助您更高效地管理项目。
当然,总有更多值得学习的内容!如果您刚刚起步,请查看Git 入门以夯实基础。若希望进一步提升技能,进阶 Git将更深入探讨高级工作流与技巧。
需要为今后的项目准备一份快速 Git 参考?请收藏这份Git 速查表以备不时之需!
FAQs
git pull 和 git fetch 有什么区别?
git pull 会从远程仓库获取更改并将其合并到您的本地分支,而 git fetch 只会下载更新,便于您在合并前进行查看。
如何重命名一个 Git 分支?
重命名当前分支:
git branch -m new-branch-name
若要重命名其他分支:
git branch -m old-branch-name new-branch-name如何在 Git 中删除分支?
删除本地分支:
git branch -d branch-name
删除远程分支:
git push origin --delete branch-namegit merge 和 git rebase 有什么区别?
git merge 在保留历史的同时合并不同分支的更改,而 git rebase 会重写提交历史,创建更干净、线性的序列。
我可以撤销一次 git 提交吗?
可以!若要撤销上一次提交但保留更改在暂存区:
git reset --soft HEAD~1
撤销上一次提交并将更改移出暂存区:
git reset --mixed HEAD~1
彻底丢弃更改:
git reset --hard HEAD~1如何查看我当前所在的分支?
运行:
git branch --show-current
或直接:
git status如何撤销对单个文件的更改?
丢弃文件中未暂存的更改:
git checkout -- filename
将文件还原到上一次提交的状态:
git restore filename如何列出 Git 仓库中的所有远程分支?
使用:
git branch -r如何在 Git 中强制推送一个分支?
强制推送会覆盖远程更改,请谨慎使用:
git push --force origin branch-name如何查看 Git 提交的图形化历史?
如果您想以图形化的方式查看提交历史:
git log --oneline --graph --all --decorateSrujana 是一名自由职业技术写作者,拥有计算机科学四年制学位。她擅长撰写各类主题的内容,包括数据科学、云计算、开发、编程、安全等众多领域。她热爱经典文学,也喜欢探索新的旅行目的地。
