Files
workspace/code/docusaurus/docs/dev-tools/git/03-常见问题.md
T
2026-03-18 17:14:34 +08:00

194 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## push之前未pull
报错信息:
```bash
D:\code\test\test1>git push origin master
To http://192.168.1.189:8443/r/test.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'http://192.168.1.189:8443/r/test.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
解决方法:
```bash
# 先拉取
git pull
# 后推送
git push origin master
```
**注意:** 不要强推,可能覆盖他人修改,一般用不到。
```bash
git push -f origin master
```
## 合并冲突(修改同一文件)
当 A 和 B 同时修改了同一文件的时候,本地文件和远程文件发生了冲突。Git 无法自动合并,需要你手动解决冲突。
例如:
```bash
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
```
意思是:
- Git 在合并文件 `a.txt` 时,发现本地和远程对同一部分代码进行了修改;
- 无法判断以哪一方为准,自动合并失败;
- 需要你手动处理这个冲突。
解决方案:
1. 打开冲突的 `a.txt` 文件,查看里面的内容:
```
<<<<<<< HEAD
12 # 这里是 A 修改的
=======
1 # 这里是 B 修改的
2
>>>>>>> 6fe1e2d97eae79e0c5080ddea4bdef658841486d
```
2. 手动修改内容,保留需要的部分。例如:
```
12
```
3. 添加修改后的文件:
```bash
git add a.txt
git commit -m "解决 a.txt 冲突"
git push origin master
```
## 修改文件但 git status 显示未修改
可能的原因:
- 你改的是换行符(LF/CRLF)但内容没变;
- 编辑器保存规则设置导致未检测到真实修改;
- 文件编码问题或隐藏字符。
解决方法:
- 用 `git diff` 检查是否真的修改了;
- 也可以尝试先改点内容,再恢复,重新保存。
## 误删文件
### 文件误删并已 add
误删了一个文件(比如 `b.txt`),然后执行了:
```bash
git add a.txt
```
- 这时候 Git **把删除操作加入暂存区**,等待 commit。
- 文件还没有被 commit,但已经从工作区和暂存区记录为“删除”。
**查看哪些文件被误删**
```bash
git status
```
示例输出
```bash
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: a.txt
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: a.txt
```
**恢复文件**
这会把文件从暂存区移除,但 **不会恢复工作区文件**。
```bash
git restore --staged a.txt
```
这会把文件从最后一次 commit 的版本恢复到工作区。
```bash
git restore a.txt
```
或者可以循环恢复多个误删文件:
```
git restore --staged .
git restore .
```
> `git restore .` 会把所有误删且未 commit 的文件恢复。
### 文件已 commit,误删未 add
场景说明
- 文件 **已经被 Git commit**(也就是之前已经被保存到版本历史中)
- 你在工作区 **误删了该文件**
- **还没有执行 `git add`**
> 这时候 Git 知道文件原本存在,但工作区已经缺失。
**查看被误删的文件**
```bash
git status
```
示例输出:
```bash
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
deleted: a.txt
```
> 🔹 `deleted: a.txt` 就是被误删的文件。
**恢复误删文件(未 add)**
```bash
git restore a.txt
```
> 这会从 **最近一次 commit** 恢复文件到工作区。
**检查文件是否恢复成功**
```
git status
```
- 文件会出现在工作区
- `git status` 不再显示 `deleted`