1 Git命令大全
sh
git init # 初始化本地git仓库(创建新仓库)
git config --global user.name "xxx" # 配置全局用户名
git config --global user.email "xxx@xxx.com" # 配置全局邮箱
git config --global color.ui true # 配置git命令行界面颜色为开启
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto # 配置不同命令的颜色显示为自动
git config --global --unset http.proxy # 取消全局http代理配置
git clone git+ssh://git@192.168.53.168/VT.git # 克隆远程仓库到本地
git status # 查看当前仓库的状态
git add xyz # 将xyz文件添加到暂存区
git add . # 将当前目录下的所有文件添加到暂存区
git commit -m 'xxx' # 提交暂存区到仓库,并附上提交信息'xxx'
git commit --amend -m 'xxx' # 修改最后一次提交,合并新的更改和提交信息
git commit -am 'xxx' # 将添加到暂存区和提交合并为一步,需要文件已跟踪
git rm xxx # 删除文件xxx并从暂存区移除
git rm -r * # 递归删除当前目录下的所有文件并从暂存区移除
git log # 显示提交历史
git log -1 # 显示最近1次提交的历史
git log -5 # 显示最近5次提交的历史
git log --stat # 显示提交历史和每次提交的文件更改统计
git log -p -m # 显示提交历史,包括差异对比和合并信息
git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示指定提交的详细信息和更改内容
git show dfb02 # 显示提交ID以dfb02开头的提交的详细信息和更改内容
git show HEAD # 显示最新提交的详细信息和更改内容
git show HEAD^ # 显示最新提交的父提交的详细信息和更改内容
git tag # 列出所有标签
git tag -a v2.0 -m 'xxx' # 创建带有注释的标签v2.0,并附上说明'xxx'
git show v2.0 # 显示标签v2.0对应的提交的详细信息和更改内容
git log v2.0 # 显示标签v2.0对应的提交历史
git diff # 显示工作区与暂存区的差异
git diff --cached # 显示暂存区与最新提交的差异
git diff HEAD^ # 显示工作区与上一个版本的差异
git diff HEAD -- ./lib # 显示工作区lib目录与最新提交的差异
git diff origin/master..master # 显示远程分支master与本地分支master的差异
git diff origin/master..master --stat # 显示远程分支master与本地分支master的差异,仅列出文件
git remote add origin git+ssh://git@192.168.53.168/VT.git # 添加远程仓库地址,命名为origin
git branch # 列出所有本地分支
git branch --contains 50089 # 列出包含提交ID 50089的所有分支
git branch -a # 列出所有本地和远程分支
git branch -r # 列出所有远程分支
git branch --merged # 列出所有已合并到当前分支的分支
git branch --no-merged # 列出所有未合并到当前分支的分支
git branch -m master master_copy # 将本地分支master重命名为master_copy
git checkout -b master_copy # 创建并切换到新分支master_copy
git checkout -b master master_copy # 创建新分支master并切换,基于master_copy
git checkout features/performance # 切换到已存在的分支features/performance
git checkout --track hotfixes/BJVEP933 # 创建并切换到跟踪远程分支hotfixes/BJVEP933的本地分支
git checkout v2.0 # 切换到标签v2.0对应的提交
git checkout -b devel origin/develop # 创建并切换到新分支devel,基于远程分支develop
git checkout -- README # 恢复README文件到最新提交的状态
git merge origin/master # 将远程分支master合并到当前分支
git cherry-pick ff44785404a8e # 将提交ff44785404a8e的更改应用到当前分支
git push origin master # 将当前分支推送到远程仓库的master分支
git push origin :hotfixes/BJVEP933 # 删除远程仓库的hotfixes/BJVEP933分支
git push --tags # 将所有标签推送到远程仓库
git fetch # 从远程仓库获取更新(不会合并到当前分支)
git fetch --prune # 获取更新并删除远程仓库中已不存在的分支
git pull origin master # 从远程仓库获取更新并合并到当前分支
git mv README README2 # 重命名文件README为README2
git reset --hard HEAD # 将当前分支重置为最新提交的状态,丢弃所有未提交的更改
git rebase # 变基操作,将当前分支的提交变基到上游分支上
git branch -d hotfixes/BJVEP933 # 删除已合并的分支hotfixes/BJVEP933
git branch -D hotfixes/BJVEP933 # 强制删除分支hotfixes/BJVEP933,即使未合并
git ls-files # 列出被git跟踪的所有文件
git show-branch # 显示当前分支的历史
git show-branch --all # 显示所有分支的历史
git whatchanged # 显示文件更改历史
git revert dfb02e6e4f2f7b573337763e5c0013802e392818 # 撤销指定提交的更改
git ls-tree HEAD # 以树状形式显示最新提交的内容
git rev-parse v2.0 # 显示标签v2.0对应的提交ID
git reflog # 显示引用日志,包括所有提交和引用变更
git show HEAD@{5} # 显示HEAD的第五个历史状态
git show master@{yesterday} # 显示master分支昨天的状态
git log --pretty=format:'%h %s' --graph # 以图形方式显示提交历史,自定义格式
git show HEAD~3 # 显示HEAD的第三个父提交
git show -s --pretty=raw 2be7fcb476 # 显示提交ID为2be7fcb476的提交信息,原始格式
git stash # 将当前更改保存到栈上,恢复到干净状态
git stash list # 列出所有保存的更改栈
git stash show -p stash@{0} # 显示第一个保存的更改栈的详细差异
git stash apply stash@{0} # 应用第一个保存的更改栈
git grep "delete from" # 在文件中搜索包含"delete from"的行
git grep -e '#define' --and -e SORT_DIRENT # 搜索同时包含"#define"和"SORT_DIRENT"的行
git gc # 执行垃圾回收,清理仓库
git fsck # 检查仓库完整性
2 rebase与merge的区别
在 Java 开发中,git merge
和 git rebase
是整合分支的两种核心操作,但它们的实现方式和适用场景有显著差异。以下是详细对比和使用场景分析:
1. 核心区别
特性 | git merge |
git rebase |
---|---|---|
提交历史 | 保留分支的拓扑结构,生成合并提交 | 重写提交历史,形成线性结构 |
冲突处理 | 一次性解决所有冲突 | 可能在每个提交中逐个解决冲突 |
历史记录清晰度 | 可能产生复杂的分叉历史 | 生成线性历史,更易追踪 |
适用分支 | 公共分支(如 main 、dev ) |
私有分支(如本地特性分支) |
风险 | 低(不修改历史) | 高(重写历史,需谨慎操作) |
2. 工作原理
git merge
-
操作方式 :合并两个分支的最新状态,生成一个新的 合并提交(Merge Commit)。
-
示例 :将
feature
分支合并到main
分支:bash
复制
git checkout main git merge feature
-
结果 :
main
分支的历史中会新增一个合并节点,明确记录分支的合并关系。
git rebase
-
操作方式 :将当前分支的提交"嫁接"到目标分支的最新提交之后,重写提交历史。
-
示例 :在
feature
分支上执行:bash
复制
git checkout feature git rebase main
-
结果 :
feature
分支的提交会基于main
分支的最新提交重新排列,形成线性历史。
3. 使用场景
适合 git merge
的场景
- 公共分支合并
- 例如将
feature
分支合并到main
或dev
分支时,保留合并记录有助于团队协作和历史追溯。 - Java 示例:多人协作开发时,合并不同开发者提交的模块代码。
- 例如将
- 需要明确分支关系
- 当分支的合并过程需要明确记录(如解决复杂冲突后的代码整合)。
- 避免历史重写风险
- 公共分支已推送到远程仓库时,禁止使用
rebase
,避免破坏他人工作。
- 公共分支已推送到远程仓库时,禁止使用
适合 git rebase
的场景
- 个人特性分支更新
- 在本地开发时,定期将
main
分支的更新同步到自己的feature
分支,保持线性提交。 - Java 示例 :开发新功能时,每天从
main
分支拉取最新代码,避免最终合并冲突。
- 在本地开发时,定期将
- 清理提交历史
- 合并多个临时提交为一个有意义的提交(结合
git rebase -i
),提高代码可读性。 - 示例:将多个 "WIP"(Work in Progress)提交整理为清晰的逻辑单元。
- 合并多个临时提交为一个有意义的提交(结合
- 准备 Pull Request
- 在向团队提交代码前,通过
rebase
确保代码基于最新主分支,简化评审过程。
- 在向团队提交代码前,通过
4. 最佳实践
- 公共分支用
merge
,私有分支用rebase
- 公共分支 (如
main
、dev
):始终使用merge
,保留完整历史。 - 私有分支 (如
feature/xxx
):开发过程中使用rebase
保持与主分支同步。
- 公共分支 (如
- 避免已推送分支的
rebase
- 如果分支已推送到远程仓库,强制推送(
git push -f
)会导致协作混乱。
- 如果分支已推送到远程仓库,强制推送(
- 结合
git pull --rebase
- 更新本地分支时使用
git pull --rebase
代替默认的merge
,避免冗余合并提交。
- 更新本地分支时使用
5. 操作流程图
plaintext
复制
# 典型工作流示例
1. 基于 main 创建特性分支:
git checkout -b feature/login
2. 开发过程中定期同步 main 分支:
git fetch origin
git rebase origin/main
3. 开发完成后整理提交历史:
git rebase -i HEAD~5 # 合并最近5个提交
4. 合并到 main 分支:
git checkout main
git merge feature/login
总结
git merge
:适合保留分支合并历史,协作友好,操作安全。git rebase
:适合优化提交历史,保持线性结构,但需谨慎处理已推送分支。
在 Java 项目中,合理选择两种操作可以显著提升代码库的可维护性。例如,在团队协作中频繁使用 merge
确保历史透明,而在个人开发周期内用 rebase
保持代码整洁。