git学习
Git
合并多次提交
idea checkou 某一分支,选中几条记录,git squash
reset和revert
revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。
–hard 丢弃本地记录
–mix 默认值,unstaged状态
–soft add的状态
log和reflog
git log 命令可以显示所有提交过的版本信息,可以加上参数 –pretty=oneline,只会显示版本号和提交时的备注信息
git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
恢复误删的提交
git reflog 找到id,再git reset id
git merge 和 git rebase
git-lfs
下载并安装 Git 命令行扩展。下载并安装后,通过运行以下命令为用户帐户设置 Git LFS:
1
git lfs install
每个用户帐户只需运行一次。
在要使用 Git LFS 的每个 Git 存储库中,选择要管理(或直接编辑 .gitattribute)的文件类型。您可以随时配置其他文件扩展名。
1
git lfs track "*.psd"
现在确保跟踪.gitattribute:
1
git add .gitattributes
请注意,定义 Git LFS 应跟踪的文件类型本身不会将任何预先存在的文件转换为 Git LFS,例如其他分支上的文件或以前的提交历史记录中的文件。为此,请使用 git lfs 迁移[1]命令,该命令具有一系列选项,旨在适应各种潜在用例。
没有第三步。只需像通常一样提交并推送到 GitHub。
1 | git add file.psd |
Gerrit
最近项目用到了代码审查工具Gerrit,push代码时报错(prohibited by Gerrit),只是以前push对应的远端格式是refs/……,现在应该改为refs/for/……,可以idea 安装gerrit插件方便使用。
Gerrit 是一个基于 Git 版本控制的基于 Web 的代码审查工具 。笔者在学习它的过程中发现,要使用好它,第一步就是要理解 Change-Id
理解 Change-Id
要理解 Gerrit 的 Change-Id,我们就必须对“一次代码审查任务”有一个定义。通常,我们认为对一次完整的功能实现或 Bug 修复(即一次完整的变更)进行代码审查是合理的。而对一个半成品进行代码审查,得到的结论是不可靠的。因此,一次代码审查任务意味着是对一次变更进行审查。
Gerrit 使用 Change-Id 来标识一次变更。Change-Id 实际上就是一串字符串,类似这样:Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b
但是,一次变更通常会伴随多次 Git 提交(Commit),而且每次提交的提交是不同的 Commit Id(提交Id)。Gerrit 如何将多次提交关联到同一个 Change-Id 呢?
我们需要在每次提交时,将 Change-Id 以规定的格式放在提交消息(Commit message)的Footer 部分中(最后一行)
Change-Id 为避免与提交 Id 冲突,通常以大写字母I
为前缀
生成 Change-Id
Change-Id 最好是自动生成,并放到提交消息指定位置,这样才能节约开发者的时间。Gerrit 提供了标准的“commit-msg”钩子来实现。
Git 提供了4个提交工作流钩子:pre-commit、prepare-commit-msg、commit-msg、post-commit。其中 commit-msg 钩子,会在我们执行 git commit
时被执行。
本质上,commit-msg 钩子是一段脚本程序,放在 .git/hooks 目录下。commit-msg 脚本可以使用 Shell、Ruby、Python 等语言实现。
Gerrit 的 commit-msg 钩子直接从 Gerrit 下载:
1 | ## 在项目目录下 |
接下来,在我们执行 git commit
后,再执行 git log 就可以看到 Change-Id 了。
请注意,第一次 clone 代码到本地时,需要重新安装一次 commit-msg 钩子。因为它并不会被提交到版本库中。
GitLab 也有类似的 Change-Id
在 GitLab 中,每个 Issue 都会有一个 Id。它是如何将 Issue Id 与 Commit Id 关联起来的呢?GitLab 的解决方案与 Gerrit 一样。只不过,GitLab 是在提交消息的第一行开始加入 Issue Id,格式如下:
1 | <project name>#<Issue Id>: <commit msg> |