基本用法
git init
- 将普通文件夹初始为 Git 管理的文件夹 (仓库).
git add
- **跟踪: **将文件从 Untracked 状态变为 Tracked 状态.
- **暂存: **将文件从 Unstaged 状态变为 Staged 状态.
git commit -m
- **提交: **将文件从 Staged 状态变为 commited 状态 (提交到仓库中) .
git status
- 状态: 显示仓库中文件的 Git 状态.
版本穿梭
git log
- 显示 HEAD 指针及其祖先的 commit 历史.
git reflog
- 显示 HEAD 指针指向记录的历史.
git reset --hard (HEAD^/commit_id)
- 穿梭到相应的版本. 通常可以搭配
git log
和git reflog
使用.
git restore <files>
- 丢弃修改. 将文件从 Unstaged 状态变回上一个状态 (可能是 Staged 状态也可能是 commited 状态).
- 可以用
git checkout -- <files>
达到相同的效果, 但是不建议.
git restore --staged <files>
- 丢弃修改. 将文件从 Staged 状态变回 Unstaged 状态.
- 可以用
git reset HEAD <fiels>
达到相同的效果, 但是不建议.
远程仓库
git clone <url> [<dir>]
- 克隆远程仓库 (改名是可选的).
git remote add <remote> <url>
- 关联远程仓库.
- 例如:
git remote add https://github.com/ame-lm/hi
.
git remote rm <remoete>
- 解除远程仓库关联.
git push <remote> <branch>
- 推送分支.
git pull <remote> <branch>
- 拉取分支.
git fetch <remote> <branch>
- 拉取并合并分支.
分支管理
git branch
- 列出所有分支.
git branch <branch>
- 创建分支.
git switch <branch> / git checkout <branch>
- 切换分支.
git merge <branch>
- 合并分支.
git merge --abort
- 冲突时, 取消本次合并.
git branch -d <branch>
- 删除分支.
git stash
- 临时保存工作区.
git stash apply
- 恢复工作区
git cherry-pick <commit_id>
- 将特定的 commit 再次提交.
- 例如你正在维护 v1 和开发 v2 版本, 在 v1 中发现了一个 bug, 该 bug 在 v2 的某个 commit 中得到了修复. 此时你肯定不想在 v1 中再次编写同样的代码, 但是又不能合并整个 v2 分支到 v1, 这样会造成版本混乱. 这时可以使用
git cherry-pick <commit_id>(v2 中的某个提交 commit_id)
, 来修复此 bug. - 这会在 v1 分支中重新提交该 commit. 但是拥有不同的 commit_id.
- 如果发生了冲突, 需要解决冲突后使用
git add ...
, 然后再git cherriy-pick --continue
继续提交. - 冲突时, 也可以
git cherriy-pick --abort
放弃此次提交.
git rebase
- 整理 log, 慎用. 可能会和别处已经有的 log 产生冲突.
- 参考此文: https://www.yiibai.com/git/git_rebase.html
分支管理策略
master / main
- master / main 分支通常用来发布稳定的正式版本.
dev
- dev 分支通常用来进行开发, 包含项目的所有代码, 但是并不稳定, 当有稳定版本的时候合并到master / main 分支即可.
git merge --no-ff -m "..." dev.
- 禁止 fast-forward 合并. 这可能会丢失合并信息.
标签管理
git tag
- 列出标签.
git tag <tag>
- 给当前分支最新 commit 打标签.
git tag <tag> <commit_id>
- 给特定的 commit 打上标签.
git tag -a <tag> -m "..." <commit>
- 给特定的 commit 打上标签, 并添加 comment 信息.
git tag -d <tag>
- 删除标签.
git push <remote> <tag>
- 推送标签.
git push <remote> : /refs/tags/<tag>
- 删除标签.
- 例如:
git push origin : refs/tags/v1.23.9
.