Git 是现代开发者的必备工具,无论是个人项目还是团队协作,Git 都能帮助我们高效管理代码版本。
然而,初学者常常被 Git 的复杂性吓到,甚至在关键时刻手忙脚乱。
为了让你少走弯路,我选 10 个非常实用的 Git 技巧,涵盖从基础到高级的操作,助你快速上手并提升效率。
1. 撤销最后一次提交而不丢失更改
当你提交了错误的文件或写错了提交信息时,可以用以下命令撤销最后一次提交,但保留文件的更改:
git reset --soft HEAD~1
此时更改会回到暂存区,你可以重新提交正确的信息:
git commit -m "正确的提交信息"
小贴士:
--soft
参数保留更改,
--hard
则会直接丢弃更改,使用时需谨慎。
2. 快速解决合并冲突
合并冲突是 Git 使用中的常见问题。Git 会在冲突文件中标记冲突内容:
<<<<<<你的更改
=======
队友的更改
>>>>>>> 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 会提示你编辑合并后的提交信息,完成后提交历史就会被整理成一条新的提交。
插播一条:如果你想加入我们,可以点击->
程序员交流社区
-
-
fixup:
合并提交,但只保留第一个提交的信息。
5. 高效查看提交历史
简洁模式:
git log --oneline
例如:
$ git log --oneline
a1b2c3d 修复登录页面的 bug
d4e5f6a 添加用户注册功能
f7g8h9b 初始化项目
图形化显示分支和提交:
git log --graph --oneline --all
git log -p
例如:
$ 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
创建附注标签:
git tag -a v1.0.0 -m "Release version 1.0.0"
同样,也可以指定某个提交并推送:
git tag -a v1.0.0 -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
搜索包含特定关键词的提交:
git log