本文适合总觉得git操作不够顺滑,被各种分支问题搞得焦头烂额的Java业务开发同学。

如果是git的初学者,建议搜索下git其他入门教程,这方面资料很多,非常推荐git init一个新项目,然后本地操作,边操作边观察工作区、暂存区、本地仓库和远程仓库的变化,这样就能很快上手。

由于IDEA git插件的便捷,平时简单的git操作或者查看操作都依赖可视化菜单即可,如非情怀,没必要非要命令行。但是各种分支操作等复杂操作,还是建议使用命令行,这样一是比较靠谱,二是能对git的处理逻辑更加了解,更容易举一反三。

下面介绍都是博主自己的经验而已,基于git版本为2.23.0,如果你的本地环境是git 1.x的话,结果会有些差异。

常见的git系统构成:

  1. Working Directory: 工作区

  2. Staging Area: 暂存区

  3. Repository(Local): 本地仓库

  4. Repository(Remote): 远程仓库

1.查看信息

命令行操作

  1. git log --> 查看当前分支的git日志。

  2. git log --oneline --> 单行形式查看当前分支的git日志。

  3. git reflog --> 查看本地的提交变更历史,并且提交是不区分在哪个分支提交的。常用于恢复本地的错误操作。

注:

  1. git log只显示当前分支所有提交过的版本信息,不包括已经被删除的 commit 记录和 reset 的操作

  2. git reflog显示本地所有分支的操作记录,包括提交,回退的操作

  1. git remote -v --> 查看远程仓库地址。

  2. git status --> 查看当前git的状态。非常有用的命令。

IDEA可视化操作

  1. 查看文件变更历史,等同于git show。

除了在暂存区的文件,在工作区的文件同样可以在右键菜单Git中找到"show history"

  1. 查看暂存区代码本次修改信息,等同于git diff。

  1. 查看文件在相比其他分支的版本/之前版本的改动,和第1个操作在同一级目录,对应菜单名分别为:Compare with和Compare with Branch

  2. 查看文件的每一行最后的修改人,等同于git blame。

2.单次提交操作

命令行操作

  1. git add . --> 将所有变化提交到暂存区。

注:由于git插件会默认将新增文件增加到暂存区,所以日常开发git add是不需要手动操作。

  1. git rm [filename] --> 删除工作区的文件,并将删除放到暂存区。

  2. git rm --cached [filename] --> 停止追踪暂存区的文件,文件会保留在工作区。

注:上面两条rm指令敲错的话也不会有问题,用错场景的话,会有反馈提示的。但不建议不指定文件名直接用"."代替,容易误操作。

  1. git commit --amend --> 将暂存区的改动添加到最新一次commit,并可修改最新一次commit的注释内容。

  2. git commit --amend --no-edit --> 将暂存区的改动添加到最新一次commit,但并不修改最新一次commit的注释内容。

注:以上两条指令常用于代码已经提交后的重新修改。要注意的是,执行后的最新节点的commitid会发生变化。

IDEA可视化操作

  1. 提交代码,等同于git commit。
    可以选择多个文件,也可以单选。

  1. 取消代码修改,等同于git revert。
    和第1个操作在同一级目录,"Commit"的下面

  2. 选择一个提交或者多个提交,合并到当前分支等同于git cherry-pick。

3.分支操作

命令行操作

  1. git branch --> 列出所有本地分支;-r 列出所有远程分支;-a列出所有本地和远程分支。

  2. git switch [branch_name] --> 切换分支;branch_name改为"-",切换到上一个分支。

  3. git checkout -b [new_branch_name] --> 基于当前分支创建新的分支。

  4. git branch -d [branch-name] --> 删除分支。

4.撤销

命令行操作

  1. git stash --> 将暂存区的代码缓存到栈中。

  2. git stash list --> 显示栈中所有缓存。

  3. git stash pop --> 将栈中的最近一次保存pop到暂存区中。

  4. git stash apply --> 恢复栈中所有的保存。

  5. git stash clear --> 清空缓存代码的栈。

注:git stash指令主要用于切换到突发事情,需要保留现场的时候进行使用。

  1. git reset --soft [commitId] --> 将HEAD指针指向commitId,并将commitId(不含)之后的提交放入暂存区。

  2. git reset [commitId] --> (省略了--mixed,因为--mixed是默认的参数)将HEAD指针指向commitId,不改变工作区,即将commitId(不含)之后的提交变成待提交的状态)
    例如:git reset HEAD^ --> 将本地仓库的最新一条commit撤销,并将最新的修改变成待提交的状态。

  3. git reset --hard [commitId] --> 将本地仓库的[commitId](不含)之后的提交直接删除。

  4. git reset --hard [old_branch_name] --> 将当前分支还原成同old_branch_name一样的分支(此时一般不加--soft等其他参数,因为会出现HEAD指针已经移动到目标提交,又多了份提交在工作区或暂存区)

注:

  1. 如果有远程仓库的话,想要将远程仓库的代码与本地git reset的代码保持一致的话,需要执行git push -f。如果是公用分支的话,要注意执行git push -f的前提是保证你的强制覆盖不会删除别人的代码。

  2. 上面两个命令中,[commitId] 可以替换为HEAD。对于前者,可以取消追踪暂存区的追踪;对于后者,可以直接抛弃暂存区的修改。

  1. git revert [commitId] --> (省略了--edit,因为--edit是默认的参数)新建一个提交,用来还原指定commitId的变动。

注:

  1. --edit可替换成--no-edit,这样可以跳过编辑commit信息。

  2. --edit可替换成--no-commit,这样可以让撤回的提交放到暂存区,不进行提交,用户自行手动提交。

  1. git revert -m 1 [commitId] --> 保留merge中主干分支的修改部分,还原其余部分(commitId为merge的节点commitId)。如果1改为2,则保留merge中非主干分支的修改部分,这种操作很少见。

注:
相较于git reset ,git revert不会改变项目历史,对那些已经发布到共享仓库的提交来说这是一个安全的操作(git reset会把历史上某个提交及之后所有的提交都移除掉了)

  1. git rebase -i [commitId] --> 修改最近的提交。例如:git rebase -i HEAD~2 --> 合并最近的两次提交

执行这个命令后会跳到一个vi编辑器,修改每一行的第一个单词会有不同的效果:
pick:保留该commit(缩写:p)
reword:保留该commit,但需要修改该commit的注释(缩写:r)
edit:保留该commit, 但要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但不要保留该提交的注释信息(缩写:f)
drop:丢弃该commit(缩写:d)
exec:这个比较特殊,可以新增一行单独写。执行shell命令(exec之后的部分)(缩写:x)

注:完整命令是 git rebase -i [startpoint] [endpoint] --> 修改区间内的提交,区间前开后闭。

5.远程同步

命令行操作

  1. git pull --> 拉取代码等同于git fetch和git merge。

  2. git pull --rebase --> 拉取代码等同于git fetch和git rebase。

注:实际上git pull的真正命令形式是这样的:
git pull :
只不过我们在当前分支从默认远程主机拉取代码的时候,忽略了后面的参数

  1. git push 本地分支推送到远程仓库的对应分支。

  2. git push -f --> 强行推送,即时有冲突也会被覆盖。

注:同git pull一样,实际上git push的真正命令形式是这样的:
git push :

参考:

  1. https://git-scm.com/book/zh/v2/Git-工具-高级合并

  2. https://www.runoob.com/git/git-tutorial.html

  3. https://github.com/alibaba/fastjson/issues/2346

git 修改commit_结合IDEA与命令行,解决常用git操作与特殊情况的最佳实践相关推荐

  1. git 版本控制工具(五)-命令行汇总及其他操作

    一.命令行汇总 git config //配置本地仓库 常用git config --global user.name.git config --global user.email git confi ...

  2. 通过命令行玩转Git,需要记住那些命令?

    Git 简介 什么是 Git ? Git 是目前世界上最先进的分布式版本控制系统!!!什么?啥意思?不懂,没关系,你只要记住,它很重要,非常重要,程序猿的必备技能即可. Git 的命令非常非常多,这里 ...

  3. zbb20190109 git命令行解决冲突文件步骤

    git命令行解决冲突文件步骤 方法一(推荐使用): git pull 出现冲突后丢弃本地冲突文件修改,采用远程文件覆盖本地文件 git checkout  [文件路径] 例:git checkout  ...

  4. macos安装git命令行_MAC OS git客户端安装及操作

    1. 下载安装mac os 版本的git客户端及相关可视化软件 1.1 从git官网上下载匹配的git客户端.pkg格式的包,然后在系统偏好设置-> 安全性与隐私中打开系统默认禁止安装的这个程序 ...

  5. python输入正方形边长值、计算其面积_尝试修改列6.2编写命令行参数解析的程序,解析命令行参数所输入边长的值,计算并输出正方形的周长和面积。_学小易找答案...

    [简答题] [单选题]ZigBee 中每个协调点最多可连接______个节点,一个ZigBee网络最多可容纳______个节点.( ) [资料题]DWord-Ans.pdf 索引和目录.pdf 完成效 ...

  6. 详解Linux命令行下常用svn命令

    2019独角兽企业重金招聘Python工程师标准>>> 本文讲述了Linux命令行下常用svn命令的使用方法,希望对您有所帮助. 1.Linux命令行下将文件checkout到本地目 ...

  7. Windows命令行下常用网络命令解释大全

    命令行下常用网络命令解释大全 1.Arp 显示和修改"地址解析协议"(ARP) 所使用的到以太网的 IP 或令牌环物理地址翻译表.该命令只有在安装了 TCP/IP 协议之后才可用. ...

  8. mysql 命令行更改utf8 快捷操作

    mysql 命令行更改utf8 快捷操作 进行检查 mysql> show variables like '%char%'; 使用mysql命令设置: 如果仍有编码不是utf8的,请检查配置文件 ...

  9. Linux命令行下常用svn命令的使用方法[转自:www.hackbase.com]

    本文讲述了Linux命令行下常用svn命令的使用方法,希望对您有所帮助. 1.Linux命令行下将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如: ...

最新文章

  1. git 工作区和暂存区
  2. android脚步---设置layout隐藏属性
  3. Serenity安装和创建DEMO--学习第一天
  4. 社区网站功能实现系列(三):社区页面无刷新回发的一种实现方式
  5. php日期差数,php如何计算日期差几天
  6. Java Serializable:明明就一个空的接口嘛
  7. HTML与CSS布局技巧总结
  8. Spring的事务机制
  9. 10进制小数转化为任意进制小数
  10. Java面试11|Maven与Git
  11. Latex中定义、定理、引理、证明 设置方法总结
  12. js结束当前循环关键词_干货||什么是事件循环机制
  13. 让Node.js在Azure上运行-3
  14. ListView分页操作
  15. lt;一 SAP ABAP 将数字转换成本地语言(中文、英文)大写
  16. NodeJs之邮件(email)发送
  17. POI导出Excel(用户自己选择路径)
  18. 医疗核心关键词排名,为什么说要用百家号做
  19. 智能硬件APP开发之路:基于机智云APP开源框架
  20. oracle基础|数据库模型|实体-关系图(E-R图)|什么是一对一、一对多、多对多

热门文章

  1. php注册表单处理,PHP登录和注册表单错误处理
  2. JAVA开发面试常问问题总结2
  3. c++中list用法
  4. 如何用1年时间获得3年成长?
  5. LeetCode刷题(21)
  6. 【十三】Jmeter:“CSV 数据文件设置”参数化请求中出现带有逗号的参数值
  7. mpvue返回上一个页面_Mpvue+Vant-Weapp开发小程序遇坑之解决系列
  8. python中直方图bins是什么意思_Python 中下划线的 5 种含义都是什么?
  9. 若依集成jwt实现登录授权访问(单体版)
  10. mysql各类型长度_mysql 各数据类型的大小及长度