git高层命令(一)

136 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、提交

1、git commit

常规使用

git commit -m "提交说明"	// 提交暂存区到仓库区
git commit --amend -m [提交说明]  // 使用一次新的commit,替代上一次提交。
// 如果代码没有任何新变化,则用来改写上一次commit的提交信息

其他

  • git commit [file1] [file2] ... -m [message] 提交暂存区的指定文件到仓库区
  • git commit -a 提交工作区自上次commit之后的变化,直接到仓库区
  • git commit -v 提交时显示所有diff信息
  • git commit --amend -m [message] 使用一次新的commit,替代上一次提交。如果代码没有任何新变化,则用来改写上一次commit的提交信息
  • git commit --amend [file1] [file2] .. 重做上一次commit,并包括指定文件的新变化

说明

Git 仓库中的提交记录保存的是你的目录下所有文件的快照。

二、分支

1、git branch

常规使用

git branch [新分支名]	// 新建一个分支,但依然停留在当前分支

其他

  • git branch 列出所有本地分支
  • git branch -r 列出所有远程分支
  • git branch -a 列出所有本地分支和远程分支
  • git branch [branch-name] 新建一个分支,但依然停留在当前分支
  • git branch [branch] [commit] 新建一个分支,指向指定commit
  • git branch --track [branch] [remote-branch] 新建一个分支,与指定的远程分支建立追踪关系
  • git branch --set-upstream [branch] [remote-branch] 建立追踪关系,在现有分支与指定的远程分支之间
  • git branch -d [branch-name] 删除分支
  • git branch -dr [remote/branch] 删除远程分支

说明

Git 的分支非常轻量,它们只是简单地指向某个提交纪录。所以创建再多的分支也不会造成储存或内存上的开销,并且按逻辑分解工作到不同的分支要比维护那些特别臃肿的分支简单多了。使用分支其实就相当于在说:“我想基于这个提交以及它所有的父提交进行新的工作。”

2、git checkout

常规使用

git checkout <branch-name>  // 切换分支,切换后的提交才在该分支上
git checkout -b <your-branch-name>  // 创建一个新的分支同时切换到新创建的分支

其他

  • git checkout [branch-name] 切换到指定分支,并更新工作区
  • git checkout -b [branch] 新建一个分支,并切换到该分支
  • git checkout - 切换到上一个分支
  • git checkout . 恢复暂存区的所有文件到工作区
  • git checkout [file] 恢复暂存区的指定文件到工作区
  • git checkout [commit] [file] 恢复某个commit的指定文件到暂存区和工作区

三、整理提交记录

1、git merge

常规使用

git merge <branch-name> // 合并指定分支到当前分支

其他

...

说明

在 Git 中merge合并两个分支时会产生一个特殊的提交记录,它有两个父节点。

2、git rebase

常规使用

git rebase <branch-name>  // 合并指定分支到当前分支
git rebase <指定branch-name>  <目标branch-name>  // 合并指定分支到目标分支

其他

...

说明

rebase 的优点就是可以创造更线性的提交历史。

rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在指定地方逐个的放下去。

3、git cherry-pick

常规使用

git cherry-pick <commitID> <commitID>...  // 选择几个commit,合并进当前分支
// 将一些提交复制到当前所在的位置(HEAD)下面

说明

cherry-pick将一些提交记录复制一份放到指定位置。

四、撤销

1、git reset

常规使用

git reset <commitID>  // 重置当前分支的指针HEAD 为指定commitID,同时重置暂存区,但工作区不变

例如:
git reset C1  // 回退到C1(hash值)
git reset HEAD1  // 回退一步

其他

...

说明

git reset 通过把分支记录回退几个提交记录来实现撤销改动。相当于“改写历史”,git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

虽然在本地分支使用 git reset 很方便,但是这种“改写历史”的方法对远程分支是无效的!!!

2、git revert

常规使用

git revert <commitID>  // 会新建一个commit,用来撤销指定commitID。
// 即后者的所有变化都将被前者抵消,并且应用到当前远程分支

五、标签

1、git tags

常规使用

git tag <tag> <commitID> // 新建一个tag在指定commit

例如:
git tag v1 C1  // 将这个标签命名为 v1,并且明确地让它指向提交记录 C1,
//如果你不指定提交记录,Git 会用 HEAD 所指向的位置。

其他

  • git tag 列出所有tag
  • git tag [tag] 新建一个tag在当前commit
  • git tag [tag] [commit] 新建一个tag在指定commit
  • git tag -d [tag] 删除本地tag
  • git push origin :refs/tags/[tagName] 删除远程tag
  • git show [tag] 查看tag信息
  • git push [remote] [tag] 提交指定tag
  • git push [remote] --tags 提交所有tag
  • git checkout -b [branch] [tag] 新建一个分支,指向某个tag

说明

比如软件发布新的大版本,或者是修正一些重要的 Bug 或是增加了某些新特性,有没有比分支更好的可以永远指向这些提交的方法,就是git tag。

tag并不会随着新的提交而移动,也不能切换到某个标签上面进行修改提交,它就像是提交树上的一个锚点,标识了某个特定的位置。

2、git describe

常规使用

git describe <ref>

// <ref> 可以是任何能被 Git 识别成提交记录的引用,如commitID 和 分支名,
// 如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)。

// 它输出的结果是这样的:

<tag>_<numCommits>_g<hash>

// tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, 
// hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。
// 当 ref 提交记录上有某个标签时,则只输出标签名称

其他

...

说明

由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来描述离你最近的锚点(也就是标签),它就是 git describe!!!