|
| 1 | +--- |
| 2 | +title: git 常用命令 |
| 3 | +order: 2 |
| 4 | +category: |
| 5 | + - 其他 |
| 6 | +tag: |
| 7 | + - git |
| 8 | +editLink: false |
| 9 | +--- |
| 10 | + |
| 11 | +Git 是最常用的版本控制工具之一,广泛用于开发和项目管理中。以下是一些常用的 Git 命令及其详细说明: |
| 12 | + |
| 13 | +## 常用 Git 命令及其说明 |
| 14 | + |
| 15 | +### repository 操作 |
| 16 | + |
| 17 | +1. **git init** |
| 18 | +- **作用**:本地初始化一个新的 Git 仓库。 |
| 19 | +- **用法**:在一个空目录中运行 `git init`,Git 会创建一个 `.git` 目录,用于存储仓库的元数据。 |
| 20 | + |
| 21 | +```bash |
| 22 | + git init |
| 23 | +``` |
| 24 | + |
| 25 | +2. **git clone** |
| 26 | +- **作用**:从远程仓库克隆一个仓库到本地。 |
| 27 | +- **用法**:`git clone` 后跟仓库 URL,可以将远程仓库复制到本地。 |
| 28 | + |
| 29 | +```bash |
| 30 | + git clone https://github.com/user/repository.git |
| 31 | +``` |
| 32 | + |
| 33 | +3. **git remote** |
| 34 | +- **作用**:管理远程仓库地址。 |
| 35 | +- **用法**: |
| 36 | + - 查看当前的远程仓库:`git remote -v` |
| 37 | + - 添加新的远程仓库:`git remote add origin https://github.com/user/repo.git` |
| 38 | + - 删除远程仓库:`git remote remove origin` |
| 39 | + |
| 40 | + ```bash |
| 41 | + git remote -v # 查看远程仓库 |
| 42 | + git remote add origin https://github.com/user/repo.git # 添加远程仓库 |
| 43 | + ``` |
| 44 | + |
| 45 | +## 修改管理 |
| 46 | + |
| 47 | +### 1. **git add** |
| 48 | +- **作用**:将文件添加到暂存区(stage),为下次提交做准备。 |
| 49 | +- **用法**:`git add` 后跟文件路径,或使用 `.` 添加当前目录下的所有更改。 |
| 50 | + |
| 51 | + ```bash |
| 52 | + git add file.txt |
| 53 | + git add . |
| 54 | + ``` |
| 55 | + |
| 56 | +### 2. **git commit** |
| 57 | +- **作用**:提交暂存区的更改,生成新的提交。 |
| 58 | +- **用法**:`git commit` 通常跟 `-m` 选项来添加提交信息,描述本次提交的内容。 |
| 59 | + |
| 60 | + ```bash |
| 61 | + git commit -m "Add new feature" |
| 62 | + ``` |
| 63 | +- **修改commit信息**: 使用 `--amend` 修改最后一次提交的信息或内容。 |
| 64 | + |
| 65 | + ```bash |
| 66 | + git commit --amend -m "Corrected commit message" |
| 67 | + ``` |
| 68 | +- **多次提交合并**:使用 `rebase` 合并最近几次的commit。 |
| 69 | + |
| 70 | + ```bash |
| 71 | + git rebase -i HEAD~n |
| 72 | + ``` |
| 73 | + |
| 74 | +### 3. **git status** |
| 75 | +- **作用**:显示工作目录和暂存区的状态,查看哪些文件有更改、哪些文件被暂存、哪些文件未被跟踪。 |
| 76 | +- **用法**:运行 `git status` 可以看到当前分支的状态信息。 |
| 77 | + |
| 78 | + ```bash |
| 79 | + git status |
| 80 | + ``` |
| 81 | + |
| 82 | +### 4. **git log** |
| 83 | +- **作用**:显示仓库的提交历史记录。 |
| 84 | +- **用法**:`git log` 列出当前分支的所有提交。你可以使用 `--oneline` 选项简化输出,或者 `--graph` 查看分支图形。 |
| 85 | + |
| 86 | + ```bash |
| 87 | + git log |
| 88 | + git log --oneline |
| 89 | + git log --graph --oneline |
| 90 | + ``` |
| 91 | + |
| 92 | +### 5. **git diff** |
| 93 | +- **作用**:查看工作目录、暂存区和最新提交之间的差异。 |
| 94 | +- **用法**:`git diff` 显示未暂存的更改,`git diff --staged` 显示已暂存但未提交的更改。 |
| 95 | + |
| 96 | + ```bash |
| 97 | + git diff |
| 98 | + git diff --staged |
| 99 | + ``` |
| 100 | + |
| 101 | +### 6. **git checkout** |
| 102 | +- **作用**:恢复工作目录中文件的状态。 |
| 103 | +- **用法**:`git checkout --` 后跟文件。 |
| 104 | + |
| 105 | +```bash |
| 106 | + git checkout feature-branch |
| 107 | + git checkout -- file.txt # 恢复文件 |
| 108 | +``` |
| 109 | +### 7. **git stash** |
| 110 | +- **作用**:保存当前工作目录的更改,以便稍后恢复,而不影响当前的代码提交历史。 |
| 111 | +- **用法**:`git stash` 可以在不提交代码的情况下保存未完成的工作。 |
| 112 | + |
| 113 | + ```bash |
| 114 | + git stash |
| 115 | + git stash pop # 恢复工作 |
| 116 | + ``` |
| 117 | + |
| 118 | +### 8. **git reset** |
| 119 | +- **作用**:重置当前分支的提交历史或工作目录状态,回退到之前的某个提交点。 |
| 120 | +- **用法**: |
| 121 | + - `git reset --soft`:保留工作区文件,只回退提交。 |
| 122 | + - `git reset --hard`:丢弃工作区文件和提交历史。 |
| 123 | + |
| 124 | + ```bash |
| 125 | + git reset --soft HEAD~1 # 回退一提交,但保留工作目录更改 |
| 126 | + git reset --hard HEAD~1 # 丢弃更改 |
| 127 | + ``` |
| 128 | + |
| 129 | +## 分支管理 |
| 130 | + |
| 131 | +### 1. **git checkout** |
| 132 | +- **作用**:切换分支。 |
| 133 | +- **用法**:`git checkout` 后跟分支名称,切换到指定分支 |
| 134 | + |
| 135 | + ```bash |
| 136 | + git checkout feature-branch |
| 137 | + git checkout -b feature-branch #创建并切换分支 |
| 138 | + ``` |
| 139 | + |
| 140 | +### 2. **git branch** |
| 141 | +- **作用**:管理分支。列出、创建或删除分支。 |
| 142 | +- **用法**: |
| 143 | + - 列出分支:`git branch` |
| 144 | + - 创建新分支:`git branch branch_name` |
| 145 | + - 删除分支:`git branch -d branch_name` |
| 146 | + |
| 147 | + ```bash |
| 148 | + git branch # 列出所有分支 |
| 149 | + git branch feature-branch # 创建新分支 |
| 150 | + git branch -d feature-branch # 删除分支 |
| 151 | + ``` |
| 152 | + |
| 153 | +### 3. **git merge** |
| 154 | +- **作用**:合并分支,将指定分支的更改合并到当前分支。 |
| 155 | +- **用法**:`git merge` 后跟要合并的分支名称。 |
| 156 | + |
| 157 | + ```bash |
| 158 | + git merge feature-branch |
| 159 | + ``` |
| 160 | + |
| 161 | +### 4. **git rebase** |
| 162 | +- **作用**:将当前分支的更改应用到另一分支的顶端,从而保持线性历史。 |
| 163 | +- **用法**:`git rebase` 可以让你的提交历史保持整洁。 |
| 164 | + |
| 165 | + ```bash |
| 166 | + git rebase main |
| 167 | + ``` |
| 168 | + |
| 169 | +## 数据同步 |
| 170 | + |
| 171 | +### 1. **git pull** |
| 172 | +- **作用**:从远程仓库拉取更改并合并到本地分支。相当于 `git fetch` 加 `git merge`。 |
| 173 | +- **用法**:`git pull` 默认从当前跟踪的远程分支拉取更新。 |
| 174 | + |
| 175 | +```bash |
| 176 | + git pull origin main |
| 177 | +``` |
| 178 | + |
| 179 | +### 2. **git push** |
| 180 | +- **作用**:将本地分支的提交推送到远程仓库。 |
| 181 | +- **用法**:`git push` 将更改推送到远程分支。 |
| 182 | + |
| 183 | + ```bash |
| 184 | + git push origin main |
| 185 | + ``` |
| 186 | + |
| 187 | +### 3. **git fetch** |
| 188 | +- **作用**:从远程仓库获取最新的提交和分支信息,但不合并到本地分支。 |
| 189 | +- **用法**:`git fetch` 会下载远程仓库的所有更改,但不会自动合并。 |
| 190 | + |
| 191 | +```bash |
| 192 | + git fetch origin |
| 193 | +``` |
| 194 | + |
| 195 | +## 管理 Submodule |
| 196 | +Git Submodule 是一个非常有用的功能,允许你在一个 Git 仓库中包含另一个独立的 Git 仓库。这对于需要将多个项目组合在一起的场景非常实用,例如一个大型项目包含多个子模块。以下是常见的 Git Submodule 操作和使用场景的详细介绍。 |
| 197 | + |
| 198 | +### 1. **添加 Submodule** |
| 199 | +- **作用**:在你的项目中添加一个子模块,它指向另一个 Git 仓库。 |
| 200 | +- **命令**: |
| 201 | + |
| 202 | + ```bash |
| 203 | + git submodule add <repository_url> <path> |
| 204 | + ``` |
| 205 | + |
| 206 | + 示例: |
| 207 | + |
| 208 | + ```bash |
| 209 | + git submodule add https://github.com/example/repo.git libs/repo |
| 210 | + ``` |
| 211 | + |
| 212 | + 这会将 `repo` 仓库克隆到当前项目的 `libs/repo` 目录,并将其作为子模块添加。 |
| 213 | + |
| 214 | +### 2. **初始化和更新 Submodule** |
| 215 | +- **初始化**:当你克隆包含子模块的仓库时,子模块不会自动被克隆。你需要先初始化它们: |
| 216 | + |
| 217 | + ```bash |
| 218 | + git submodule init |
| 219 | + ``` |
| 220 | + |
| 221 | +- **更新子模块**:初始化之后,使用以下命令克隆并更新子模块到最新提交: |
| 222 | + |
| 223 | + ```bash |
| 224 | + git submodule update |
| 225 | + ``` |
| 226 | + |
| 227 | +- **克隆仓库时自动初始化和更新子模块**:可以使用 `--recurse-submodules` 选项在克隆时自动初始化并更新所有子模块: |
| 228 | + |
| 229 | + ```bash |
| 230 | + git clone --recurse-submodules <repository_url> |
| 231 | + ``` |
| 232 | + |
| 233 | +### 3. **查看 Submodule 状态** |
| 234 | +- **作用**:显示当前仓库中所有子模块的状态,例如子模块当前指向的 commit。 |
| 235 | +- **命令**: |
| 236 | + |
| 237 | + ```bash |
| 238 | + git submodule status |
| 239 | + ``` |
| 240 | + |
| 241 | + 输出中会显示子模块的哈希、路径以及子模块是否是最新的。 |
| 242 | + |
| 243 | +### 4. **更新 Submodule 到最新版本** |
| 244 | +- **作用**:如果子模块的上游仓库有新的提交,你可以将子模块更新到最新版本。 |
| 245 | +- **命令**: |
| 246 | + |
| 247 | + 进入子模块目录,然后拉取最新的更改: |
| 248 | + |
| 249 | + ```bash |
| 250 | + cd libs/repo |
| 251 | + git pull origin main |
| 252 | + ``` |
| 253 | + |
| 254 | + 回到主项目后,提交子模块的更新: |
| 255 | + |
| 256 | + ```bash |
| 257 | + git add libs/repo |
| 258 | + git commit -m "Update submodule" |
| 259 | + ``` |
| 260 | + |
| 261 | +### 5. **删除 Submodule** |
| 262 | +- **作用**:从项目中移除子模块。 |
| 263 | +- **步骤**: |
| 264 | + |
| 265 | + 1. **删除子模块的条目**:从 `.gitmodules` 文件中移除子模块条目。 |
| 266 | + |
| 267 | + 2. **删除子模块配置**:从 `.git/config` 文件中移除子模块的配置条目。 |
| 268 | + |
| 269 | + 3. **删除子模块目录**:手动删除子模块目录并从版本控制中移除: |
| 270 | + |
| 271 | + ```bash |
| 272 | + git rm -f libs/repo |
| 273 | + ``` |
| 274 | + |
| 275 | + 4. **提交更改**: |
| 276 | + |
| 277 | + ```bash |
| 278 | + git commit -m "Remove submodule" |
| 279 | + ``` |
| 280 | + |
| 281 | +### 6. **将 Submodule 更新到特定的 Commit** |
| 282 | +- **作用**:在某些场景下,你可能希望子模块保持在特定的 commit,而不是跟随最新的更改。 |
| 283 | +- **命令**: |
| 284 | + |
| 285 | + 进入子模块目录,检查出所需的 commit: |
| 286 | + |
| 287 | + ```bash |
| 288 | + cd libs/repo |
| 289 | + git checkout <commit_hash> |
| 290 | + ``` |
| 291 | + |
| 292 | + 回到主项目,添加并提交子模块的状态: |
| 293 | + |
| 294 | + ```bash |
| 295 | + git add libs/repo |
| 296 | + git commit -m "Update submodule to specific commit" |
| 297 | + ``` |
| 298 | + |
| 299 | +### 7. **嵌套 Submodule** |
| 300 | +子模块本身也可以包含子模块,称为嵌套子模块。这些子模块的操作与普通子模块类似,但需要特别注意初始化和更新嵌套结构时可能出现的复杂性。 |
| 301 | + |
| 302 | +### 8. **处理 Submodule 的常见问题** |
| 303 | +- **子模块指针未更新**:当你更新子模块后,可能会忘记将更新提交到主仓库。确保更新完子模块后,执行 `git add` 和 `git commit` 将指针的变化保存到主仓库。 |
| 304 | +- **子模块无法初始化或更新**:确保子模块的 URL 正确,并且你有相应的权限克隆子模块。 |
| 305 | + |
| 306 | +::: tip 总结 |
| 307 | +Git Submodule 是在大型项目或多仓库项目中非常有用的功能,可以让你更好地组织代码。通过上述命令,你可以轻松地添加、更新、管理和删除子模块。掌握这些操作将帮助你有效地管理项目依赖关系和模块化代码结构。 |
| 308 | +::: |
| 309 | + |
0 commit comments