扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

git命令行:看这一篇就够了

17小时前
177
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 于 2005 年开发,用于高效管理项目版本变更,支持从个人到大型团队的协作开发。‌ 它以本地化操作、快照存储和分支管理为核心特性,成为全球软件开发的标准工具。‌

我们就从最基础的 git initgit addgit commit 开始,一步步理解 Git 的运作机制;再到远程协作、分支管理、版本回退、冲突解决,乃至高级操作如 rebasestash。每一个命令都配有实际使用场景和直观示例,让你不仅“会用”,更能“用得明白”。

一、快速开始

1、git客户端命令行

使用git命令直接查看,如下所示:

C:Usersyeqin>gitusage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch]           [--no-optional-locks] [--no-advice] [--bare] [--git-dir=<path>]           [--work-tree=<path>] [--namespace=<name>] [--config-env=<name>=<envvar>]           <command> [<args>]These are common Git commands used in various situations:start a working area (see also: git help tutorial)   clone      Clone a repository into a new directory   init       Create an empty Git repository or reinitialize an existing onework on the current change (see also: git help everyday)   add        Add file contents to the index   mv         Move or rename a file, a directory, or a symlink   restore    Restore working tree files   rm         Remove files from the working tree and from the indexexamine the history and state (see also: git help revisions)   bisect     Use binary search to find the commit that introduced a bug   diff       Show changes between commits, commit and working tree, etc   grep       Print lines matching a pattern   log        Show commit logs   show       Show various types of objects   status     Show the working tree statusgrow, mark and tweak your common history   backfill   Download missing objects in a partial clone   branch     List, create, or delete branches   commit     Record changes to the repository   merge      Join two or more development histories together   rebase     Reapply commits on top of another base tip   reset      Reset current HEAD to the specified state   switch     Switch branches   tag        Create, list, delete or verify a tag object signed with GPGcollaborate (see also: git help workflows)   fetch      Download objects and refs from another repository   pull       Fetch from and integrate with another repository or a local branch   push       Update remote refs along with associated objects'git help -a' and 'git help -g' list available subcommands and someconcept guides. See 'git help <command>' or 'git help <concept>'to read about a specific subcommand or concept.See 'git help git' for an overview of the system.

什么意思?我们翻译成中文看看:

C:Usersyeqin>git用法:git [-v | --version] [-h | --help] [-C <路径>] [-c <名称>=<值>][--exec-path[=<路径>]] [--html-path] [--man-path] [--info-path][-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch][--no-optional-locks] [--no-advice] [--bare] [--git-dir=<路径>][--work-tree=<路径>] [--namespace=<名称>] [--config-env=<名称>=<环境变量>]<命令> [<参数>]这些是在各种情况下常用的 Git 命令:开始一个工作区(参见:git help tutorial)clone 将版本库克隆到新目录中init 创建一个空的 Git 版本库或重新初始化一个现有的版本库处理当前变更(参见:git help everyday)add 将文件内容添加到暂存区mv 移动或重命名文件、目录或符号链接restore 恢复工作区文件rm 从工作区和暂存区中删除文件检查历史记录和状态(参见:git help revisions)bisect 使用二分查找找到引入错误的提交diff 显示提交之间、提交与工作区之间的更改等grep 打印匹配模式的行log 显示提交日志show 显示各种类型的对象status 显示工作区状态成长、标记和调整你们的共同历史backfill 在部分克隆中下载缺失的对象branch 列出、创建或删除分支commit 记录对版本库的更改merge 将两个或多个开发历史合并在一起rebase 在另一个基础顶端重新应用提交reset 将当前 HEAD 重置到指定状态switch 切换分支tag 创建、列出、删除或验证使用 GPG 签名的标签对象协作(参见:git help workflows)fetch 从另一个版本库下载对象和引用pull 从另一个版本库或本地分支获取并集成push 更新远程引用及相关对象'git help -a' 和 'git help -g' 列出了可用的子命令和一些概念指南。查看 'git help <命令>' 或 'git help <概念>' 来了解特定子命令或概念。查看 'git help git' 以获取系统的概览。

我们整理成Git 命令速查表:

类别 命令 功能描述
​创建工作区​​ (初始化/获取) clone 将远程仓库克隆(下载)到一个新的本地目录。
init 在当前目录创建一个新的空 Git 仓库。
​处理当前变更​​ (文件操作) add 将文件的变化添加到暂存区,准备下一次提交。
mv 移动或重命名文件、目录。
restore 恢复工作区的文件(例如,撤销未暂存的更改)。
rm 从工作区和暂存区中删除文件。
​检查状态与历史​​ (查询与比较) bisect 使用二分查找定位引入 bug 的特定提交。
diff 显示不同版本之间或版本与工作区之间的差异。
grep 在代码库中搜索匹配特定模式的文本行。
log 显示当前分支的提交历史记录。
show 显示某次提交的详细信息及其更改内容。
status 显示工作区和暂存区的当前状态(哪些文件被修改、已暂存等)。
​管理历史记录​​ (分支与提交) branch 列出、创建或删除分支。
commit 将暂存区的内容创建一个新的提交记录。
merge 将指定分支的历史合并到当前分支。
rebase 将当前分支的提交“变基”到另一分支之上,创造更线性的历史。
reset 将当前分支的 HEAD 指针重置到指定的提交状态(可撤销提交)。
switch 切换到另一个已存在的分支。
tag 为特定的提交创建一个标签(常用于版本发布)。
​协作​​ (与远程仓库交互) fetch 从远程仓库下载最新的对象和分支信息,但​​不合并​​到工作区。
pull fetch+merge,下载远程内容并立即合并到当前分支。
push 将本地的提交推送到远程仓库。

2、git服务端远程仓库

为了验证指令可以创建空的项目

填写项目名称采用默认值,即可创建完成

仓库提供2种与项目通信的方式

以下是 ​​SSH​​ 和 ​​HTTPS​​ 这两种 Git 通信方式的主要区别:

特性 ​SSH (Secure Shell)​ ​HTTPS (Hypertext Transfer Protocol Secure)​
​身份验证方式​ ​使用非对称加密密钥对​​。 • ​​私钥​​ 保存在您的本地电脑上。 • ​​公钥​​ 添加到 Git 服务(如 GitHub, GitLab)的账户设置中。 • 克隆时无需输入密码,通过密钥对自动、安全地验证身份。 ​使用用户名和密码(或更安全的个人访问令牌)​​。 • 每次推送等操作时,可能会要求您输入凭证。 • 系统可以将凭证缓存起来,避免重复输入。
​安全性​ ​非常高​​。密钥认证方式能有效防止中间人攻击和密码窃取。 ​高​​。通信内容通过 SSL/TLS 加密。​​但使用账户密码存在被窃取的风险​​,因此官方强烈建议使用​​个人访问令牌​​ 代替密码。
​便利性​ ​初始设置稍复杂​​,需要生成并配置密钥对。 ​​一旦配置完成,后续使用极其方便​​,无需每次输入凭证。 ​初始设置非常简单​​,开箱即用,尤其适合新手。 但如果系统不缓存凭证,可能需要频繁输入。
​常用场景​ • 拥有服务器或项目仓库​​长期、稳定权限​​的开发者。 • 频繁与仓库进行交互(推送、拉取)的场景。 • 自动化脚本(一旦配置好密钥,无需人工干预)。 • ​​公开项目的只读克隆​​(无需认证)。 • 临时贡献者或偶尔需要推送代码的用户。 • 在公司防火墙后(有时防火墙会限制 SSH 的 22 端口)。
​URL 示例​ git@github.com:username/repository.git https://github.com/username/repository.git

这只是用于连接配置,任选一种即可。

二、指令示例用法

我们把每个示例分成三部分“是什么、为什么、怎么样​​ ”​来解释,并针对多用法选项提供多个示例。


​1.git clone

​是什么​​:克隆远程仓库到本地。

​为什么​​:获取完整代码库副本。

​示例 1:克隆默认分支​

git clone https://github.com/user/project.git

​场景​​:初次下载项目。

​结果​​:创建project目录,拉取默认分支(如main)。

​示例 2:克隆指定深度(--depth)​

git clone --depth 1 https://github.com/user/large-repo.git

​场景​​:仅克隆最新提交(节省时间/空间)。

​结果​​:仓库历史仅保留最近一次提交。


​2.git init

​是什么​​:初始化新仓库。

​为什么​​:将现有目录纳入 Git 管理。

​示例 1:标准初始化​

git init

​场景​​:将当前目录转为 Git 仓库。

​结果​​:创建隐藏的.git目录。

​示例 2:指定仓库目录​

git init my-project

​场景​​:新建目录并初始化仓库。

​结果​​:创建my-project目录并初始化 Git。


​3.git add

​是什么​​:将工作区改动添加到暂存区。

​示例 1:添加所有改动(不包含删除)​

git add .

​场景​​:准备提交所有新增/修改的文件。

​示例 2:添加特定类型文件​

git add *.js

​场景​​:只提交所有 JavaScript 文件改动。

​示例 3:交互式添加(-p)​

git add -p

​场景​​:选择性添加文件中的部分代码块。


​4.git commit

​是什么​​:提交暂存区内容到本地仓库。

​示例 1:常规提交​

git commit -m "修复登录逻辑"

​场景​​:提交暂存区内容并添加描述。

​示例 2:修改最近一次提交(--amend)​

git commit --amend -m "优化登录逻辑+按钮样式"

​场景​​:修改上次提交的描述或追加遗漏文件。


​5.git status

​是什么​​:查看工作区和暂存区状态。

​示例 1:标准状态检查​

git status

​场景​​:确认哪些文件被修改/暂存。

​示例 2:简短模式(-s)​

git status -s

​结果​​:紧凑输出(如M README.md表示修改未暂存)。


​6.git branch

​是什么​​:管理分支。

​示例 1:查看所有分支(含远程)​

git branch -a

​结果​​:列出本地和远程分支(远程以remotes/开头)。

​示例 2:删除已合并的分支​

git branch --merged | grep -v "main" | xargs git branch -d

​场景​​:批量清理已合并到main的旧分支。


​7.git checkout/git switch

​是什么​​:切换分支或恢复文件。

​示例 1:创建并切换分支(-b)​

git switch -c feature-payment

​场景​​:基于当前分支创建feature-payment并切换。

​示例 2:丢弃工作区修改​

git checkout -- config.yaml

​场景​​:撤销config.yaml的未暂存改动。


​8.git merge

​是什么​​:合并分支到当前分支。

​示例 1:普通合并​

git switch main git merge dev

​场景​​:将dev分支合并到main

​示例 2:终止合并冲突(--abort)​

git merge --abort

​场景​​:放弃解决冲突,恢复到合并前状态。


​9.git rebase

​是什么​​:变基(重新应用提交)。

​示例 1:变基到目标分支​

git switch feature git rebase main

​场景​​:将feature的修改基于最新的main重新应用。

​示例 2:交互式变基(-i)​

git rebase -i HEAD~5

​场景​​:修改最近 5 个提交(合并、重排序、重写描述)。


​10.git pull

​是什么​​:拉取远程更新并合并。

​示例 1:默认拉取(fetch + merge)​

git pull origin main

​场景​​:更新本地main分支。

​示例 2:变基式拉取(--rebase)​

git pull --rebase

​场景​​:避免产生多余的合并提交。


​11.git push

​是什么​​:推送本地提交到远程仓库。

​示例 1:推送到同名分支​

git push origin feature-auth

​场景​​:将本地分支推送到远程。

​示例 2:删除远程分支​

git push origin --delete old-branch

​场景​​:清理远程废弃分支。


​12.git reset

​是什么​​:重置当前分支的 HEAD。

​示例 1:撤销提交(保留改动)​

git reset HEAD~1

​场景​​:撤销最近一次提交,改动保留在工作区。

​示例 2:硬重置到指定提交​

git reset --hard a1b2c3d

​场景​​:丢弃所有本地修改,回退到特定提交。


​13.git restore

​是什么​​:恢复工作区或暂存区文件(Git 2.23+)。

​示例 1:丢弃工作区修改​

git restore README.md

​场景​​:撤销README.md的未暂存修改。

​示例 2:从暂存区移除文件​

git restore --staged logo.png

​场景​​:误将logo.png添加到暂存区后撤销。


​14.git stash

​是什么​​:临时保存工作区改动。

​示例 1:保存当前改动​

git stash push -m "暂存登录模块修改"

​场景​​:临时切换分支处理紧急任务。

​示例 2:恢复暂存内容​

git stash pop

​场景​​:回到原分支后恢复未完成的修改。


​15.git log

​是什么​​:查看提交历史。

​示例 1:图形化显示分支(--graph)​

git log --graph --oneline --all

​结果​​:可视化分支合并历史。

​示例 2:按时间过滤​

git log --since="2024-01-01" --until="2024-01-15"

​场景​​:查看某时间范围内的提交。


​16.git diff

​是什么​​:显示差异。

​示例 1:工作区与暂存区差异​

git diff

​场景​​:查看未暂存的修改内容。

​示例 2:暂存区与最后一次提交差异​

git diff --staged

​场景​​:确认即将提交的内容。


​17.git remote

​是什么​​:管理远程仓库。

​示例 1:添加远程仓库​

git remote add upstream https://github.com/original/repo.git

​场景​​:为 fork 的仓库添加源仓库地址。

​示例 2:重命名远程​

git remote rename origin my-fork

​场景​​:避免与团队仓库命名冲突。


​18.git tag

​是什么​​:管理版本标签。

​示例 1:创建轻量标签​

git tag v1.0.0

​场景​​:标记发布版本。

​示例 2:创建含注释的标签​

git tag -a v1.1.0 -m "正式发布用户管理模块"

​场景​​:记录版本详细信息。


​19.git cherry-pick

​是什么​​:复制特定提交到当前分支。

​示例 1:复制单个提交​

git cherry-pick a1b2c3d

​场景​​:将修复 bug 的提交应用到生产分支。

​示例 2:复制多个提交​

git cherry-pick commitA..commitB

​场景​​:移植某功能的所有相关提交(​​不包含 commitA​​)。


​20.git bisect

​是什么​​:二分查找问题提交。

​示例:定位引入 bug 的提交​

git bisect start git bisect bad HEAD # 当前版本有 bug git bisect good v1.0.0 # 该版本正常 # 根据测试结果标记 good/bad,Git 自动定位问题提交

​场景​​:快速定位大型项目中引入问题的代码变更。


​21.git submodule

​是什么​​:管理嵌套子仓库。

​示例 1:添加子模块​

git submodule add https://github.com/user/lib.git

​场景​​:在项目中引用第三方库。

​示例 2:更新子模块​

git submodule update --remote

​场景​​:拉取子模块的最新提交。


​22.git worktree

​是什么​​:管理多个工作目录。

​示例:为分支创建独立目录​

git worktree add ../hotfix-branch hotfix/urgent

​场景​​:同时开发多个功能/修复,避免频繁切换分支。


​23.git reflog

​是什么​​:查看本地操作历史(救命命令!)。

​示例:找回误删分支​

git reflog # 找到删除分支前的操作记录(如 a1b2c3d) git branch recovery-branch a1b2c3d

​场景​​:恢复被reset --hardbranch -D删除的内容。


​24.git grep

​是什么​​:代码内容搜索。

​示例:全项目搜索关键词​

git grep "deprecated_function"

​场景​​:快速定位废弃代码的位置。


​25.git blame

​是什么​​:查看文件每行最后修改信息。

​示例:定位代码作者​

git blame -L 10,20 utils.py

​场景​​:确认文件第 10-20 行的修改者和提交。


​附:高频组合命令​

​场景​ ​命令​
丢弃所有未提交改动 git reset --hard HEAD && git clean -fd
修改最近 3 次提交信息 git rebase -i HEAD~3→ 将pick改为reword
将暂存区重置为远程分支状态 git fetch origin && git reset --hard origin/main

三、综合应用

1、将本地工程上传到Git仓库(由0到1)

(1)任务背景

  • 环境: Ubuntu22.04
  • 项目位置:/home/smore/ELapps
  • 目标: 将本地工程上传到Git仓库
  • 特殊要求: 不上传toolchain文件夹

(2)执行步骤

# 1、环境准备# 安装Git(需要sudo权限)sudo apt update && sudo apt install git -y# 配置Git用户信息git config --global user.name "用户名"git config --global user.email "邮箱@example.com"# 2、本地仓库初始化cd /home/smore/ELappsgit init# 3、文件提交git add .git commit -m "Initial commit"# 4、远程仓库配置# 添加远程仓库(需要在git服务器上添加仓库)git remote add origin https://xxxxxxxxxxxxxx/elapps.git# 5、先拉取远程代码到本地(可选)git pull origin main# 6、代码推送# 推送到远程仓库(master分支推送到main分支)git push --set-upstream origin master:main

2、git变更仓库处理方式

(1)任务背景

  • 环境: Windows 11
  • 目标: 本地工程连接的是旧的git仓库,现在要更新到新的Git仓库

(2)执行步骤

# 1、检查当前状态cd /d D:electron_toolsgit statusgit remote -v# 2、添加新的远程仓库git remote add gitlab https://xxxxxxxxxxxxxxxxxx/electron_tools.git# 3、移除旧的远程仓库git remote remove origin# 4、重命名远程仓库(如果需要)git remote rename gitlab origin# 5、添加所有文件git add .# 6、提交更改git commit -m "同步所有文件到新的GitLab仓库"# 7、推送到新仓库git push origin master8、推送所有分支和标签git push --all origingit push --tags origin

3、git push报错

(1)fatal: The current branch master has no upstream branch.

问题发生

命令: git push

错误: fatal: The current branch master has no upstream branch.

含义: 本地 master分支没有设置要跟踪的远程分支

解决过程

诊断步骤

①. 检查分支结构

git branch -a

分析结果:

  • * master- 当前在本地 master分支
  • remotes/origin/master- 远程仓库已有 master分支
  • 关键发现: 本地和远程都有 master分支,但没有建立关联

②. 检查远程仓库信息

git remote -v

确认: 远程仓库地址是 https://xxxxxxx/electron_tools.git

根本原因

虽然远程仓库存在 master分支,但 Git 不知道本地 master分支应该与远程的哪个分支关联。这种情况常见于:

  • 克隆仓库后,跟踪关系可能被重置
  • 分支是从其他分支切出,没有设置跟踪
  • Git 配置中缺少上游分支信息

解决方案

①. 建立跟踪关系

git branch --set-upstream-to=origin/master master

作用: 明确告诉 Git:

  • 本地 master分支
  • 应该跟踪
  • 远程仓库 originmaster分支

成功反馈: branch 'master' set up to track 'origin/master'.

②. 执行推送

git push

结果: 成功推送!

问题总结

步骤 命令 目的 结果
1 git push 尝试推送代码 ❌ 失败:无上游分支
2 git branch -a 查看分支情况 ✅ 发现远程有master分支
3 git remote -v 确认远程仓库 ✅ 远程地址正确
4 git branch --set-upstream-to=origin/master master 建立分支关联 ✅ 设置跟踪成功
5 git push 再次推送 ✅ 推送成功

持续更新中。。。

相关推荐