176 lines
3.2 KiB
Markdown
176 lines
3.2 KiB
Markdown
---
|
||
title: git基本命令
|
||
date: 2024-12-10
|
||
tags: [git]
|
||
---
|
||
|
||
|
||
## 基本操作
|
||
|
||
1、初始化:`git init`
|
||
|
||
2、添加(全部文件到)暂存区:`git add .`
|
||
|
||
- 相当于交给git管理文件
|
||
|
||
撤销暂存区:`git reset`
|
||
|
||
3、添加到本地仓库:`git commit -m 'msg'`
|
||
|
||
4、添加到远程仓库:`git push -u origin "master"`
|
||
|
||
- 前提是添加了远程仓库,如下
|
||
|
||
`git remote add origin` `[https://gitee.com/QGS_Code/file-system.git](https://gitee.com/QGS_Code/file-system.git)`
|
||
|
||
|
||
|
||
|
||
取消git管理
|
||
|
||
- 删除.git
|
||
|
||
更换远程仓库
|
||
|
||
- git remote -v
|
||
- git remote set-url origin [https://github.com/yourusername/new-repository.git](https://github.com/yourusername/new-repository.git)
|
||
|
||
|
||
|
||
|
||
|
||
### 可以设置 `git status` 忽略未关心目录里的改动
|
||
|
||
比如前端不关心 backend 改动,可以临时忽略:
|
||
|
||
```Shell
|
||
git update-index --assume-unchanged backend/*
|
||
```
|
||
|
||
恢复:
|
||
|
||
```Shell
|
||
git update-index --no-assume-unchanged backend/*
|
||
```
|
||
|
||
反过来一样。
|
||
|
||
---
|
||
|
||
|
||
|
||
git版本控制
|
||
|
||
本地记录
|
||
|
||
- master分支:A — B — C
|
||
- 其他分支:A — B — C — D — E
|
||
|
||
远程记录
|
||
|
||
- 远程master:A— B — C
|
||
- 其他远程分支:A — B — C — D — E
|
||
|
||
### git fetch
|
||
|
||
这会更新本地的**远程跟踪分支**
|
||
|
||
### git **merge** master
|
||
|
||
把master的内容**合并**到当前分支,生成一个新版本,一般都是将其他分支合(新功能)并到主分支
|
||
|
||
- 图解
|
||
|
||
👉 `M` 是 merge commit,表示 `comment_dev` 把 `master` 的 C 合进来了。
|
||
|
||
```Java
|
||
A---B---C (master)
|
||
\
|
||
D---E (comment_dev)
|
||
|
||
A---B---C (master)
|
||
\ \
|
||
D---E---M (comment_dev)
|
||
更新内容
|
||
A---B---C (master)
|
||
\
|
||
D---E (comment_dev)
|
||
|
||
A---B---C---M (master)
|
||
\ \
|
||
D---E (comment_dev)
|
||
```
|
||
|
||
|
||
### git pull
|
||
|
||
=**git fetch + git merge**
|
||
|
||
|
||
|
||
### git **rebase** master
|
||
|
||
基于最新版本开发(可能要解决冲突),**变基,**合并代码的另一种方式
|
||
|
||
- 将 `**comment_dev**` 的提交 `**D**` 和 `**E**` 暂存起来。
|
||
- 将 `**comment_dev**` 的指针移动到 `**master**` 的最新提交 `**G**`。
|
||
- 尝试将 `**D**` 和 `**E**` 重新应用到 `**G**` 之上。
|
||
|
||
```Java
|
||
A---B---C (master)
|
||
\
|
||
D---E (comment_dev)
|
||
|
||
A---B---C (master)
|
||
\
|
||
D---E (comment_dev)
|
||
```
|
||
|
||
## 📌 注意 ⚠️
|
||
|
||
- **rebase 之后必须强推(push -f)**
|
||
|
||
因为提交历史改了,普通 push 会被拒绝。
|
||
|
||
|
||
```Shell
|
||
git push -f origin feature-branch
|
||
```
|
||
|
||
- 不要对**公共分支**(比如 dev、master)执行 rebase,会影响其他人。
|
||
|
||
|
||
|
||
### 本地 `master` 回退到你想要的版本
|
||
|
||
比如:
|
||
|
||
```Shell
|
||
git checkout master
|
||
git reset --hard 4e5f6g7 # 你要回去的那个 commit
|
||
```
|
||
|
||
---
|
||
|
||
### 📊 2️⃣ 强制推送覆盖远程 master
|
||
|
||
```Shell
|
||
git push -f origin master
|
||
```
|
||
|
||
查看提交记录(q 退出)
|
||
|
||
```Shell
|
||
git log --oneline --graph --decorate
|
||
```
|
||
|
||
|
||
|
||
## 📦 总结:
|
||
|
||
| | | | |
|
||
|---|---|---|---|
|
||
|操作|远程新提交|本地 `A`|本地 `origin/A`|
|
||
|`fetch`|获取到了|不变|更新到最新|
|
||
|`merge origin/A`|会合并|和 `origin/A` 合并|-|
|
||
|`pull`(默认 `fetch+merge`)|获取并合并|会更新|同步| |