607 lines
15 KiB
Plaintext
607 lines
15 KiB
Plaintext
================================================================================
|
||
Gerrit Git 代码提交命令文档
|
||
================================================================================
|
||
|
||
文档名称:Gerrit Git 代码提交命令参考
|
||
创建日期:2025-12-15
|
||
适用版本:Gerrit 3.3.8
|
||
服务器地址:http://101.43.95.130:8080
|
||
|
||
================================================================================
|
||
一、初始配置
|
||
================================================================================
|
||
|
||
【配置 Git 用户信息】
|
||
|
||
# 全局配置
|
||
git config --global user.name "Your Name"
|
||
git config --global user.email "your_email@example.com"
|
||
|
||
# 项目级别配置
|
||
cd /path/to/project
|
||
git config user.name "Your Name"
|
||
git config user.email "your_email@example.com"
|
||
|
||
【配置 Gerrit 服务器】
|
||
|
||
# 配置 SSH 远程仓库
|
||
git remote add origin ssh://renjianbo@101.43.95.130:29418/project-name
|
||
|
||
# 或配置 HTTP 远程仓库(不推荐)
|
||
git remote add origin http://renjianbo@101.43.95.130:8080/project-name
|
||
|
||
【安装 commit-msg hook】
|
||
|
||
# 下载 commit-msg hook(自动添加 Change-Id)
|
||
cd /path/to/project
|
||
mkdir -p .git/hooks
|
||
curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg
|
||
chmod +x .git/hooks/commit-msg
|
||
|
||
================================================================================
|
||
二、克隆项目
|
||
================================================================================
|
||
|
||
【通过 SSH 克隆(推荐)】
|
||
|
||
git clone ssh://renjianbo@101.43.95.130:29418/project-name
|
||
cd project-name
|
||
|
||
【通过 HTTP 克隆】
|
||
|
||
git clone http://101.43.95.130:8080/project-name
|
||
cd project-name
|
||
|
||
# 首次克隆时,如果提示输入用户名,输入:renjianbo
|
||
# 密码留空(开发模式不需要密码)
|
||
|
||
================================================================================
|
||
三、基本提交流程
|
||
================================================================================
|
||
|
||
【步骤1:修改代码】
|
||
|
||
# 编辑文件
|
||
vim file.txt
|
||
# 或使用其他编辑器
|
||
|
||
【步骤2:查看修改】
|
||
|
||
# 查看工作区状态
|
||
git status
|
||
|
||
# 查看具体修改内容
|
||
git diff
|
||
|
||
# 查看已暂存的修改
|
||
git diff --cached
|
||
|
||
【步骤3:暂存修改】
|
||
|
||
# 暂存单个文件
|
||
git add file.txt
|
||
|
||
# 暂存所有修改
|
||
git add .
|
||
|
||
# 暂存所有修改(包括删除的文件)
|
||
git add -A
|
||
|
||
# 交互式暂存(选择性地暂存修改)
|
||
git add -i
|
||
|
||
【步骤4:提交代码】
|
||
|
||
# 提交修改(commit-msg hook 会自动添加 Change-Id)
|
||
git commit -m "Your commit message"
|
||
|
||
# 提交并添加详细描述
|
||
git commit -m "Short summary" -m "Detailed description"
|
||
|
||
# 提交时直接编辑提交信息
|
||
git commit
|
||
|
||
【步骤5:推送到 Gerrit 进行评审】
|
||
|
||
# 推送到评审队列(关键:推送到 refs/for/master)
|
||
git push origin HEAD:refs/for/master
|
||
|
||
# 推送到其他分支的评审队列
|
||
git push origin HEAD:refs/for/develop
|
||
|
||
# 推送到指定分支的评审队列
|
||
git push origin HEAD:refs/for/branch-name
|
||
|
||
================================================================================
|
||
四、修改已提交的代码
|
||
================================================================================
|
||
|
||
【修改最后一次提交】
|
||
|
||
# 修改提交信息(不改变代码)
|
||
git commit --amend
|
||
|
||
# 修改提交信息(使用编辑器)
|
||
git commit --amend -m "New commit message"
|
||
|
||
# 添加文件到最后一次提交
|
||
git add forgotten-file.txt
|
||
git commit --amend --no-edit
|
||
|
||
# 修改提交信息但保持 Change-Id 不变
|
||
git commit --amend --no-edit
|
||
|
||
【修改之前的提交】
|
||
|
||
# 交互式 rebase(修改历史提交)
|
||
git rebase -i HEAD~3 # 修改最近 3 次提交
|
||
|
||
# 在交互式界面中,将要修改的提交标记为 "edit"
|
||
# 然后修改代码,使用:
|
||
git add .
|
||
git commit --amend --no-edit
|
||
git rebase --continue
|
||
|
||
【重新推送修改后的提交】
|
||
|
||
# 修改提交后,重新推送到 Gerrit
|
||
git push origin HEAD:refs/for/master
|
||
|
||
# 如果提示需要 force push,使用:
|
||
git push origin HEAD:refs/for/master --force
|
||
|
||
================================================================================
|
||
五、分支操作
|
||
================================================================================
|
||
|
||
【创建新分支】
|
||
|
||
# 基于当前分支创建新分支
|
||
git checkout -b feature/new-feature
|
||
|
||
# 基于指定分支创建新分支
|
||
git checkout -b feature/new-feature origin/master
|
||
|
||
# 基于指定提交创建新分支
|
||
git checkout -b feature/new-feature <commit-hash>
|
||
|
||
【切换分支】
|
||
|
||
# 切换到已存在的分支
|
||
git checkout branch-name
|
||
|
||
# 切换到 master 分支
|
||
git checkout master
|
||
|
||
【查看分支】
|
||
|
||
# 查看本地分支
|
||
git branch
|
||
|
||
# 查看所有分支(包括远程)
|
||
git branch -a
|
||
|
||
# 查看远程分支
|
||
git branch -r
|
||
|
||
【删除分支】
|
||
|
||
# 删除本地分支
|
||
git branch -d branch-name
|
||
|
||
# 强制删除本地分支
|
||
git branch -D branch-name
|
||
|
||
【推送分支到 Gerrit】
|
||
|
||
# 推送新分支
|
||
git push origin branch-name:refs/for/branch-name
|
||
|
||
# 推送并设置上游分支
|
||
git push -u origin branch-name:refs/for/branch-name
|
||
|
||
================================================================================
|
||
六、查看和比较
|
||
================================================================================
|
||
|
||
【查看提交历史】
|
||
|
||
# 查看提交历史
|
||
git log
|
||
|
||
# 查看简洁的提交历史
|
||
git log --oneline
|
||
|
||
# 查看图形化的提交历史
|
||
git log --graph --oneline --all
|
||
|
||
# 查看最近 N 次提交
|
||
git log -n 5
|
||
|
||
# 查看指定文件的提交历史
|
||
git log file.txt
|
||
|
||
# 查看提交的详细修改
|
||
git log -p
|
||
|
||
【查看差异】
|
||
|
||
# 查看工作区和暂存区的差异
|
||
git diff
|
||
|
||
# 查看暂存区和最后一次提交的差异
|
||
git diff --cached
|
||
|
||
# 查看工作区和最后一次提交的差异
|
||
git diff HEAD
|
||
|
||
# 查看两次提交之间的差异
|
||
git diff commit1 commit2
|
||
|
||
# 查看两个分支之间的差异
|
||
git diff branch1 branch2
|
||
|
||
【查看文件状态】
|
||
|
||
# 查看工作区状态
|
||
git status
|
||
|
||
# 查看简洁的状态
|
||
git status -s
|
||
|
||
# 查看详细的文件状态
|
||
git status -v
|
||
|
||
================================================================================
|
||
七、撤销操作
|
||
================================================================================
|
||
|
||
【撤销工作区修改】
|
||
|
||
# 撤销单个文件的修改
|
||
git checkout -- file.txt
|
||
|
||
# 撤销所有文件的修改(危险!)
|
||
git checkout -- .
|
||
|
||
# 使用 restore 命令(Git 2.23+)
|
||
git restore file.txt
|
||
git restore .
|
||
|
||
【撤销暂存区的修改】
|
||
|
||
# 取消暂存单个文件
|
||
git reset HEAD file.txt
|
||
|
||
# 取消暂存所有文件
|
||
git reset HEAD
|
||
|
||
# 使用 restore 命令(Git 2.23+)
|
||
git restore --staged file.txt
|
||
git restore --staged .
|
||
|
||
【撤销提交】
|
||
|
||
# 撤销最后一次提交,保留修改在暂存区
|
||
git reset --soft HEAD~1
|
||
|
||
# 撤销最后一次提交,保留修改在工作区
|
||
git reset --mixed HEAD~1
|
||
# 或
|
||
git reset HEAD~1
|
||
|
||
# 撤销最后一次提交,完全删除修改(危险!)
|
||
git reset --hard HEAD~1
|
||
|
||
================================================================================
|
||
八、Gerrit 特定操作
|
||
================================================================================
|
||
|
||
【推送代码评审】
|
||
|
||
# 推送到 master 分支的评审队列
|
||
git push origin HEAD:refs/for/master
|
||
|
||
# 推送到 develop 分支的评审队列
|
||
git push origin HEAD:refs/for/develop
|
||
|
||
# 推送时添加主题(Topic)
|
||
git push origin HEAD:refs/for/master%topic=feature-name
|
||
|
||
# 推送时添加评审者
|
||
git push origin HEAD:refs/for/master%r=reviewer@example.com
|
||
|
||
# 推送时添加多个评审者
|
||
git push origin HEAD:refs/for/master%r=reviewer1@example.com,r=reviewer2@example.com
|
||
|
||
# 推送时标记为 Work In Progress(WIP)
|
||
git push origin HEAD:refs/for/master%wip
|
||
|
||
# 推送时标记为私有(只有评审者可见)
|
||
git push origin HEAD:refs/for/master%private
|
||
|
||
【直接推送(跳过评审,不推荐)】
|
||
|
||
# 直接推送到 master 分支(绕过评审)
|
||
git push origin HEAD:refs/heads/master
|
||
|
||
# 直接推送到其他分支
|
||
git push origin HEAD:refs/heads/branch-name
|
||
|
||
【查看 Gerrit 变更】
|
||
|
||
# 查看变更列表(需要安装 gerrit 工具)
|
||
ssh -p 29418 renjianbo@101.43.95.130 gerrit query status:open
|
||
|
||
# 查看特定变更
|
||
ssh -p 29418 renjianbo@101.43.95.130 gerrit query change:1
|
||
|
||
# 查看我的变更
|
||
ssh -p 29418 renjianbo@101.43.95.130 gerrit query owner:renjianbo
|
||
|
||
【下载变更到本地】
|
||
|
||
# 下载变更到本地(cherry-pick)
|
||
git fetch ssh://renjianbo@101.43.95.130:29418/project-name refs/changes/01/1/1
|
||
git cherry-pick FETCH_HEAD
|
||
|
||
# 或使用 checkout
|
||
git fetch ssh://renjianbo@101.43.95.130:29418/project-name refs/changes/01/1/1
|
||
git checkout FETCH_HEAD
|
||
|
||
================================================================================
|
||
九、合并后的操作
|
||
================================================================================
|
||
|
||
【更新本地仓库】
|
||
|
||
# 切换到 master 分支
|
||
git checkout master
|
||
|
||
# 拉取最新代码
|
||
git pull origin master
|
||
|
||
# 或使用 fetch + merge
|
||
git fetch origin
|
||
git merge origin/master
|
||
|
||
【清理已合并的分支】
|
||
|
||
# 删除已合并的本地分支
|
||
git branch -d feature-branch
|
||
|
||
# 强制删除分支(即使未合并)
|
||
git branch -D feature-branch
|
||
|
||
# 删除远程分支的引用
|
||
git remote prune origin
|
||
|
||
【同步远程分支】
|
||
|
||
# 获取所有远程分支信息
|
||
git fetch origin
|
||
|
||
# 查看远程分支
|
||
git branch -r
|
||
|
||
# 创建本地分支跟踪远程分支
|
||
git checkout -b local-branch origin/remote-branch
|
||
|
||
================================================================================
|
||
十、常用工作流程
|
||
================================================================================
|
||
|
||
【工作流程1:创建新功能】
|
||
|
||
# 1. 更新主分支
|
||
git checkout master
|
||
git pull origin master
|
||
|
||
# 2. 创建功能分支
|
||
git checkout -b feature/new-feature
|
||
|
||
# 3. 开发代码
|
||
# ... 修改代码 ...
|
||
|
||
# 4. 提交代码
|
||
git add .
|
||
git commit -m "Add new feature"
|
||
|
||
# 5. 推送到 Gerrit 评审
|
||
git push origin HEAD:refs/for/master
|
||
|
||
# 6. 在 Gerrit Web 界面进行评审
|
||
|
||
# 7. 合并后,更新本地仓库
|
||
git checkout master
|
||
git pull origin master
|
||
git branch -d feature/new-feature
|
||
|
||
【工作流程2:修复 Bug】
|
||
|
||
# 1. 从 master 创建修复分支
|
||
git checkout master
|
||
git pull origin master
|
||
git checkout -b bugfix/fix-issue-123
|
||
|
||
# 2. 修复代码
|
||
# ... 修复代码 ...
|
||
|
||
# 3. 提交修复
|
||
git add .
|
||
git commit -m "Fix issue #123"
|
||
|
||
# 4. 推送到 Gerrit 评审
|
||
git push origin HEAD:refs/for/master
|
||
|
||
【工作流程3:修改已提交的代码】
|
||
|
||
# 1. 修改代码
|
||
# ... 修改代码 ...
|
||
|
||
# 2. 添加到最后一次提交
|
||
git add .
|
||
git commit --amend --no-edit
|
||
|
||
# 3. 重新推送(会自动更新原变更)
|
||
git push origin HEAD:refs/for/master
|
||
|
||
【工作流程4:处理评审意见】
|
||
|
||
# 1. 查看评审意见(在 Gerrit Web 界面)
|
||
|
||
# 2. 修改代码
|
||
# ... 根据意见修改代码 ...
|
||
|
||
# 3. 修改提交
|
||
git add .
|
||
git commit --amend --no-edit
|
||
|
||
# 4. 重新推送
|
||
git push origin HEAD:refs/for/master
|
||
|
||
================================================================================
|
||
十一、高级操作
|
||
================================================================================
|
||
|
||
【Stash 操作(暂存修改)】
|
||
|
||
# 暂存当前修改
|
||
git stash
|
||
|
||
# 暂存并添加描述
|
||
git stash save "Work in progress"
|
||
|
||
# 查看暂存列表
|
||
git stash list
|
||
|
||
# 恢复暂存(保留暂存记录)
|
||
git stash apply
|
||
|
||
# 恢复暂存(删除暂存记录)
|
||
git stash pop
|
||
|
||
# 删除暂存
|
||
git stash drop
|
||
|
||
# 清空所有暂存
|
||
git stash clear
|
||
|
||
【Rebase 操作】
|
||
|
||
# 将当前分支 rebase 到 master
|
||
git checkout feature-branch
|
||
git rebase master
|
||
|
||
# 交互式 rebase(修改最近 3 次提交)
|
||
git rebase -i HEAD~3
|
||
|
||
# 中止 rebase
|
||
git rebase --abort
|
||
|
||
# 继续 rebase
|
||
git rebase --continue
|
||
|
||
【Cherry-pick 操作】
|
||
|
||
# 选择性地应用某个提交
|
||
git cherry-pick <commit-hash>
|
||
|
||
# 选择性地应用多个提交
|
||
git cherry-pick <commit1> <commit2>
|
||
|
||
# 选择性地应用提交范围
|
||
git cherry-pick <commit1>..<commit2>
|
||
|
||
================================================================================
|
||
十二、配置 SSH(避免每次输入长命令)
|
||
================================================================================
|
||
|
||
【创建 SSH 配置文件】
|
||
|
||
# 创建配置文件
|
||
mkdir -p ~/.ssh
|
||
cat > ~/.ssh/config << 'EOF'
|
||
Host 101.43.95.130
|
||
Port 29418
|
||
PubkeyAcceptedKeyTypes +ssh-rsa
|
||
PubkeyAcceptedAlgorithms +ssh-rsa
|
||
EOF
|
||
|
||
# 设置权限
|
||
chmod 600 ~/.ssh/config
|
||
|
||
【配置后可以直接使用】
|
||
|
||
# 配置后,可以直接使用简短的命令
|
||
git push origin HEAD:refs/for/master
|
||
|
||
# 不需要每次都输入:
|
||
# GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa ..." git push ...
|
||
|
||
================================================================================
|
||
十三、常用命令速查表
|
||
================================================================================
|
||
|
||
【日常开发】
|
||
|
||
git status # 查看状态
|
||
git add . # 暂存所有修改
|
||
git commit -m "message" # 提交代码
|
||
git push origin HEAD:refs/for/master # 推送到 Gerrit
|
||
|
||
【查看信息】
|
||
|
||
git log --oneline # 查看提交历史
|
||
git diff # 查看修改
|
||
git branch # 查看分支
|
||
|
||
【分支操作】
|
||
|
||
git checkout -b branch-name # 创建并切换分支
|
||
git checkout branch-name # 切换分支
|
||
git branch -d branch-name # 删除分支
|
||
|
||
【撤销操作】
|
||
|
||
git checkout -- file.txt # 撤销文件修改
|
||
git reset HEAD file.txt # 取消暂存
|
||
git commit --amend # 修改最后一次提交
|
||
|
||
【Gerrit 特定】
|
||
|
||
git push origin HEAD:refs/for/master # 推送评审
|
||
git push origin HEAD:refs/for/master%wip # 推送为 WIP
|
||
git commit --amend --no-edit # 修改提交(保持 Change-Id)
|
||
|
||
================================================================================
|
||
十四、重要提示
|
||
================================================================================
|
||
|
||
1. 推送到 Gerrit 必须使用 refs/for/ 前缀,例如:
|
||
git push origin HEAD:refs/for/master
|
||
|
||
不要直接推送到 refs/heads/master(会绕过评审)
|
||
|
||
2. 每次提交都会自动包含 Change-Id(如果安装了 commit-msg hook)
|
||
|
||
3. 修改提交后重新推送,会自动更新原变更,不会创建新变更
|
||
|
||
4. 推送成功后,Gerrit 会返回变更 URL,例如:
|
||
remote: http://101.43.95.130:8080/c/project/+/1 [NEW]
|
||
|
||
5. 在 Gerrit Web 界面进行代码评审,不要直接合并到主分支
|
||
|
||
6. 合并后,记得更新本地仓库:
|
||
git checkout master
|
||
git pull origin master
|
||
|
||
7. 如果遇到问题,查看 Gerrit 日志:
|
||
cd /home/renjianbo/gerrit_install/review_site
|
||
tail -f logs/httpd_log
|
||
|
||
================================================================================
|
||
文档结束
|
||
================================================================================
|
||
|