git 命令进阶

631 阅读6分钟

git reflog【查看记录】

可以查看所有的操作记录 commit_id,包括使用 git reset —hard 回退版本的记录索引; 可以使用 git reset --hard commit_id 版本回退恢复 git resetgit rebase 误操作问题。

git diff【文件差异】

  • 工作目录:已跟踪的文件目录

  • 暂存区: git add -a 命令后修改文件保存的存储区

  • 如果命令后面没有指定相应的目录或文件名 filename,则会比较所有文件之间的差异,如果是目录则比较整个目录文件之间的差异,是文件的话只比价对应文件之间的差异

工作目录 vs 暂存区

git diff <filename>

说明

  1. 如果暂存区有添加文件,则比较 工作目录暂存区 中的差异
  2. 如果暂存区没有添加文件,则比较 工作目录 与最新 commit 之间的差异

暂存区 vs git 仓库

git diff --cached <commit> <filename>

说明

比较 暂存区 与 仓库 commit 之间的差异,没有指定 commit 则与最近一次 commit 提及内容进行比较

工作目录 vs git 仓库

git diff <commit> <filename>

说明

比较 工作目录 与 仓库 commit 之间的差异,没有指定 commit 则与最近一次 commit 提及内容进行比较

git 仓库 vs git 仓库

git diff <commit1> <commit2>

说明

比较仓库 commit1commit2 之间的差异,没有指定 commit 则与最近一次 commit 提及内容进行比较, 可以为不同分支 commit 之间比较

git stash【暂存操作】

暂时保存没有提交的内容到 git 栈中; 类似于一个中间存储空间,运行该命令后,所有没有 commit 的代码,都会从工作区移入 git 栈中进行存储,之后我们可以进行其他 git pullgit checkout 等命令操作

没有添加 stash@{id} 存储记录索引 id ,默认是对 stash@{0} 操作,即栈顶存储的记录

git stash <option> <stash@{id}>
-- option:
   list		列出所有暂时保存在 git 栈中的 stash@{id} 记录
   clear	清空 git 栈中的内容
   drop		删除 git 栈中 stash@{id} 内容

   apply	恢复 stash@{id} 暂时保存的内容
   pop		恢复 stash@{id} 暂时保存的内容
   
   show		查看 stash@{id} 变化的文件的差异

查看 stash@{id} 变化文件的详细 diff 内容

git stash show -p

git stash popgit stash apply之间的区别

git stash pop	记录和存储的内容均会出栈
git stash apply	类似将内容复制一份出栈,记录及内容中仍然保留

git reset【版本回退】

git reset <option> <commit>
--soft	本地移动HEAD指针【回退到暂存区状态】
--mixed	本地移动HEAD指针,重置暂存区【未添加到缓存区的状态】
--hard	本地移动HEAD指针,重置暂存区,重置工作区【回退提交版本】

--merge--hard 类似,但会保留当前未添加至暂存区中的文件修改

--keep--hard 类似,同一分支文件修改后回退版本时会提示存在修改文件,无法回退版本;其它分支进行版本回退时,当前分支修改内容会添加至 git 栈中【git stash】

git revert【撤销操作】

git revert 撤销某次 commit 操作,但该次撤销操作会作为一条 commit 记录进行提交

git revert <commit>
git revert HEAD			撤销前一次 commit
git revert HEAD^		撤销前前一次 commit【这里会有类似于代码合并的冲突选择】
git revert commit_id		撤销指定的版本,撤销也会作为一次提交进行保存

git revert merge_commit_id -m n 撤销 merge 中的第 n 次提交

git revert commit_id -m 1 回退 merge 提交 commit_id 中的第 1commit

git revert commit_id -m 2 回退 merge 提交 commit_id 中的第 2commit

git remote【远程仓库】

获取远程仓库并管理克隆远程仓库时为其添加的主机名, 通过 git clone [远程仓库地址] 克隆远程仓库到本地未指定主机名时,git 会为克隆的远程设置一个默认主机名为 origin, 主机名就类似与远程仓库地址的一个别名

克隆时自定义远程仓库主机名

git clone -o <主机名> <远程仓库地址>

查看主机名及对应远程仓库地址

-v 参数, 没添加参数只查看主机名,添加参数还可以查看主机名对应的远程仓库地址

git remote -v

查看某主机的详细信息

git remote show <主机名>

添加远程主机

git remote add <主机名> <远程仓库地址>

重新命名主机名

git remote rename <旧主机名> <新主机名>

删除远程主机

git remote rm | remove <主机名>

拓展

将另一仓库 repo_b 某个分支到某次 commit 提交合并到当前仓库 repo_a 某个分支中

  1. 添加主机名 在本地 repo_a 仓库添加 repo_b 远程仓库主机名,注意不要和 repo_a 主机名冲突
git remote add <主机名> <远程仓库地址>
  1. 拉取代码信息
  • 拉取 repo_b 仓库中有但你没有的信息
git fetch <repo_b主机名>
  • 拉取主机名对应远程仓库到某个分支代码信息到本地
git fetch <主机名> <分支名>
  1. 代码合并 在本地就可以在任意分支使用 git cherry-pick 合并 repo_b 任意分支到任意 commit

合并代码 git rebase 基本用法

git tag【标签管理】

git tag		                      查看所有标签
git show name		              查看标签信息(文件 diff、标签附注信息等)
git tag name			      创建标签 name
git tag -a name -m "提交信息的提示语"    创建标签 name 并添加附注信息
git tag -d name			      删除本地 name 标签
git push origin :refs/tags/name	      删除远程 name 标签
git push --tag			      推送所有标签到远程仓库
git fetch tag name		      拉取远程 name 标签代码

给某次 commit 提交打 tag 标签

  1. 切换到该次 commit 提交
git checkout commit_hash
  1. 给该 commit 提交打 tag 标签
git tag v1.0.1
  1. 将本地 tag 标签提交到远程仓库
git push origin v1.0.1

删除远程分支或本地分支

  1. 删除远程分支
git push origin[远程主机名] --delete 远程分支名
  1. 删除本地分支 切到主分支 master
git checkout master

删除本地其他分支

git branch -d 本地分支名

删除远程仓库的跟踪的文件

预览将要删除的文件

git rm -r -n --cached 文件/文件名

删除对应文件并解除文件跟踪

git rm -r --cached 文件/文件名
git commit -m ‘提交说明’
git push origin master

Git推送错误:没有足够的权限将对象添加到存储库数据库?

权限不足,无法在仓库对象库 .git/objects 中添加对象

解决方法: 进入 .git/objects 文件

cd .git/objects

通过 ls -al 命令的大部分输出的权限来确定您的名称和组

ls -al

使用 chown 更改对应组内名称的权限

sudo chown -R yourname:yourgroup *