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 是一门实践性很强的工具,只有多用、多练,才能真正掌握它的精髓。