引用( ref )是一个 SHA1 散列值,指向 Git 对象库中的对象。虽然一个引用可以指向任何 Git 对象,但是它通常指向提交对象。符号引用( symbolic reference ),或称为 symref ,间接指向 Git 对象。它仍然只是一个引用。
本地特性分支名称、远程跟踪分支名称和标签名都是引用。
每一个符号引用都有一个以 ref/开始的明确全称,并且都分层存储在版本库的 .git/refs/ 目录中。目录中基本上有三种不同的命名空间代表不同的引用: refs/heads/ref 代表本地分支, refs/remotes/ref 代表远程跟踪分支, refs/tags/ref 代表标签。
HEAD 始终指向当前分支的最近提交。当切换分支时, HEAD 会更新为指向新分支的最近提交。
某些操作,例如合并( merge )和复位( reset ),会把调整为新值之前的先前版本的 HEAD 记录到 ORIG_HEAD 中。可以使用 ORIG_HEAD 来恢复或回滚到之前的状态或者做一个比较。
当使用远程库时, git fetch 命令将所有抓取分支的头记录到.git/FETCH_HEAD 中。 FETCH_HEAD 是最近抓取( fetch )的分支 HEAD 的简写,并且仅在刚刚抓取操作之后才有效。使用这个符号引用,哪怕是一个对没有指定分支名的匿名抓取操作,都可以也在 git fetch 时找到提交的 HEAD 。
当一个合并操作正在进行时,其他分支的头暂时记录在 MERGE_HEAD 中。换言之, MERGE_HEAD 是正在合并进 HEAD 的提交。 所有这些符号引用都可以用底层命令 git symbolic-ref 进行管理。
再使用 commit 命令将参数传送到版本库,并赋予一个散列值以标识这次新提交。提交会将当前内容和描述用户和日志消息一起储存在新的提交上。
参数 | 缩写形式 | 可加前缀 | 含义 |
---|---|---|---|
--verbose | -v | ||
--dry-run | -r | ||
--force | -f | ||
--interactive | -i | 查看被修改或已删除的文件但没有提交的文件,通过 revert 子命令查看,同时进入一个子命令系统 | |
--path | -p | ||
--edit | -e | ||
--all | --no-all | 提交所有 | |
--ignore-removal | --no-ignore-removal | ||
--upodate | -u | 将所有跟踪的文件修改添加到索引库,不理会未跟踪的 | |
--intent-to-add | -N | ||
--refresh | |||
--ignore-errors | |||
--ignore-missing |
git add {提交的地址} # 可以是文件名或文件夹名, . 提交所有
git commit -m {本次提交的注释} # 提交暂存
git commit --message {本次提交的注释}
git commit -a -m {提交的注释} # 使用 -a 配置可省略 add 过程
在 Linux 系统中, commit 信息使用单引号 ' , Windows 系统, commit 信息使用双引号 " 。所以在 git bash 中 git commit -m '提交说明' 这样是可以的,在 Windows 命令行中就要使用双引号 git commit -m " 提交说明 " 。
有些撤销是不可逆的:
git commit --amend
该操作将取消未暂存的文件的修改(这会删除未保存的文件):
git checkout -- .
git restore --staged .
git reset --soft HEAD~1
使用 git reset 移除缓存区(使用 git add 提交的内容)的内容:
git reset HEAD {要剔除的文件名}
检测 diff 命令用于展示提交和工作树等之间的更改,也就是当前目录中当前文件和暂存区快照之间的差异:
git diff *** {文件名}
git diff {提交 id1} {提交 id2} # 比较两次提交的差异
git diff {分支名 1} {分支名 2} # 比较两次分支的差异
git diff --staged # 显示版本和缓存区不同
git diff --cached # 比较暂存区和版本库差异(已经 add ,没有 commit )
git diff --stat # 仅仅比较统计信息
git diff HEAD # 上次提交以来的更改
git push {远程主机名} {本地分支名}:{远程分支名} # git push origin newMain:newMain
指令的参数要求与 pull 命令相同,我们需要指定目标版本库的路径及其分支。
提交代码时要做到先拉后推
当 push 无参数时:
git push clone "" # 推送某一分支
git checkout "" # 提交检测,若指定的字符较少,可能会报错
git pull # 拉取代码
git merge tool # 冲突分析工具
git push clone "" # 推送另一分支
当省略本地分支名,即推送空的内容到远程指定分支,即删除分支:
git push origin :{待删除的远程分支}
如果存在追踪关系,则会有省略本地分支名及远程分支名:
git push
如果当前分支与多个分支存在追踪关系,则可使用 -u 指定一个默认主机:
git push -u origin newMain
不带参数的推送,默认只推送当前分支( simple ),另一种既是推送所有( matching )的分支。
git config --global push.default matching/simple # 切换默认设置
当然,也可以使用参数强制全部推送:
git push -all origin
默认下先拉后退比较好,但是也可以使用 --force 命令强制推送:
git push --force origin # 不建议这么用
默认情况下 git push 不会推送标签,使用 --tags 可推送标签:
git push origin --tags
git push origin HEAD # 推送到远端同名分支
git push -f origin {本地分支名}:{远程分支名}
git branch -av
推送标签
git push origin {标签名}
git push origin :{标签名}
使用 git commit --amend 可以将最近一次提交做某些修改。它是一个新的提交,但,又像是没有上次提交,即使用该命令提交后并没有增加提交的次数。