Git 分支管理与常用命令
Git 分支管理与常用命令
平时用 Git 攒下来的一些手边命令,按场景分组记一下,免得每次都去翻文档。
远程分支的增删改
新建并推送分支
基于某个 commit 建分支再推到远程:
git branch <branch_name> <commit_sha>
git push -u origin <branch_name>
git checkout -f <commit_sha>
-u 把本地分支和远程分支关联起来,之后 git push / git pull 就不用再写远程名和分支名了。
删除分支
git branch -d <branch_name> # 删本地分支,有未合并提交时会拒绝
git branch -D <branch_name> # 强制删除本地分支
git push -d origin <branch_name> # 删除远程分支
-d 是安全删除,只有分支已经合并进上游才肯删;-D 不管三七二十一直接删,适合废弃的实验分支。
重命名远程分支
远程没有"改名"这个操作,实际是改本地名 + 推新名 + 删旧名:
git pull
git checkout <old_branch_name>
git branch -m <old_branch_name> <new_branch_name>
git push -u origin <new_branch_name>
# 旧的远程分支记得另外删: git push -d origin <old_branch_name>
git add 的几种用法
git add 的作用是把改动放进暂存区(staging area),决定哪些进下一个 commit。最常用的三种:
git add <path>:暂存指定文件或目录git add .:暂存当前目录及子目录里的改动(不含.gitignore里的)git add -p:交互式地按 hunk 逐块挑选要暂存的改动
-p 这个我用得最多。同一个文件里改了好几处不相关的东西时,用它可以把改动拆成几个干净的 commit,而不是一股脑塞进去。
暂存全部文件的几个标志
一次性暂存所有改动省事,但容易出岔子——历史会变乱,还可能把大二进制文件或带密钥的文件误提交进去。真要全加,先搞清楚这几个标志的区别:
| 新增文件 | 修改文件 | 删除文件 | 点开头文件 | 当前目录 | 上级目录 | |
|---|---|---|---|---|---|---|
git add -A | 是 | 是 | 是 | 是 | 是 | 是 |
git add . | 是 | 是 | 是 | 是 | 是 | 否 |
git add -u | 否 | 是 | 是 | 是 | 是 | 是 |
记忆点:-A 范围最大(整个仓库),. 只管当前目录往下,-u 不会暂存新文件(只管已跟踪文件的修改和删除)。
撤销 git add
git add 没有直接的"反向 add",但可以把文件移出暂存区。用 mixed 级别的 reset(默认级别):
git reset HEAD # 等价于 git reset --mixed HEAD
它把暂存区的改动退回工作区,不动已提交的历史。注意一个坑:如果暂存之后又在工作区改了同一个文件,这时两个版本不一致,撤销暂存会用暂存区的版本覆盖工作区的新改动。稳妥做法是先 git add 把所有改动都暂存,再整体 reset。
几条好用的命令
git log 时间戳转本地时区
服务器记录的提交时间是它自己的时区,看着别扭。用 --date=format-local 强制转成本地时区,顺便把输出拼成 HTML 表格行:
git log --oneline --pretty=format:"<tr><td>%cn</td><td>%s</td><td>%H</td><td>%ad</td></tr>" --date=format-local:"%Y-%m-%d %H:%M:%S"
%cn 提交者、%s 标题、%H 完整 hash、%ad 作者日期。生成报表时挺顺手。
git clean 排除指定目录
清掉未跟踪的文件和目录,但保留 venv(Python 虚拟环境别误删):
git clean -x -d -f -e venv
-x 连 .gitignore 忽略的也清,-d 含目录,-f 强制执行,-e 指定排除项(文件和目录都支持)。-x 比较狠,跑之前最好先加 -n 干跑一遍看会删哪些。
从别的机器拷贝大仓库
仓库很大(比如带 LFS 的大文件仓)时,重新 clone 要等很久。更快的办法是直接从另一台已经 clone 好的机器拷整个目录(含 .git 文件夹)过来,再在本地对齐远程状态:
# 1. 从已成功 clone 的机器拷贝整个仓库目录(包括 .git)过来
git status
git stash # 有本地改动先存起来
# 2. 本地切到目标远程分支
git pull origin <originBranchName>
git checkout <originBranchName>
# 3. 同步 LFS 大文件
git lfs pull
本地仓库目录可以随便移动、拷贝,不影响 Git 操作——Git 用的是相对 .git 的相对结构,换路径也不会坏。