Git常用命令行

【速推】首次提交

1
2
3
git init
git add .
git commit -m "Initial commit"

origin后要加<远程仓库URL>:

1
2
3
git remote add origin 
git remote -v
git push -u origin master

后续同步:

1
2
3
4
git pull
git add .
git commit -m "update"
git push

【回退】命令行

1
2
3
4
# 常用三种模式:
git reset --soft <commit-id> # 保留工作区和暂存区修改(改动依然在“待提交”状态)
git reset --mixed <commit-id> # 保留工作区修改,清空暂存区(默认,改动变成“未暂存”)
git reset --hard <commit-id> # 彻底丢弃所有修改,工作区、暂存区都回到旧版本(危险)

我最常用:
我自己开发,私有仓库,只有一个分支,git回退到仓库的第一次提交

hard后面加版本号

git reset --hard 

彻底删除所有未跟踪的文件和文件夹:

1
2
git status
git clean -fd

Git命令

专业名词(黑话)

  1. Git 工作流

    graph LR
        A[关联工作区] -- git add --> B[暂存区]
        B -- git commit --> C[本地仓库]
        C -- git push --> E[远程仓库]
  2. 工作区文件:本地文件夹的文件。
    在 Git 版本控制中,工作区文件指的是你在本地电脑上直接编辑、修改的项目文件,也就是你能在操作系统的文件夹里看到的那些文件(比如文档、代码、图片等)。

    简单说,工作区(Working Directory)就是你克隆或创建项目后,在本地电脑上存放项目文件的那个文件夹,而这个文件夹里的所有文件(包括子文件夹里的文件)都可以称为 “工作区文件”。

  3. 暂存区:
    在 Git 版本控制中,暂存区(Staging Area) 是一个介于「工作区」和「本地仓库」之间的临时存储区域,也被称为「索引(Index)」。它的核心作用是:临时存放你想要提交到本地仓库的修改,让你可以先 “预览” 哪些修改会被纳入下一次提交,再统一提交到仓库

    为什么需要暂存区?

    想象一个场景:你同时修改了项目中的 3 个文件(A、B、C),但其中只有 A 和 B 的修改是完整的,C 的修改还没完成。这时候你想先提交 A 和 B 的修改,而暂时忽略 C—— 暂存区就是用来解决这个问题的:你可以先把 A 和 B 放入暂存区,然后只提交暂存区的内容,C 仍然留在工作区继续修改。

  4. 工作区文件的状态:

    1. 未跟踪(Untracked):新创建的文件,还没被 Git 记录(Git 不知道它的存在);
    2. 已跟踪(Tracked):已被 Git 记录的文件,包括:
      • 未修改(Unmodified):和 Git 最后一次记录的版本一致;
      • 已修改(Modified):被编辑过,但还没存入暂存区;
      • 已暂存(Staged):修改后被添加到暂存区(通过 git add 命令),等待提交到本地仓库。
  5. **子模块:**嵌套仓库
    在 Git 中,子模块(Submodule) 是一种特殊功能,用于在一个 Git 仓库(称为 “主项目”)中嵌入另一个独立的 Git 仓库(称为 “子模块项目”),同时保持两个仓库的独立性。

  6. done

Git 版本控制工具中常用的命令

选项

1. 初始化与克隆

命令 常用选项 说明
git init - 初始化本地仓库
git clone <url> -b <branch> 克隆仓库,-b指定分支

2. 文件操作

命令 常用选项 说明
git add <file> . -p --all 暂存文件,.全部,-p交互式
git rm <file> --cached 删除文件,--cached仅停止跟踪
git mv <old> <new> - 重命名文件

3. 提交

git commit 命令的主要常用选项有:

选项 全称 作用
-a --all 自动暂存所有已跟踪文件的修改和删除,跳过 git add
-m --message 指定提交信息,如 git commit -m "修复bug"
-am --all --message -a + -m 组合,最常用
--amend --amend 用于修改最近一次提交,不创建新提交
1
2
3
git rm README.md             # 先解决冲突
git commit -am "删除冲突文件" # 一条命令搞定提交
git push # 推送到Gitee

4. 分支管理

命令 常用选项 说明
git branch -a -r -d 查看/创建/删除分支,-a所有分支
git checkout -b 切换分支,-b创建+切换
git merge <branch> --no-ff 合并分支
git rebase <branch> - 变基(提交线性化)

5. 远程操作

命令 常用选项 说明
git remote -v add 管理远程仓库
git pull --rebase 拉取+合并,--rebase干净历史
git push -u --force --all 推送,-u设置上游,--force强制推送
git fetch - 只拉取不合并

6. 查看

命令 常用选项 说明
git status -s 查看状态,-s简洁版
git log --oneline --graph 查看提交历史
git diff --cached 对比差异
git show <commit> - 查看具体提交

7. 撤销与重置

命令 常用选项 说明
git reset --hard --soft 重置到指定提交
git revert <commit> - 创建反向提交(安全撤销)
git checkout -- <file> - 恢复文件到上次提交

总数:Git 每个命令都有 20-50 个选项,但实际开发只用上述 80% 最常用选项就够了。

git clone

:“下载” 远程项目到本地;

作用:从远程仓库(比如 GitHub、GitLab 等)复制一个完整的项目到本地电脑。
它会将远程仓库的所有文件、分支、提交历史等完整下载到本地,并自动创建一个与远程仓库同名的文件夹,同时初始化本地 Git 仓库,关联到远程仓库。

示例

克隆远程仓库到当前目录(生成与仓库同名的文件夹):

1
2
3
git clone <远程仓库地址>
# 示例:克隆 GitHub 上的仓库
git clone https://github.com/Kkkika/Kkkika.github.io.git
  • 自定义文件夹名称(不使用仓库默认名称):

    1
    2
    3
    git clone <远程仓库地址> <本地目录名>
    # 示例:克隆到名为 "my-project" 的文件夹
    git clone https://github.com/Kkkika/Kkkika.github.io.git my-project
  • 只克隆指定分支(默认克隆所有分支,此参数可节省时间):

    1
    2
    3
    git clone -b <分支名> --single-branch <远程仓库地址>
    # 示例:只克隆远程的 dev 分支
    git clone -b dev --single-branch https://github.com/username/repo-name.git
  • 浅克隆(只获取最近的 N 次提交,适合大型仓库,加快克隆速度):

    1
    2
    3
    git clone --depth <次数> <远程仓库地址>
    # 示例:只获取最近 10 次提交
    git clone --depth 10 https://github.com/username/repo-name.git
  • 克隆时包含子模块(如果项目包含子模块,需用此参数才能完整克隆):

    1
    2
    git clone --recursive <远程仓库地址>
    # 若已克隆但子模块未下载,可补拉:git submodule update --init --recursive

git branch

:“管理” 本地分支(查看、创建、删除);

作用:用于管理本地分支(分支可以理解为项目的 “并行开发线”,方便多人协作或功能隔离)。

常用用法:

1. 查看分支

  • 不带参数:查看本地所有分支(当前分支前有 * 标记):

    git branch
  • 查看本地 + 远程所有分支(远程分支以 remotes/origin/ 开头):

    git branch -a
  • 查看远程分支(仅远程,不包含本地):

    git branch -r
  • 查看分支关联的远程分支(多人协作时常用,确认本地分支对应哪个远程分支):

    1
    2
    git branch -vv
    # 输出示例:* main a1b2c3d [origin/main] 提交说明

2. 创建分支

  • 基于当前分支创建新分支(创建后仍在当前分支,需手动切换):

    1
    2
    3
    git branch <新分支名>
    # 示例:基于当前分支创建 feature/payment 分支
    git branch feature/payment

3. 删除分支

  • 删除本地分支(需确保分支已合并,否则会提示错误):

    1
    2
    3
    git branch -d <分支名>
    # 示例:删除已合并的 old-branch
    git branch -d old-branch
  • 强制删除未合并的分支(危险!未合并的修改会丢失):

    1
    2
    3
    git branch -D <分支名>
    # 示例:强制删除未合并的 test-branch
    git branch -D test-branch

4. 重命名分支

  • 重命名当前所在分支:

    1
    2
    3
    git branch -m <新分支名>
    # 示例:将当前分支重命名为 bugfix/login
    git branch -m bugfix/login
  • 重命名指定分支(无需切换到该分支):

    1
    2
    3
    git branch -m <旧分支名> <新分支名>
    # 示例:将 feature/old 重命名为 feature/new
    git branch -m feature/old feature/new
  • 带分支名:创建新分支(但不会自动切换到新分支)。

    git branch feature-login  # 创建名为 feature-login 的新分支
  • -d 参数:删除指定分支(删除前需确保该分支的修改已合并,否则用 -D 强制删除)。

    git branch -d old-branch  # 删除 old-branch 分支

git checkout

:“切换” 分支或 “恢复” 文件。

作用:主要用于 “切换分支” 或 “恢复工作区文件”(Git 2.23+ 后推荐用 git switch 切换分支,功能更清晰,但 checkout 仍广泛使用)。

常用用法:

  • 切换到已存在的分支:

    git checkout dev  # 切换到 dev 分支
  • 创建并立即切换到新分支(相当于 git branch 新分支名 + git checkout 新分支名 的简写):

    git checkout -b dev  # 创建并切换到 dev 分支
  • 恢复工作区的某个文件到最近一次提交的状态(丢弃本地修改):

    git checkout -- README.md  # 把 README.md 恢复到最近提交的版本

git冲突

  • git冲突会出现哪些情况,分别怎么解决

Git冲突主要出现在合并(merge)或拉取(pull)时,两个分支对同一文件做了不兼容修改。

常见冲突类型

1. 内容冲突(最常见)
两个分支修改同一文件的同一行:

1
2
3
4
5
text<<<<<<< HEAD
你本地的代码
=======
远程的代码
>>>>>>> origin/master

解决:编辑文件删除标记符 <<<<<<< ======= >>>>>>>,保留需要的代码,然后 git add 文件名 git commit

2. modify/delete 冲突(你现在的类型)
一个分支修改了文件,另一个分支删除了文件:

1
2
text
git status 显示:deleted by them: README.md

解决

  • 想删除:git rm README.md
  • 想保留:git checkout --ours/--theirs README.mdgit add README.md

3. 文件名冲突
两个分支重命名同一文件为不同名字,或修改文件名。

解决:选择保留哪个文件名,用 git mv 重命名。

通用解决流程

1
2
3
4
5
bash1. git status          # 查看哪些文件冲突
2. 编辑冲突文件 # 手动解决内容冲突
3. git add/rm 文件名 # 标记冲突已解决
4. git commit # 提交合并结果
5. git push # 推送到远程

紧急退出

1
2
3
bash
git merge --
abort # 放弃这次合并,回到之前状态

分支管理

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 查看分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支

# 创建分支
git branch <分支名> # 创建但不切换
git checkout -b <分支名> # 创建并切换

# 切换分支
git checkout <分支名>
git switch <分支名> # Git 2.23+

# 合并分支
git merge <分支名> # 将指定分支合并到当前分支
git merge --no-ff <分支名> # 非快进合并,保留分支历史

# 删除分支
git branch -d <分支名> # 删除已合并的分支
git branch -D <分支名> # 强制删除未合并分支
git push origin --delete <分支名> # 删除远程分支

# 拉取远程分支并创建本地分支
git checkout -b <本地分支名> origin/<远程分支名>

# 分支重命名
git branch -m <新分支名> # 重命名当前分支
git branch -m <旧分支名> <新分支名> # 重命名指定分支

# 查看分支图
git log --oneline --graph --all

Git Flow

(经典企业级策略)

分支结构:

  • main/master - 主分支,生产环境代码
  • develop - 开发分支,集成所有功能
  • feature/* - 功能分支,从 develop 拉出
  • release/* - 发布分支,从 develop 拉出
  • hotfix/* - 热修复分支,从 main 拉出

GitHub Flow

(简化流程)

适用于持续交付:

  • 只有一个长期分支:main
  • 所有功能都在单独分支开发
  • 通过 Pull Request 合并

GitLab Flow

(环境分支策略)

分支结构:

  • mainpre-productionproduction
  • 代码按环境流动

GitHub中clone指定Commits

(Github中怎么找回历史版本;GitHub历史版本恢复指南;GitHub中下载指定版本;Github查看项目的历史版本,并实现版本的回滚)

假设:我想下载Kkkika/Kkkika.github.io仓库master分支的第一次提交

首先进入仓库后,点击【Commits】获取历史版本的提交哈希值

image-20260131132104678

时间拉到最前,找到第一次提交,点击【复制】按钮

image-20260131132104679

克隆后创建新分支

如果你想在特定提交的基础上进行一些修改或实验,最好创建一个新分支。

新建一个文件夹来存放代码,注意路径不要有中文:

C:\Code\githubclone

然后打开cmd

cd C:\Code\githubclone
  1. 克隆仓库并进入目录

    1
    2
    git clone https://github.com/Kkkika/Kkkika.github.io.git
    cd Kkkika.github.io
  2. 基于特定提交创建并切换到一个新分支:这可以避免“分离头指针”状态。

    1
    2
    git branch my-new-branch cc09550ac7db24e987f6f2130da2ee1564191b12
    git checkout my-new-branch

    或者更简洁地用一条命令:

    git checkout -b my-new-branch cc09550ac7db24e987f6f2130da2ee1564191b12

    这样,你就在一个名为 my-new-branch 的分支上工作,这个分支的起点就是你指定的那个提交。

浅克隆(如果只想快速获取)

如果你只关心最新的一部分提交,或者仓库很大想加快克隆速度,可以考虑浅克隆。

  1. 浅克隆仓库(例如只克隆最近 10 个提交):

    bash

    1
    2
    git clone --depth 10 https://github.com/Kkkika/Kkkika.github.io.git
    cd Kkkika.github.io

    --depth 10 参数表示只克隆最近10次提交的历史。你需要确保你想要的提交(cc09550...)在这最近的10次提交之内。

  2. 然后切换到你想要的提交

    git checkout cc09550ac7db24e987f6f2130da2ee1564191b12

重要提示

  • 关于 -b 参数-bgit clone 中用于指定分支或标签,不能直接用于提交哈希5。
  • “分离头指针”状态:直接 git checkout <commit-hash> 会进入此状态。在此状态下进行更改并提交后,如果不创建分支指向这些新提交,它们可能会被 Git 的垃圾回收机制清除10。如果计划基于该提交进行修改,请务必创建新分支。
  • 获取正确的提交哈希:确保你复制的提交哈希是正确的且存在于远程仓库中。你可以通过 GitHub 网站的提交历史页面来查看和确认提交哈希。

如何选择方法?

为了更清晰地选择,可以参考下面的流程:

git checkout
graph LR
    A[需求:克隆特定提交] --> B{完整历史?}
    B -- 是 --> C[克隆仓库<br>checkout 提交]
    B -- 否 --> D[浅克隆<br>checkout 提交]
    C --> E{需修改?}
    D --> F{需修改?}
    E -- 是 --> G[创建分支]
    E -- 否 --> H[分离头指针]
    F -- 是 --> G
    F -- 否 --> H

可能遇到的问题

  1. 网络问题
    1. image-20260131132104680
    2. 关闭梯子
    3. 打开加速器

Gitee

git推送

新建仓库

新建项目,关联工作区

上传到仓库的文件夹名称为blog:

上传到仓库的文件夹

首先,新建仓库

示例

【注意】文件夹名称与仓库名称需一致

cmd执行命令行

将本地内容首次推送到空的 Git 远程仓库,需按顺序执行以下命令流程。

以下是完整操作步骤及注意事项:

  1. 确保路径是项目路径

    cd C:\Code\KikaBlog\blog
  2. 初始化本地仓库

    git init
    • 在项目根目录执行,生成隐藏的.git文件夹
  3. 添加文件并提交

    1
    2
    git add .              # 添加所有文件到暂存区
    git commit -m "Initial commit" # 提交到本地仓库
    1
    2
    git add .
    git commit -m "Initial commit"
    • 必须至少有一次提交,否则推送会失败(Git 不允许推送空分支)。
  4. 关联远程仓库

    git remote add origin <远程仓库URL>
    git remote add origin 
    • 验证关联:

      git remote -v

      查看 URL 是否正确。

  5. 推送到远程仓库(首次推送需设置上游)

    git push -u origin master
    • 分支名为 master

    • -u(或–set-upstream)参数:

      • 建立本地分支与远程分支的追踪关系。
  6. 后续推送

    1
    2
    3
    4
    git pull
    git add .
    git commit -m "update"
    git push

示例

在任何IDE的终端或者cmd中运行命令行都可以

在Cursor中打开终端:

在Cursor中打开终端

确保路径最后的文件夹和仓库同名:

仓库名是blog文件夹名是blog

所有用到的命令:

1
2
3
4
5
6
git init
git add .
git commit -m "Initial commit"
git remote add origin https://gitee.com/kika00/blog.git
git remote -v
git push -u origin master

成功推送:

成功推送

后续推送用到的三个命令:

改完 → git add -A → git commit -m "说人话" → git push

克隆现有仓库

克隆现有仓库,建立工作区

1
2
3
4
5
6
# 克隆远程仓库(自动建立所有关联)
git clone <远程仓库URL>

# 克隆后,工作区已经与远程关联
cd 项目目录
git status # 查看状态