☰
Git 入门到上手:常用命令语法详解与实战示例(适合初学者)
2026/10/14 16:01:43 网站建设 项目流程

Git 是一个分布式版本控制系统,用来记录代码的每一次改动。它几乎出现在每个软件项目里,算是开发者绕不过去的一门基本功。

这篇教程面向第一次接触 Git 的人。下面每一节先给出命令,再给一个可以直接在终端里敲的例子,并尽量附上运行后大致会看到的结果,方便你对照。看的时候建议同时打开终端跟着敲一遍,只看不练很容易忘。

文中命令在 Git 2.23 及以上版本都能正常运行。Windows 用户打开 Git 自带的 Git Bash,命令和 macOS、Linux 完全一样。

一、Git 是什么

Git 会保存项目的历史快照,主要用来做这几件事:

  • 把文件恢复到之前某一次提交时的状态。
  • 单独开一条分支写新功能,写坏了也不影响主线。
  • 多个人同时改同一个项目,再把各自的改动并到一起。
  • 把代码同步到 GitHub、GitLab、Gitee 这类远程仓库,方便备份和协作。

它和 SVN 这类早期工具最大的区别是「分布式」。每台电脑上都保存着一份完整的仓库,包含全部提交历史。远程服务器一时连不上,你照样能查历史、能提交,等网络恢复再同步过去。

几个后面会反复出现的名词:

名词含义
工作区你正在编辑的项目文件夹
暂存区下一次提交要包含的改动先放到这里
本地仓库项目里的 .git 目录,存放全部提交历史
远程仓库GitHub、GitLab 等服务器上的仓库
HEAD指向当前所在提交的指针

改动通常沿着这样一条路走:工作区 → 暂存区 → 本地仓库 → 远程仓库。记住这条线,后面大部分命令在做什么就能对上号。

二、下载与初次配置

安装 Git

Git 官网的下载页(各系统通用):https://git-scm.com/downloads 。打开后它会自动识别你的操作系统,给出对应的下载链接。

Windows 到 https://git-scm.com/download/win 下载 .exe 安装包,双击运行,一路点 Next 用默认选项就行。装完后在开始菜单里能找到 Git Bash,这是 Git 自带的命令行工具,后面的例子都在它里面运行。

macOS 到 https://git-scm.com/download/mac 下载安装包;系统里如果装过 Xcode 命令行工具,可能已经有 git 了,终端输入xcode-select --install可以补装。用 Homebrew 的话执行brew install git。

Linux 一般直接用系统自带的包管理器:

  • Ubuntu / Debian:sudo apt-get install git
  • CentOS / Fedora:sudo yum install git(较新的版本可以写sudo dnf install git)
  • 其他发行版见 https://git-scm.com/download/linux

装完打开终端确认一下版本:

git--version

会看到类似这样的输出:

git version 2.39.2

配置身份

第一次使用前,先告诉 Git 你是谁。这些信息会写进每一次提交记录里:

gitconfig--globaluser.name"你的名字"gitconfig--globaluser.email"you@example.com"

--global表示对当前电脑上的所有仓库生效。如果只想给某一个仓库单独设置,去掉这个参数,在仓库目录里再执行一次。

想确认配置有没有写进去,可以查看:

gitconfig--list

输出里会包含类似user.name=你的名字、user.email=you@example.com的行。

还有两个可选设置,能让日常使用舒服一点:

gitconfig--globalcolor.ui auto# 命令输出带颜色gitconfig--globalcore.editor"nano"# 需要编辑提交信息时用哪个编辑器

三、创建与克隆仓库

从零新建一个仓库

mkdirmy-projectcdmy-projectgitinit

执行git init后会提示Initialized empty Git repository in .../my-project/.git/。项目里多出一个隐藏的 .git 目录,Git 就是靠它跟踪改动的。这个目录不要手动改动或删除,否则历史会损坏。

把远程仓库复制到本地

更常见的是拿到一份已有的项目:

gitclone https://github.com/user/repo.git

Git 会把代码和完整历史一起下载下来,并自动把远程地址记成origin。如果不想用默认的目录名,可以在后面加一个名字:

gitclone https://github.com/user/repo.git my-folder

克隆过程中会看到Resolving deltas: 100% ... done.之类的输出,结束后进入目录就能开始干活:

cdrepo

四、查看状态、添加与提交

这是每天都会重复的循环。动手改代码之前,先弄清每一步在做什么。

查看当前状态

gitstatus

比如你新建了一个 app.py,又改动了 README.md,会看到类似这样的输出:

On branch main Changes not staged for commit: modified: README.md Untracked files: app.py

modified表示文件被改过但还没放进暂存区,Untracked表示 Git 还没开始跟踪这个新文件。心里没底时,先敲一下 git status 多半能看清楚情况。

把改动放进暂存区

gitaddapp.py# 只添加 app.pygitadd.# 添加当前目录下所有改动gitaddsrc/# 添加整个 src 目录

提交

gitcommit-m"新增 app.py 入口文件"

-m后面跟的就是提交说明。如果改动的都是已经被跟踪的文件,可以省略 add,一步完成:

gitcommit-am"修正 README 里的安装步骤"

要注意-am只对已被跟踪的文件有效,新建的文件还是得先git add。

提交说明写清楚「改了什么、为什么」,比如「修复登录超时导致的报错」。像「update」「修改」这种看不出内容的说明,过一段时间连你自己也看不懂。

查看具体改了什么

gitdiff# 工作区还没暂存的改动gitdiff--staged# 已经放进暂存区、马上要提交的改动

diff 的输出里,以+开头的是新增行,以-开头的是删除行。比如给 README.md 加了一行说明,会看到:

diff --git a/README.md b/README.md --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ # 我的项目 +这是一行新增的说明 原来的一行

提交前扫一眼,能避免把调试用的临时改动一起交上去。

查看提交历史

想知道项目一路改了什么,用git log:

gitlog--oneline

输出里每一行是一次提交,前面是提交号,后面是提交说明:

9f8e7d6 修正 README 里的安装步骤 a1b2c3d 新增 app.py 入口文件 3c4d5e6 初始化项目

如果同时开着多条分支,加上--graph能看到分支的合并走向:

gitlog--oneline--graph

平常--oneline就够用,排查问题、回退版本时先在这里找到对应的提交号。

五、分支管理

分支可以让你在不影响主线(通常是 main)的情况下开发新功能。

gitbranch# 列出本地分支,当前分支前面带 *gitbranch-a# 连远程分支一起列出gitbranch feature-x# 新建分支 feature-xgitcheckout feature-x# 切换过去gitswitch feature-x# 效果一样,Git 2.23 之后更推荐这个写法

新建并直接切换过去是常用操作,两种写法都行:

gitcheckout-bfeature-xgitswitch-cfeature-x

功能写完,切回主分支再合并:

gitcheckout maingitmerge feature-x

合并成功时提示Fast-forward,意思是 main 直接指到了 feature-x 的最新提交。合并完之后,用不到的分支可以删掉:

gitbranch-dfeature-x# 删除已合并的分支gitbranch-Dfeature-x# 分支还没合并时强制删除

遇到冲突怎么办

如果两个分支改了同一个文件的同一处,Git 没法自动决定该保留哪个,就会提示:

CONFLICT (content): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result.

打开 README.md,能看到 Git 用标记把两边的版本都留了下来:

<<<<<<< HEAD 这行是当前分支(main)的内容 ======= 这行是 feature-x 分支的内容 >>>>>>> feature-x

你要做的是手动决定最终保留什么,删掉<<<<<<<、=======、>>>>>>>这几行标记,然后:

gitaddREADME.mdgitcommit

这样冲突就解决了。冲突并不可怕,本质上是 Git 停下来,请你自己拿主意。

六、与远程仓库同步

gitremote-v# 查看当前关联的远程仓库地址gitpush-uorigin main# 首次推送并建立跟踪关系gitpush# 之后直接推送gitpull# 拉取远程更新并合并到本地gitfetch# 只下载远程更新,先不合并

git remote -v一般会输出两行,分别是 fetch 和 push 的地址,像这样:

origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push)

首次推送时-u会把本地 main 和远程 main 关联起来,之后在 main 分支上直接敲git push就行。git pull相当于先git fetch再git merge:把远程的新提交下载下来,再合进你当前的分支。开工前先 pull 一次,能少踩不少冲突。

七、撤销与回退

写错东西是常事,Git 提供了几种反转操作,用途不一样,别记混。

撤销工作区的改动

gitrestore app.py# 丢弃 app.py 里还没暂存的修改gitrestore--stagedapp.py# 把文件从暂存区移出,改动仍留在工作区

第一条会把 app.py 恢复成上次提交时的样子,改动直接丢掉,用之前想清楚。第二条只是把文件从暂存区拿回来,内容还在。

回退提交

gitreset--softHEAD~1# 撤销最近一次提交,改动留在暂存区gitreset HEAD~1# 撤销提交并清空暂存区,改动留在工作区gitreset--hardHEAD~1# 撤销提交并丢弃改动,危险

HEAD~1表示「上一个提交」,HEAD~2就是上上一个。--soft保留的改动最多,--hard会把改动真正删掉。只要提交还没推送到远程,用 reset 都没问题。

撤销已经推送的提交

提交已经推给别人了,就不该再改写历史。这时用git revert,它会新建一个提交,把之前那次改动抵消掉:

gitrevert HEAD

三个命令的区别,一张表看清楚:

命令作用提交已推送时能用吗
git revert新建一个提交抵消原提交可以
git reset移动分支指针,丢弃后面的提交不建议
git restore只恢复文件内容,不动历史可以

一句话:已经推送的用git revert,只有还在本地的才用git reset。

找回误删的东西

git reflog记录了 HEAD 的每一次移动,相当于操作日志。即使误删了分支或者 reset 过头,也能顺着它找回来。先看日志:

gitreflog

输出像这样,左边是每次操作后的提交号:

a1b2c3d HEAD@{0}: reset: moving to HEAD~1 9f8e7d6 HEAD@{1}: commit: 新增支付功能

假设你把「新增支付功能」那次提交 reset 没了,回到它即可:

gitreset--hardHEAD@{1}

八、临时保存:git stash

正在写一个功能,突然要切到别的分支处理急事,手头又不想提交,可以用 stash 把改动先收起来:

gitstash# 收起当前改动gitstash push-m"登录页做到一半"# 收起并加个说明gitstash list# 查看有哪些存档gitstash pop# 取出最近一条并删掉该记录gitstash apply stash@{1}# 取出指定存档,记录保留gitstash drop stash@{0}# 删掉某条存档

git stash list的输出类似stash@{0}: On main: 登录页做到一半,编号越小越新。处理完别的事,切回原分支执行git stash pop就能接着写。

九、进阶技巧

变基:git rebase

rebase 会把当前分支的提交一个个挪到目标分支的最新提交之后,让历史变成一条直线:

gitrebase main

还可以用交互模式整理最近几个提交:

gitrebase-iHEAD~3

打开的编辑器里每一行是一个提交,把开头的词改掉就能调整,常用的有pick(保留)、squash(并进上一条)、reword(改提交信息)、drop(丢掉)。

有一点要记住:rebase 会重写提交号,所以别对已经推送到共享分支的提交做 rebase,否则会让别人的仓库对不上。

摘取单个提交:git cherry-pick

只想要另一个分支上的某一次提交,又不想把整个分支合过来时用得上:

gitcherry-pick a1b2c3d

比如线上分支要补一个修复,就可以把开发分支上那次修复提交摘过来,不用等整条分支合并。

十、忽略文件:.gitignore

项目里有些文件不需要提交,比如依赖目录、编译产物、密钥文件。在项目根目录建一个 .gitignore,按行写规则:

node_modules/ venv/ dist/ __pycache__/ *.pyc .env .DS_Store Thumbs.db

末尾带/表示目录,*.pyc表示所有 .pyc 结尾的文件。要注意,已经被跟踪的文件不会因为写进 .gitignore 就自动被忽略,需要先用git rm --cached 文件名把它从跟踪列表里移出。

十一、一个完整的协作流程

把前面几节串起来,就是日常最典型的做法:

gitclone https://github.com/user/repo.git# 克隆项目cdrepogitcheckout-bfeature/login# 新建功能分支# 写代码……gitadd.gitcommit-m"实现用户登录功能"gitpush-uorigin feature/login# 推送分支# 到 GitHub 上发起 Pull Request,等评审和合并

main 分支一般保持随时可用,新功能都在自己的分支上做,通过 Pull Request 合并。这样即使改出了问题,也容易定位是哪一次改动引起的。

十二、常用命令速查表

用途命令
初始化仓库git init
克隆仓库git clone
查看状态git status
暂存改动git add .
提交git commit -m “说明”
查看历史git log --oneline
新建并切换分支git checkout -b
合并分支git merge
拉取更新git pull
推送git push
撤销工作区改动git restore
安全撤销提交git revert
临时存档git stash

十三、初学者常见问题

git add 和 git commit 有什么区别?
add 只是把改动放进暂存区,commit 才真正把它记进历史。可以理解为 add 是挑出要提交哪些改动,commit 是拍下这一刻的快照。

提交信息写错了怎么办?
如果还没推送,执行git commit --amend -m "新的说明"就能改掉最近一次提交的说明。

不小心把密钥提交上去了?
先在平台上把密钥作废,再用git revert撤销那次提交。.gitignore 只能阻止以后的文件被跟踪,清不掉已经进入历史的内容。

提示 Your branch is behind 是什么意思?
说明远程有别人新提交的代码,先git pull更新再继续。

总结

天天用得到的命令其实是固定的那十几个:init、clone、status、add、commit、push、pull、branch、checkout、merge、log,再加上撤销用的 restore、reset、revert。

学习方法上,先把「工作区 → 暂存区 → 本地仓库 → 远程仓库」这条线记住,然后在自己的小项目里反复练提交、开分支、合并这几步。等这些变成本能了,再看 stash、rebase、cherry-pick 这类进阶命令,会轻松很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询