差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
| git [2025/11/26 16:04] – 张叶安 | git [2025/12/18 16:38] (当前版本) – 张叶安 | ||
|---|---|---|---|
| 行 100: | 行 100: | ||
| * **-x**: 同时也删除被 '' | * **-x**: 同时也删除被 '' | ||
| * **警告**:这会删除你的 IDE 配置文件、编译输出、依赖包(如 '' | * **警告**:这会删除你的 IDE 配置文件、编译输出、依赖包(如 '' | ||
| + | |||
| + | ====== Git: 强制拉取远端 Master 分支 (忽略本地更改) ====== | ||
| + | |||
| + | 本指南介绍如何强制将本地仓库重置为与远端 `master` 分支完全一致的状态。 | ||
| + | |||
| + | |||
| + | **警告:** 执行此操作将**永久丢失**所有未提交(Uncommitted)的更改以及本地已经提交但未推送到远端的更改。请在执行前确保你不需要保留这些更改,或者已经做好了备份。 | ||
| + | |||
| + | |||
| + | ===== 操作步骤 ===== | ||
| + | |||
| + | 要强制覆盖本地更改,我们需要分两步走:首先从远端获取最新信息,然后强制重置本地分支。 | ||
| + | |||
| + | ==== 1. 获取远端最新状态 ==== | ||
| + | |||
| + | 首先,我们需要从远端仓库(通常命名为 `origin`)下载最新的分支信息,但暂时不合并到本地。 | ||
| + | |||
| + | <code bash> | ||
| + | git fetch --all | ||
| + | </ | ||
| + | |||
| + | * **git fetch**: 从远端下载对象和引用。 | ||
| + | * **--all**: 如果定义了多个远端仓库,此选项会从所有远端获取。 | ||
| + | |||
| + | ==== 2. 强制重置本地 Master 分支 ==== | ||
| + | |||
| + | 接下来,我们将本地的 `master` 分支指针强制移动到远端的 `origin/ | ||
| + | |||
| + | <code bash> | ||
| + | git reset --hard origin/ | ||
| + | </ | ||
| + | |||
| + | * **git reset**: 重置当前 HEAD 到指定状态。 | ||
| + | * **--hard**: 重置索引(Index)和工作树(Working Tree)。这意味着**所有**自上次提交以来的更改都会被丢弃,文件将完全匹配 `origin/ | ||
| + | * **origin/ | ||
| + | |||
| + | ==== 3. (可选) 清理未追踪的文件 ==== | ||
| + | |||
| + | 上述 `reset --hard` 命令只会影响 Git 追踪的文件。如果你在本地创建了新文件(Git 未追踪的文件),它们仍然会存在。如果你想让目录变得完全干净(和刚克隆下来一样),可以运行以下命令: | ||
| + | |||
| + | <code bash> | ||
| + | git clean -fdx | ||
| + | </ | ||
| + | |||
| + | * **-f**: 强制删除。 | ||
| + | * **-d**: 删除未被追踪的目录。 | ||
| + | * **-x**: 删除被忽略的文件(即 `.gitignore` 中指定的文件,如编译产物、日志等)。 | ||
| + | |||
| + | ===== 总结脚本 ===== | ||
| + | |||
| + | 你可以将这些命令组合成一个序列快速执行: | ||
| + | |||
| + | <code bash> | ||
| + | git fetch --all | ||
| + | git reset --hard origin/ | ||
| + | # 慎用下面这行,除非你确定要删除所有未追踪文件 | ||
| + | # git clean -fdx | ||
| + | </ | ||
| + | |||
| + | ===== 常见问题 ===== | ||
| + | |||
| + | * **如果我的分支不叫 master 怎么办?** | ||
| + | * 如果你的主分支叫 `main`,请将命令中的 `master` 替换为 `main`: | ||
| + | <code bash>git reset --hard origin/ | ||
| + | |||
| + | * **这会删除我本地新建的分支吗?** | ||
| + | * `git reset --hard` 只会影响**当前检出**的分支。如果你在 `master` 分支上执行此操作,其他本地分支(如 `feature-login`)不会受到影响。但是,如果那些分支是基于旧的 `master` 创建的,它们可能会与新的 `master` 产生分歧。 | ||
| + | |||
| + | ====== Git 实战:将 A 分支内容完全覆盖到 B 分支 ====== | ||
| + | |||
| + | **场景描述**: | ||
| + | 你当前处于 **A 分支**。你希望 **B 分支** 的内容变得和 A 分支**一模一样**(完全丢弃 B 分支旧有的差异),操作完成后,自动切换到 **B 分支** 继续工作。 | ||
| + | |||
| + | 这通常用于重置某个测试分支,或者强制同步代码。 | ||
| + | |||
| + | ===== 方法一:强制重置 (推荐,最干净) ===== | ||
| + | |||
| + | 这种方法会将 B 分支的指针直接指向 A 分支当前的提交,这是最彻底的“一模一样”。 | ||
| + | |||
| + | **步骤如下:** | ||
| + | |||
| + | - 1. 确保你当前在 A 分支。 | ||
| + | - 2. 强制删除本地的 B 分支(如果存在)。 | ||
| + | - 3. 基于当前 A 分支重新创建 B 分支。 | ||
| + | - 4. 切换到 B 分支。 | ||
| + | |||
| + | <code bash> | ||
| + | # 1. 确认当前所在分支 (假设显示 * A) | ||
| + | git branch | ||
| + | |||
| + | # 2. 如果 B 分支已经存在,先删除它 (使用 -D 强制删除,忽略未合并警告) | ||
| + | git branch -D B | ||
| + | |||
| + | # 3. 基于当前所在位置(A) 新建并切换到 B 分支 | ||
| + | git checkout -b B | ||
| + | </ | ||
| + | |||
| + | **原理解析**: | ||
| + | 你并没有“移动文件”,而是直接把 B 的标签贴到了 A 当前所在的提交记录上。此时 A 和 B 指向同一个 Commit ID,内容自然完全一致。 | ||
| + | |||
| + | ===== 方法二:在 B 分支上硬重置 (Hard Reset) ===== | ||
| + | |||
| + | 如果你不想删除分支(例如 B 分支设置了特定的上游追踪关系),可以使用此方法。 | ||
| + | |||
| + | **步骤如下:** | ||
| + | |||
| + | - 1. 切换到 B 分支。 | ||
| + | - 2. 将 B 分支重置为 A 分支的状态。 | ||
| + | |||
| + | <code bash> | ||
| + | # 1. 先切换到 B 分支 | ||
| + | git checkout B | ||
| + | |||
| + | # 2. 将 B 分支强制重置为 A 分支的内容 | ||
| + | # 注意:这会永久丢弃 B 分支上原本比 A 多出的任何提交! | ||
| + | git reset --hard A | ||
| + | </ | ||
| + | |||
| + | ===== 方法三:推送时强制覆盖 (针对远程分支) ===== | ||
| + | |||
| + | 如果你的 B 分支是在远程仓库(比如 origin/ | ||
| + | |||
| + | <code bash> | ||
| + | # 确保你在 A 分支 | ||
| + | git checkout A | ||
| + | |||
| + | # 强制推送到远程的 B 分支 | ||
| + | # 语法:git push < | ||
| + | git push origin A:B --force | ||
| + | </ | ||
| + | |||
| + | **警告**: | ||
| + | 使用 ``git reset --hard`` 或 ``git branch -D`` 都是破坏性操作。执行前请确保 **B 分支上没有你需要的、未备份的代码**。 | ||
| + | |||
| + | ===== Git统计几个版本间累计修改的文件 ===== | ||
| + | |||
| + | < | ||
| + | git diff --name-only 版本A 版本B | ||
| + | </ | ||
| + | |||
| + | ===== git切换回旧版本测试后再回来 ===== | ||
| + | < | ||
| + | git checkout 版本号如767ddd7d | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | git checkout 分支号如sdf_dev | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||