以下是将 Git 常用命令与常见错误及解决方案整合后的 Markdown 文档:


Git 常用命令与常见问题指南


一、Git 常用命令

1. 仓库操作

  • 初始化仓库
    git init
    在当前目录创建新的 Git 仓库。

  • 克隆远程仓库
    git clone <仓库URL>
    将远程仓库克隆到本地(如 git clone https://github.com/user/repo.git)。


2. 提交与修改

  • 查看仓库状态
    git status
    显示工作区与暂存区的文件状态。

  • 添加文件到暂存区
    git add <文件名>
    添加指定文件到暂存区(如 git add index.html)。
    git add .
    添加所有修改和新文件到暂存区。

  • 提交更改
    git commit -m "提交说明"
    将暂存区的内容提交到本地仓库。

  • 查看文件差异
    git diff
    显示工作区与暂存区的差异。
    git diff --staged
    显示暂存区与最新提交的差异。


3. 分支管理

  • 查看分支
    git branch
    列出所有本地分支(-a 查看所有分支,包括远程)。

  • 创建/切换分支
    git branch <分支名>
    创建新分支。
    git checkout <分支名>
    切换到指定分支。
    git checkout -b <新分支名>
    创建并切换到新分支。

  • 合并分支
    git merge <分支名>
    将指定分支合并到当前分支。

  • 删除分支
    git branch -d <分支名>
    删除本地分支(-D 强制删除未合并的分支)。

  • 变基(Rebase)
    git rebase <分支名>
    将当前分支的提交“移植”到目标分支上(谨慎使用)。


4. 远程仓库

  • 关联远程仓库
    git remote add origin <仓库URL>
    添加远程仓库(名称通常为 origin)。

  • 推送本地提交到远程
    git push origin <分支名>
    推送本地分支到远程仓库(如 git push origin main)。

  • 拉取远程更新
    git pull origin <分支名>
    拉取远程分支并合并到当前分支(相当于 git fetch + git merge)。

  • 获取远程更新(不合并)
    git fetch origin
    仅下载远程变更,需手动合并。


5. 撤销与回退

  • 丢弃工作区修改
    git checkout -- <文件名>
    撤销指定文件的未暂存修改。

  • 从暂存区移除文件
    git reset HEAD <文件名>
    将文件移出暂存区(保留工作区修改)。

  • 回退到某个提交
    git reset --hard <commit_id>
    强制回退到指定提交(慎用,会丢失后续修改)。
    git revert <commit_id>
    生成新提交以撤销指定提交的更改(安全回退)。


6. 日志与历史

  • 查看提交历史
    git log
    显示提交记录(--oneline 简化输出,--graph 显示分支图)。

  • 查看文件修改历史
    git blame <文件名>
    显示文件的逐行修改记录。


7. 标签

  • 创建标签
    git tag <标签名>
    为当前提交打标签(如 git tag v1.0)。
    git tag -a v1.0 -m "版本说明"
    创建带注释的标签。

  • 推送标签到远程
    git push origin --tags
    推送所有本地标签到远程仓库。


8. 暂存临时修改

  • 保存临时改动
    git stash
    将未提交的修改暂存起来。
    git stash pop
    恢复最近暂存的修改并删除暂存记录。

二、Git 常见错误与解决方案

1. 合并冲突(Merge Conflict)

现象

CONFLICT (content): Merge conflict in <文件名>
Automatic merge failed; fix conflicts and then commit the result.

解决方案

  1. 打开冲突文件,手动修改 <<<<<<< HEAD 标记的冲突部分。
  2. 执行:
    git add <冲突文件名>
    git commit -m "Resolve merge conflict"

2. 提交到错误的分支

场景

dev 分支开发,误提交到 main

解决方案

  1. 切换到正确分支:
    git checkout dev
  2. 复制提交:
    git cherry-pick <误提交的commit_id>
  3. 回退原分支:
    git checkout main
    git reset --hard HEAD~1

3. git pull 后代码丢失

原因

远程分支覆盖了本地未推送的提交。

解决方案

  1. 使用 git reflog 找回丢失的 commit_id
  2. 强制推送(慎用):
    git push -f origin <分支名>

4. 误删未提交的文件

场景

未提交的文件被 rm 删除。

解决方案

git checkout -- <文件名>  # 恢复文件

5. 权限错误(Permission Denied)

现象

Permission to <仓库URL> denied to <用户>.

解决方案

  1. 检查远程 URL:
    git remote -v
  2. 修改为 SSH/HTTPS 协议:
    git remote set-url origin git@github.com:user/repo.git

6. git reset --hard 导致代码丢失

场景

误用 git reset --hard HEAD~3

解决方案

  1. 通过 git reflog 找回 commit_id
  2. 恢复:
    git reset --hard <commit_id>

7. 大文件无法推送

现象

remote: error: File is 102.00 MB; exceeds limit.

解决方案

  1. 从历史中删除大文件:
    git filter-branch --tree-filter 'rm -f <文件路径>' HEAD
  2. 强制推送:
    git push -f origin <分支名>

8. 忘记切换分支导致代码混乱

场景

直接在 main 分支开发。

解决方案

  1. 暂存代码并创建新分支:
    git stash
    git checkout -b new-feature
    git stash pop

9. 误提交不需要的文件

场景

提交了 .env 等临时文件。

解决方案

  1. 移除文件并更新 .gitignore
    git reset HEAD .env
    echo ".env" >> .gitignore
    git commit --amend

10. git push 被拒绝(Non-Fast-Forward)

现象

! [rejected] main -> main (non-fast-forward)

解决方案

  1. 拉取远程更新并合并:
    git pull origin main
  2. 解决冲突后重新推送。

三、常用场景示例

  1. 首次推送本地项目到远程

    git init
    git add .
    git commit -m "Initial commit"
    git remote add origin <仓库URL>
    git push -u origin main
  2. 解决合并冲突后提交

    git add .
    git commit -m "Merge branch and fix conflicts"

四、预防建议

  1. 频繁提交:小步提交,避免一次性提交大量代码。
  2. 检查分支:操作前确认 git status
  3. 备份修改:使用 git stash 或临时分支。
  4. 慎用强制命令:如 git push -fgit reset --hard

通过结合命令与问题处理,可以更高效地使用 Git!遇到问题时,优先使用 git refloggit log 查看历史记录。