10 个超实用 git 命令,效率提升必备

737 阅读6分钟

Git 是现代开发者的必备工具,无论是个人项目还是团队协作,Git 都能帮助我们高效管理代码版本。

然而,初学者常常被 Git 的复杂性吓到,甚至在关键时刻手忙脚乱。

为了让你少走弯路,我选 10 个非常实用的 Git 技巧,涵盖从基础到高级的操作,助你快速上手并提升效率。

1. 撤销最后一次提交而不丢失更改

当你提交了错误的文件或写错了提交信息时,可以用以下命令撤销最后一次提交,但保留文件的更改:

git reset --soft HEAD~1

此时更改会回到暂存区,你可以重新提交正确的信息:

git commit -m "正确的提交信息"

小贴士:

--soft 参数保留更改,--hard 则会直接丢弃更改,使用时需谨慎。

2. 快速解决合并冲突

合并冲突是 Git 使用中的常见问题。Git 会在冲突文件中标记冲突内容:

<<<<<<< HEAD
你的更改
=======
队友的更改
>>>>>>> feature-branch

手动编辑文件后,运行以下命令完成合并:

git add <冲突文件>
git commit -m "解决合并冲突"

建议: 使用 IDE 内置的冲突解决工具(如 VS Code)更直观,能大幅提升效率。

3. 暂存未完成的更改

当你需要切换分支但不想提交当前更改时,可以使用 git stash

  • 暂存更改:
git stash
  • 恢复更改:
git stash pop

小贴士: 使用 git stash list 查看所有暂存的更改,方便管理。

4. 合并多个提交(Squash)

当分支上的提交过多且杂乱时,可以通过交互式 rebase 合并提交:

git rebase -i HEAD~3

运行上面命令后,Git 会打开一个交互式编辑器(通常是 Vim 或你配置的默认编辑器),显示最近 3 次提交的列表,类似这样:

pick abc123 First commit message
pick def456 Second commit message
pick ghi789 Third commit message

如果想把第二次提交和第三次提交合并到第一次提交中,并修改最终的提交信息,可以这样将前面 pick 改为 squash:

pick abc123 First commit message
squash def456 Second commit message
squash ghi789 Third commit message

按 Esc,输入 :wq,然后回车,保存并退出。Git 会提示你编辑合并后的提交信息,完成后提交历史就会被整理成一条新的提交。

  • squash:合并提交,并保留所有提交信息。
  • fixup:合并提交,但只保留第一个提交的信息。

5. 高效查看提交历史

  • 简洁模式:
git log --oneline

例如:

$ git log --oneline
a1b2c3d 修复登录页面的 bug
d4e5f6a 添加用户注册功能
f7g8h9b 初始化项目
  • 图形化显示分支和提交:
git log --graph --oneline --all
git log -p <filename>

例如:

$ git log --graph
*   d4e5f6a (HEAD -> main) 合并分支 feature/login
|\  
| * a1b2c3d (feature/login) 修复登录页面的 bug
|/  
* f7g8h9b 初始化项目
    • 表示一个提交。
  • 竖线 | 表示分支上的提交是线性发展的,斜线 / 和反斜线 \ 表示分支的分叉和合并

小贴士: 使用 --oneline--graph 参数可以快速了解项目的整体历史。

假设我们有一个 Git 仓库,提交历史如下,注意越上面提交越新:

*   3e1c2f3 Merge branch 'feature'
|\  
| * 1a2b3c4 Add feature B
| * 9d8e7f6 Add feature A
* | 4f5g6h7 Fix bug in main branch
|/  
* 2c3d4e5 Initial commit

从 2c3d4e5 开始,主分支继续向上,创建了提交 4f5g6h7。同时,feature 分支从 2c3d4e5 分叉,创建了提交 9d8e7f6 和 1a2b3c4。提交 3e1c2f3 是一个合并提交,它将 feature 分支合并回了主分支。

使用 git log --oneline:

3e1c2f3 Merge branch 'feature'
1a2b3c4 Add feature B
9d8e7f6 Add feature A
4f5g6h7 Fix bug in main branch
2c3d4e5 Initial commit

使用 git log --graph:

*   commit 3e1c2f3 (HEAD -> main) Merge branch 'feature'
|\  
| * commit 1a2b3c4 (feature) Add feature B
| * commit 9d8e7f6 Add feature A
* | commit 4f5g6h7 Fix bug in main branch
|/  
* commit 2c3d4e5 Initial commit

其实还有一个命令更好用:git log --oneline --graph,它在 git log --graph 的基础上,进一步简化输出,每个提交只显示一行(简短哈希值 + 提交说明):

*   3e1c2f3 Merge branch 'feature'
|\  
| * 1a2b3c4 Add feature B
| * 9d8e7f6 Add feature A
* | 4f5g6h7 Fix bug in main branch
|/  
* 2c3d4e5 Initial commit

6. 使用标签管理版本

git tag 是 Git 中用来给某个提交(commit)打标签的命令,通常用于标记重要的发布版本。

标签分为两种:轻量标签(lightweight tag) 和 附注标签(annotated tag)。

  • 创建轻量标签:
git tag v1.0
  • 推送标签到远程仓库:
git push origin v1.0

小贴士: 使用语义化版本号(如 v1.0.0)可以更清晰地管理项目版本。

如果想给某个特定的提交打标签,可以指定提交的哈希值:

git tag v1.0.0 <commit-hash>

创建附注标签:

git tag -a v1.0.0 -m "Release version 1.0.0"
  • -a 表示创建附注标签。
  • -m 用来添加标签的说明信息。

同样,也可以指定某个提交并推送:

git tag -a v1.0.0 <commit-hash> -m "Release version 1.0.0"
git push origin v1.0.0

如果我们想一次性推送所有标签:

git push origin --tags

最后我们顺便说说删除标签,它需要先删除本地标签,再推送删除操作:

git tag -d v1.0.0
git push origin --delete v1.0.0

7. 忽略不必要的文件

通过 .gitignore 文件指定 Git 应忽略的文件或文件夹:

# 忽略 node_modules 文件夹
node_modules/

# 忽略环境配置文件
.env

.gitignore 文件添加到版本控制中:

git add .gitignore
git commit -m "添加 .gitignore 文件"

小贴士: 在项目初始化时就配置好 .gitignore,避免不必要的文件被提交。

8. 快速切换分支

当你需要频繁切换分支时,可以使用以下命令返回上一个分支:

git checkout -

这个命令会让你快速回到之前的分支,尤其在多分支开发时非常实用。

9. 查找特定提交

  • 查看文件每行的最后修改记录:
git blame <filename>
  • 搜索包含特定关键词的提交:
git log -S "关键词"

小贴士: git blame 是排查问题的利器,能快速定位代码的修改者和时间。

10. 清理无用的分支

随着项目的推进,可能会产生许多不再需要的分支。清理这些分支可以让仓库更整洁:

  • 删除本地分支:
git branch -d branch-name

git branch -d:安全删除,当你分支的更改没有被合并到其他分支再删除,更常用。

git branch -D:强制删除,适合清理无用分支时使用。

  • 删除远程分支:
git push origin --delete branch-name

小贴士: 定期清理无用分支,保持仓库的整洁和可维护性。

最后,Git 是一门实践性很强的工具,只有多用、多练,才能真正掌握它的精髓。