beizhu
type
Post
status
Published
date
Mar 14, 2024
slug
summary
Git常用命令包括用户配置、基本操作(如clone、commit、push)、分支管理、合并、标签、子模块等,适用于日常开发和版本控制需求。新命令如git switch和git restore提高了操作的安全性和直观性。
tags
git
category
git
icon
password
基本常用命令
第一次使用 git 的时候,需要设置用户信息和用户邮箱,用于辨识提交者身份。
基本操作
"commit message" 内容尽量规范!
- 当某一次提交后,突然想起漏提交了文件,或不小心提交了不满意的代码时,可以使用
git commit --amend -m "message"指令。它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中。提交之后 message 也将被本次的 message 覆盖,所以还需要再次添加上次的 message。
push
把当前 master分支推送到远程库; -u 表示记住分支和地址,下次使用 git push 即可。
remote
clone
pull
从远程仓库拉下来到本地库然后合并相当于 git fetch + git merge,pull 时,Git 默认会把合并也提交到远端,需设置关闭。
- 一般
push前先拉去最新版本,避免代码冲突,如果有冲突需要解决了冲突才能提交。
fetch
fetch 是从远程库到本地库,但是未在工作区,需要 git merge。
merge
分支合并也是在本地完成,新的分支只有在合并后才允许被删除。
- 如果分支合并是出现冲突需要解决了冲突才能合并,使用
git status查看冲突文件。
branch/checkout
!>
git checkout -- file 相当于取消对文档的修改,将最新的本地版本库的本文件复制覆盖它,比较危险!reflog/log
?> 想看到自己的操作记录,则可以使用
log 与 reflog,它两个的区别如下。git log命令可以显示所有提交过的版本信息。- 如果感觉太繁琐,可以加上参数
-pretty=oneline,只会显示版本号和提交时的备注信息。
git reflog可以查看所有分支的所有操作记录,包括已经被删除的 commit 记录和 reset 的操作。- 常用语错误/危险操作恢复、回退。
reset
- 版本回退的操作一般是先查看历史提交版本的 commit id,使用
git reflog。
- 接着使用命令
git reset --hard commit_id回退版本
- 最后
git push -f (origin master可写可不写)提交远程库,前提非protect分支。
- 版本退回是从本地仓库到暂存区,如果已经提交远程库,此时的版本是低于最新的版本的会拒绝提交,
- 所以需要用
git push -f origin master强制提交。
status
查看你的文件在暂存区和工作目录的状态,默认是较为详细的显示,并提示你可以用何种命令完成你接下来可能要做的事情。
- 较为简单的输出当前的状态,如:
你可以看到,在简短输出中,有两栏。第一栏是暂存区的,第二栏则是工作目录的。这里表示:
README.md在暂存区中的状态是modify
hello.rd在工作目录中的状态是delete
world.java还未添加到版本控制。
diff
rm/mv
git rm 用来删除文件、目录。git mv 命令用于移动或重命名一个文件、目录。
- 比如删除
photos文件,本地删除后,远程仓库还会有,所以执行如下操作:
submodule
添加子模组
修改/删除子模组
- 如果远程库子模组有更新,你要更新本地库子模组应该在 git pull 之后运行。
如果要更新子模组,子模组和父版本库要分别提交,注意:子模组进行更新后,父版本库需要添加这个更新再推送,即 git add。
- 当一个远程库有子模组时,直接 clone 子模组只是一个空文件夹,需要进入子模组的空文件夹
init和update才行。
- 或者使用递归克隆
git clone --recursive 远程库
- 子模组更新后,父模组必须更新,因为需要更新 commit id。
tag
基本命令
我们可以用特定的搜索模式列出符合条件的标签。在 Git 自身项目仓库中,有着超过 240 个标签,如果你只对 1.3 系列的版本感兴趣,可以运行下面的命令:
- 当你执行
git tag -a命令时,Git会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
- 如果我们忘了给某个提交打标签,又将它发布了,我们可以给它追加标签。
- 例如,假设我们发布了提交
85fc7e7(最后一行),但是那时候忘了给它打标签。 我们现在也可以。
同步远程-本地Tag
推送标签
默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可。
- 如果要一次推送所有本地新增的标签上去,可以使用
-tags选项;然后,其他人克隆共享仓库或拉取数据同步后,也会看到这些标签。
stash
gitk
git switch:安全切换分支
git switch 命令是在 Git 2.23.0 版本中引入的,以解决 git checkout 命令职责过重的问题,并使得 Git 的命令更加直观和易于理解。在 Git 2.23 之前,
git checkout 既用于切换分支,也用于还原文件内容,很容易引起混淆。通过将 git checkout 的功能拆分,Git 团队创建了两个新的、更专业的命令:git switch:专门用于在分支之间进行切换。
git restore:专门用于还原文件内容。
使用
git switch 切换分支非常简单,以下是基本用法:注意:如果遇到错误信息 'switch' is not a git command,那么可能是因为 Git 版本低于 2.23.0。可以通过运行 git --version 来检查 Git 版本,并升级到最新版本以使用这些新特性。
git restore:安全撤销更改
git restore 命令同样是在 Git 2.23.0 版本中引入的,专门用于恢复工作目录中的文件内容。git restore 主要用来撤销工作目录中的更改,可以用来丢弃未提交的工作树修改、还原删除的文件,或者将文件重置为之前的某个提交状态。以下是 git restore 的基本用法:使用
git restore 时,可以选择性地指定 --staged 来影响暂存区,或者 --worktree 来影响工作目录。如果同时指定了这两个选项,则会同时影响暂存区和工作目录。git restore 是一个相对安全的操作,因为它不会改变分支的历史记录,它只会影响工作目录和/或暂存区。git worktree:同时在多个分支工作
git worktree 命令是在 Git 2.5 版本中引入的,它允许在同一个仓库中创建多个工作目录(worktrees),每个工作目录可以检出不同的分支或提交。这为开发者提供了同时处理多个任务的能力,比如在不同的分支上进行开发、测试,而不需要来回切换分支。以下是
git worktree 的基本用法:例如,如果想要添加一个新的工作目录来检出名为
feature-branch 的分支,可以这样做:这将在
../my-feature-worktree 目录下创建一个新的工作目录,并检出 feature-branch 分支。git sparse-checkout:高效处理大型仓库
git sparse-checkout 是在 Git 2.25.0 版本中引入的,个功能是对之前存在的稀疏检出机制的一个重大改进。通过 git sparse-checkout,开发者可以更高效地克隆大型仓库,只检出部分文件或目录,而不是整个项目。要启用
sparse-checkout,首先需要设置仓库以使用稀疏检出模式:例如,如果只想检出
src 目录及其子目录中的文件,可以这样做:如果想添加多个模式或路径,可以在
set 命令后列出所有路径,或者分多次调用该命令。除了
set 命令,还可以使用 add 和 list 来管理稀疏检出模式:如果不再需要稀疏检出模式,可以通过以下命令禁用它,并恢复完整的检出状态:
git range-diff:比较提交范围之间的更改
git range-diff 是在 Git 2.19.0 版本中引入的,用于比较两个提交范围之间的差异。它可以帮助开发者理解在一次变基(rebase)、合并(merge)或历史改写操作后,一系列提交发生了哪些变化。git range-diff 的基本用法如下:这里的
A..B 和 C..D 分别表示两个不同的提交范围。例如,如果想比较 feature 分支在变基前后的差异,可以这样做:git range-diff 会输出每个提交的摘要信息,包括提交消息、作者、日期等,并高亮显示两个范围内的提交之间的差异。如果提交的内容完全相同,它将只显示提交消息并指出它们是相同的;如果有差异,则会详细列出差异之处。git maintenance:自动化仓库健康
git maintenance是在 Git 2.30.0 版本中引入的,用于管理和自动化各种维护任务的命令。这个命令旨在简化和优化仓库的维护工作,通过提供一组预定义的任务来帮助保持仓库的健康状态和高效性能。git maintenance 提供了几种子命令来管理不同的维护任务:- 启用和禁用自动维护:
- 执行一次性维护任务:手动触发一次性的维护任务,这对于在特定时间点(如大型提交之后)优化仓库非常有用。
常见的维护任务包括:
gc:运行完整的垃圾收集,包括压缩对象数据库。
commit-graph:构建或更新提交图文件以加速提交历史查询。
loose-objects:清理松散对象并将其打包。
incremental-repack:逐步重新打包对象以优化存储。
prefetch:预先获取远程分支的新数据,以加速未来的克隆和拉取操作。
- 配置自动维护计划:可以通过配置文件设置哪些任务应该被定期执行以及它们的执行频率。例如,在
.git/config文件中添加如下内容:
然后启用这些计划:
git log --remerge-diff:更好地理解合并
从 Git 2.35 版本开始,可以使用
git log --remerge-diff 命令来更好地理解合并提交。通常情况下,合并提交会显示哪些分支被合并了,但并不总是能清晰地解释合并过程中引入的具体更改,特别是在解决合并冲突时所做的改动。git log --remerge-diff 通过重播记录的合并策略来重建合并提交,并展示该合并引入的确切更改。这对于调试合并冲突或审查复杂的合并历史非常有用。其他
- 特殊问题处理
?> 在克隆远程库曾出现问题:没有弹出输入框验证框,直接就提示认证失败。
解决办法:使用 Git 输入下面两条命令(需要管理员权限)
?> 在提交上传远程库曾出现问题:git push 提交到远程仓库时,git 会卡住等半天都没反应,只能按 Ctrl+C 退出。
解决办法:使用 Git 输入以下面的命令
输入下面的命令可以查看仓库配置,看到 sendpack.sideband 等于 false 就可以重新 push 了。
托管网站
?> 托管网站解释
- 一个组织可以有 0-N 个用户,一个用户默认为一个组织,可以加入多个组织。一个组织有 0-N 个仓库,一个仓库中有 0-N 个代码文件。
- 工单可以反馈问题情况等,里程碑是开发者建立(要在某个时间之前完成什么功能)。
- 提交(Commit)可以与工单关联,工单(Issue)可以与里程碑关联。
- 版本发布是发布重要的版本
- 百科是开发者编写关于这个项目的一些内容
- 动态可以看到仓库的变动信息
- fork 相当于克隆仓库 后续不会改变。镜像仓库可以随父仓库更新,主要用于国外网站,创建一个国内的镜像来加快响应速度。
?> 托管网站/平台 issue 相关常见标签
bug描述的问题是一个 bug
enhancement功能增强,没有 feature 也可以指 New feature or request。
feature新功能
duplicate问题重复
invalid可用的,不是 bug。
question疑问,需要进一步的信息。
wontfix不会修复此问题
help-wanted需要帮助
good first issueGood for newcomers
?> 托管网站/平台 issue 相关内部流程-理想化
- 收到产品需求后建立 issue
- 管理员评估 issue 并分配标签,指派负责人。
- 负责人检查已指派的 issue,选择项目发布 tag 以及建立里程碑(Milestone)。
- 负责人开发并推送代码,commit 信息开头或末尾附带 issue 编号,比如:
Feat: [#1] 提交代码信息/Feat: 提交代码信息 [#1]。
- 也可以后续对接其他平台,使用托管网站 api 即可。
- 这样就可以通过一个平台了解工作进度与开发发布任务
