高频使用的Git命令

栏目: IT技术 · 发布时间: 4年前

内容简介:汇总下我在项目中高频使用的Git命令及姿势。不是入门文档,官方文档肯定比我全面,这里是结合实际业务场景输出。使用的Git版本:git version 2.24.0

前言

汇总下我在项目中高频使用的Git命令及姿势。

不是入门文档,官方文档肯定比我全面,这里是结合实际业务场景输出。

使用的Git版本:git version 2.24.0

命令

git log

查看日志,常规操作,必备:

# 输出概要日志,这条命令等同于

# git log --pretty=oneline --abbrev-commit

git log --oneline



# 指定最近几个提交可以带上 - + 数字

git log --oneline -5



# 提供类似GUI工具的log展示

git log --graph --date=relative --pretty=tformat:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset'

高频使用的Git命令

git status

查看工作区状态的东东,不如GUI直观,但是命令行也有一些用的:

# 等同git status --long,查看当前工作区暂存区变动

git status



# 概要信息(--short)

git status -s



# 查询工作区中是否有stash存在(暂存的东西),有则提醒该工作区有几个stash

git status  --show-stash

git checkout

用来切换到对应记录的,可以基于分支,提交,标签。

切提交和标签一般用来热修复或者老版本需要加新特性。

# 分支切换

git checkout dev # local branch



# 切换远程分支

git checkout origin/test # remote branch



# 基于远程分支创建本地分支,并跟踪对应来自 'origin' 的远程分支

git checkout --track origin/feature-test # new local branch wih remote branch



# 基于本地分支开出新分支

git checkout -b testbranch # new local branch with current branch



# 彻底丢弃某个文件的改动

git checkout -- file



# 放弃本地所有改动

git checkout .



# 切换上一个分支

git checkout -

git commit

天天打交道的命令,这里说一些很常见的姿势。

# 新修改的内容,添加到上次提交中,减少提交的日志

# --no-edit:是跳过进入编辑器,直接提交

# git commit --amend这条命令等同于

# $ git reset --soft HEAD^

# $ ... do something  tree ...

# $ git commit -c ORIG_HEAD

git commit --amend --no-edit



# 跳过校验直接提交,包括任何githooks

git commit --no-verify -m "xxx"



# 带提交概要信息

git commit -m "xxx"



# 指定目录格式提交

# -t <file>, --template=<file>

# 也可以从全局或者项目级别指定提交的模板文件

# git config [--global] commit.template xxx

# 现在一般都是用社区的npm规范包,commitizen和commitlint来规范提交

git commit -t templateFile



# 提交信息从文件读取,可以结合上面的一起用

git commit -F

git reset

不得不说,代码回滚中这个命令也是用的很多,而且是 --hard。

# 硬性回滚,简单粗暴,直接抛弃回滚之后改动(log 还是有保留,内容不要而已)

git reset --hard commit_sha1



# 软性回滚,跟rebase常规用法差不多的效果,可以把提交的东西丢回暂存区和工作区

# HEAD的指向改变会对应的commit,之后再考虑怎么commit

git reset --soft commit_sha1



# 软回滚一个版本,可以理解为撤销最近一次的commit

git reset --soft HEAD~1



# 清除暂存区但保留工作区变动

git reset --mixed commit_sha1



# 保留工作区和暂存区之间的差异

git reset --merge commit_sha1



# 保留工作区和HEAD之间的差异

git reset --keep commit_sha1

git revert

一般用于master的代码回滚,因为多人在上面协作,revert可以平稳的回滚代码,但却保留提交记录,不会让协作的人各种冲突!

# 回滚到某个commit

git revert commit-sha1

git rebase

变基在项目中算是很频繁的,为什么这么说。

比如你开发一个新的feature,遵循最小化代码提交的理念。

在整个功能开发完毕的时侯,会有非常多的commit,用rebase可以让我们的commit记录很干净。

# 带-i可以进入交互模式,效果如下

git rebase -i git-sha1|branch(HEAD)



# 若是中间毫无冲突,变基则一步到位,否则需要逐步调整。

git rebase --continue # 提交变更后继续变基下一步

git rebase --skip # 引起冲突的commits会被丢弃,continue提示没有需要改动的也可以用这个跳过

git rebase --abort # 若是变基改残废了,但是走到一半,可以彻底回滚变基之前的状态

高频使用的Git命令

  • pick:是保留该 commit(采用)
  • edit:一般你提交的东西多了,可以用这个把东东拿回工作区拆分更细的commit
  • reword:这个可以重新修改你的commit msg
  • squash:内容保留,把提交信息往上一个commit合并进去
  • fixup:保留变动内容,但是抛弃commit msg
  • drop:用的比较少,无用的改动你会提交么!

突然发现截图还有几个新的行为,估计是新版本带来的,从字面上就可以看出来大体的意思,就是把回滚和打标签这些放到变基中简化操作。

温馨提示:

  • 本地提交之前,最好把基准点变为需要合并的分支,这样提交 PR/MR 的时侯就不会冲突(本地来解决冲突)
  • 不要在公共分支上变基!一变其他协作者基本都一堆冲突!除非你们有很清晰的分支管理机制。

git merge

# --ff是指fast-forward命令,当使用ff模式进行合并时,将不会创造一个新的commit节点。

# --no-ff,保留合并分支的提交记录,一般主干用的比较多。

# --ff-only 除非当前HEAD节点为最新节点或者能够用ff模式进行合并,否则拒绝合并并返回一个失败状态。

# --squash 则类似rebase squash,可以把合并多个commit变成一个

git merge --no-ff branchName

git pull

git pull中用的最多是带--rebase(-r)的方式(变基形式拉取合并代码),保持分支一条线。

默认的pull会走ff模式,多数情况会产生新的commit,部分参数与merge提供一致。

git push

当本地分支存在,远程分支不存在的时侯,可以这样推送关联的远程分支。

# 这样会直接新建一个同名的远程分支

git push origin localbranch 





# 删除远程分支(--delete)

git push -d origin branchName



# 推送所有标签

git push --tags



# 推送commit关联的tags

git push --follow-tags



# 强制推送(--force)

git push -f origin branchName # 一般合理的项目,主干都做了分支保护,不会允许强推行为



# 有时候真的需要强推的时侯,但可不可以柔和一点呢?

# 就是当前远程分支和你本地一致,没有别人提交的情况下可以强推

# --force-with-lease:若是远程有人提交,此次强推失败,反之成功

git push --force-with-lease

git remote

这个东西用在你需要考虑维护多个地方仓库的时侯会考虑,或者修改仓库源的时侯。

# 常规关联本地git init到远程仓库的姿势

git remote add origin url



# 新增其他上游仓

git remote add github url



# 修改推送源

git remote set-url  origin(或者其他上游域)url

git branch

该命令用的最多的就是删除本地分支,重命名分支,删除远程分支了。

# 分支删除,拷贝,重命名,参数若是大写就等同多了--force,强制执行

# -c, --copy:复制分支

# -C:等同于 --copy --force

# -d, --delete:删除分支

# -m, --move:移动或者重命名分支

git branch -d branchName

git branch -M oldBranch newNameBranch





# 手动指定它的当前分支的上游分支,两个写法一致的

# 有关联一般也有取消关联,--unset-upstream

git branch --set-upstream-to=origin/xxx 

git branch --set-upstream-to origin xxx 

git stash

暂存用的最多时侯就是你撸代码撸到一半,突然说有个紧急Bug要修正。

或者别人在你这里需要帮忙排查代码,你这时候也会用到。

强烈建议给每个stash添加描述信息!

# 缓存当前工作区的内容到stashName,save这个现在不怎么推荐用,图方便也能用

# -a|--all:除了未跟踪的文件,其他变动的文件都会保存

# -u|--include-untracked:包括没有添加到暂存区的文件

git stash save stashName

git stash -u save stashName



# 现在基本推荐用push,因为有pop,语义上和维护上更清晰

# 上面有的参数,它也有,还有-m来备注这个stash的大概情况

git stash push -m "更改了xx" 



# 有保存那肯定也有取用的

# pop:取会删除对应的保存记录

# apply:取但保留记录

# 0就是--index,这个东西哪里来的呢?

git stash apply stash@{0}

git stash pop stash@{0}



# 查看stash保存记录

# eg: stash@{0}: On dev: 测试

git stash list





# 只想删除暂存记录怎么办:

# clear:清空所有stash

# drop:清除指定的stash

git stash clear # 慎用!

git stash drop stash@{0}



# 想看stash做了什么改动,类似简化版的git diff

git stash show stash@{0} 

git reflog

这个命令的强大之处,是记录了所有行为,包括你rebase,merge,reset这些。

当我们不小心硬回滚的时侯,或变基错了都可以在这里找到行为之前的commit,然后回滚。

当然这个时间回溯也只在本地有用,你推送到远程分支的破坏性改动,该凉还是得凉。

# 最近五次行为,不带-n则默认所有

git reflog -5

git cherry-pick

这个东西你可以理解为你去买橘子,你会专门挑一些符合心意的橘子放到购物篮中。

你可以从多个分支同时挑取部分需要的commit合并到同一个地方去,是不是贼骚。

这货和变基有点类似,但是仅仅类似,挑过来的 commit 若是没有冲突则追加。

有冲突会中断,解决后--continue。

# 在当前分支挑其他分支的commit,把那部分的变动那过来

git cherry-pick commit-sha1



# 支持一次性拿多个

git cherry-pick master~4 master~2



# 支持区间,区间中间是 .. 

git cherry-pick startGitSha1..endGitSha1



# --continue:继续pick,一般有冲突解决后才需要这样

# --skip:跳过这次进入队列下一次行为 

# --abort:完全放弃pick,恢复pick之前的状态

# --quit:未冲突的自动变更,冲突的不要,退出这次pick

# 这几个状态跟变基差不多,解决冲突继续,跳过处理,放弃这次pick,不输出错误

git rm

这个命令在旧的版本用的比较最多的姿势是为了重新索引.gitignore的范围。

# 删除某个文件的索引

# --cache不会删除硬盘中的文件,只是Git索引(缓存)的关系!

git rm --cache -- file



# 递归清除全部所有索引(也可以理解为缓存吧),这个姿势适合重新让.gitignore新范围生效

git rm -r --cached .  

git add .

git commit -m "xxx"

git rev-parse

这个估计一般人用的不是很多,可以通过这个快速获取部分Git仓库的信息。

我在弄脚本的时侯就会从这里拿东西。

# 获取最新有效的commit

# --short:显示七位的sha1,不带就是全部

# --verify:校验是否有效commit

# HEAD:当前分支的head指向

git rev-parse --short HEAD --verify



# 显示仓库的绝对路径

git rev-parse --show-toplevel #eg: /Users/linqunhe/Code/aozhe/thinking-ui



# 显示版本库.git目录所在的位置

git rev-parse --git-dir



# 显示所有关联引用的git sha1

git rev-parse --all

git diff

对于这个命令,在终端比对用的不是很频繁,除了少量改动的时侯可能会用这个看看。

其他情况下我更倾向于用GUI工具来看,因为比对更加直观。

总结

Git的常用命令其实很好掌握,很多命令都有 Linux 的影子。

列出来的命令都是高频使用的,或许有一些更骚的姿势没有摸索到,有更好建议的,或者发现不对之处的请留言,会及时修正,谢谢阅读。

链接: https://juejin.im/post/5de8d849e51d455808332166 ,作者:CRPER


以上所述就是小编给大家介绍的《高频使用的Git命令》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java Web入门经典

Java Web入门经典

王国辉、陈英 / 机械工业出版社 / 2013-6 / 69.00元

《Java Web入门经典》以初学者为核心,全面介绍了JavaWeb开发中常用的各种技术。内容排列上由浅入深,让读者循序渐进掌握编程技术;在内容讲解上结合丰富的图解和形象的比喻,帮助读者理解“晦涩难懂”的技术;在内容形式上附有大量的提示、技巧、说明等栏目,夯实读者编程技术,丰富编程经验。全书共分4篇19章,其中,第一篇为“起步篇”,主要包括开启JavaWeb之门、不可不知的客户端应用技术、驾驭Ja......一起来看看 《Java Web入门经典》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试