git 常用操作

可以把分支名理解为指针,比如 master,test,origin/master 等,都是一个指针,指向某次提交快照
特殊指针HEAD:Git有一个名为 HEAD 的特殊指针,它是一个指针,指向当前所在的本地分支

  • git branch:列出本地所有分支,当前分支高亮并且前面有*号
  • git branch -d:删除分支,注意不能删除当前分支,因为你把当前分支删除了,HEAD指针就不知道指到哪去了
  • git branch -D:大写的『D』,表示强制删除分支,慎用这个命令
  • git branch name:创建名为『name』的分支,注意,并不会切换到该分支
  • git checkout -b feature:从当前分支新建feature分支,并切换到 feature 分支
  • git branch -v:查看每一个分支的最后一次提交
  • git branch -vv:查看本地分支和远程分支的跟踪关系

分支合并

当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧—这就叫做 “快进(fast-forward)”。

查看分支合并情况

  • git branch –merged:查看哪些分支已经合并到当前分支
  • 在这个列表中分支名字前没有*号的分支通常可以使用gitbranch-d删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。
  • git branch –no-merged:查看哪些分支还没有合并到当前分支
  • git branch -d 删除会失败,因为这些分支还没有被合并,删除会丢失东西。

origin/master 与master

  • origin/master:本地指针,指向最后一次同步时远程分支的提交快照
    只要你不与origin服务器同步(如 git fetch/pull等),你的origin/master指针就不会移动。详见Git远程分支
  • git fetch origin: 将origin远程数据同步到本地
    包括所有的分支,不只是当前分支,并且更新本地数据库(但是不会合并到当前master分支)
  • git fetch 会移动 origin/master 指针,指向更新后的位置。详见git远程分支

本地分支跟踪远程分支

首先可以用 git branch -vv 查看本地分支和远程分支的跟踪关系。
分两种情况:
第一种情况是,新建分支时,以远程分支为基础来新建:

第一种写法,指定本地分支名
git checkout -b test origin/test

第二种写法,用 --track 参数,省略分支名,默认会用origin的分支名
git checkout --track origin/serverfix

第二种,新建分时没有以远程分支为基础,这时候如果想跟踪远程分支,可以用 -u 或 –set-upstream-to 来设置跟踪:

git branch -u origin/test

或者
git branch --set-upstream-to origin/test

输出以下内容:
Branch test set up to track remote branch test from origin.

删除远程分支

git push origin --delete test

变基与合并

如果想把master分支的改动『整合』到experiment分支,通常我们用 git merge 命令,如下:

1. 先切换到experiment分支
git checkout experiment

2. 合并master分支到当前分支
git merge master

同样,还是想把master分支的改动『整合』到experiment分支,我们还可以使用『变基』,操作如下:

1. 先切换到experiment分支
git checkout experiment

2. 变基master
git rebase master

3. 会有如下输出
First, rewinding head to replay your work on top of it...

Applying: added staged command

变基的操作,跟合并一样,只需要把『merge』关键字替换为『rebase』;无论是通过变基,还是通过三方合并,整合的最终结果是一样的,只不过提交历史不同罢了,变基的提交历史是一条直线没有分叉。

rebase理解

在当前分支(假设为experiment) git rebase master,相当于说再一次以最新的master分支为基础,新建experiment分支,然后再把当前experiment分支的commit续上去。

更多变基,详见Git变基。

git reflog

reflog,即引用日志,引用日志记录了最近几个月你的HEAD和分支引用所指向的历史。
值得注意的是,引用日志只存在于本地仓库,一个记录你在你自己的仓库里做过什么的日志。其他人拷贝的仓库里的引用日志不会和你的相同;而你新克隆一个仓库的时候,引用日志是空的,因为你在仓库里还没有操作。
可以将引用日志看作是Git版的shell历史记录。

git log since..until

基本格式为:git log since..until

  • git log master..experiment:可以用来查看『在experiment分支而不在master分支』的提交
  • 反过来,git log experiment..master 就是用来查看『在master分支而不在experiment分支』的提交

这个命令,通常用于解决『这个分支还有哪些提交没有合并到master分支』

跟下面的命令:
git log experiment –not master 是等价的,但是感觉加 –not 表意更准确。
git log master..experiment 到底是在哪个不在哪个呢?

日志搜索

  • git log -Sstr –oneline:使用-S选项来显示新增和删除字符串str的提交
  • git log -Gegrep –oneline:使用-G选项来使用正则表达式搜索

在当前分支作了一些改动,想要切换到另一个分支做,却又不想丢失当前改动也不想做一次提交(可能是工作做到一半,不想创建一次没有意义的提交),针对这种问题的答案是git stash命令。

举例说明下如何操作:

git stash 的一些常用命令:

  • git stash:将当前改动保存到『储藏栈』里(工作区和暂存区里就没有当前改动了)
  • git stash list:查看『储藏栈』里保存哪些东西
  • git stash apply:将最近保存到『储藏栈』里的改动内容重新放回到当前分支

注意,git stash apply 命令不一定说要在原来的分支执行,可以在任意分支执行,结果都是将『储藏栈』里的改动内容放回到当前分支。也就说我可以在 experiment 分支stash,在master分支apply,那么就可以把experiment分支的改动直接带到master分支,而无需经过commit在merge来实现。

这在有时候很有用:你忘记了当前在哪个分支,噼里啪啦改了半天,结果一看,卧槽居然在master分支直接改了(通常master分支不能直接改),你本来是想在dev分支改的,这时候用 git stash就很有用。

  • git stash pop:跟git stash apply基本一样,区别在于git stash apply之后,『储藏栈』中还保留储藏的内容,而pop会『应用并弹出』储藏内容,即储藏的内容被删除了。
  • git stash drop stash引用:删除『储藏栈』中对应的储藏内容

修改最后一次提交

修改多个提交

使用 git commit –amend 只能修改最后一次提交,如果想要修改最近三次提交,或者最近三次提交中的任意一个提交,可以使用交互式变基:

git rebase -i HEAD~3

运行这个命令会在文本编辑器上给你一个提交的列表,看起来像下面这样:

pick 93b2809 Initial commit
pick 76da34e macair add 1.txt
pick 3c7f123 macair add 4.txt

Rebase 73b2649..3c7f123 onto 73b2649 (3 command(s))
#
Commands:
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit

Original: https://www.cnblogs.com/wxweven/p/13963032.html
Author: wxweven
Title: git 常用操作

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592533/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 记录一次 Nginx 配置 proxy_pass 后 返回404问题

    一、 Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位 1.1、 问题 1.2、 寻找问题原因 1.3、 proxy_set_header 官方信息 1….

    Java 2023年5月30日
    072
  • SQL五十题记录 1-2

    前言: 创建以下四张表:①:课程表 ②:成绩表 ③:学生表 ④:教师表 1.查询课程编号为””01″”的课程比”02&#…

    Java 2023年6月7日
    068
  • 4.如何避免缓存穿透、缓存击穿、缓存雪崩

    先来看一下缓存穿透,是指业务请求穿过了缓存层,落到持久化存储上。在大多数场景下,我们应用缓存是为了承载前端业务请求,缓存被击穿以后,如果请求量比较大,则会导致数据库出现风险。 以双…

    Java 2023年6月9日
    054
  • Java中邮件发送session.getDefaultInstance和getInstance的区别

    假设你想要同时用两个邮箱分别给再给两个邮箱发送邮件时,你就需要创建两个java.mail.Session对象,这时候你用getDefaultInstance的话会发现第二个Sess…

    Java 2023年6月7日
    085
  • http网页状态码大全查询

    http网页状态码,是诸多站长经常接触到的东西,所谓的HTTP状态码,它是浏览器传输协议所响应的一种代码状态,不同的代码状态,反应了网页目前处于的状态,根据不同的状态码,可以判断出…

    Java 2023年6月13日
    085
  • 3. SpringBoot整合Redis

    1.下载地址以及安装 https://github.com/MicrosoftArchive/redis/releases 我是安装的windows版本所以选择这个: 解压之后运行…

    Java 2023年6月9日
    0102
  • Spring Tool 4 安装 Thymeleaf 3.0 插件

    参考资料 说在前面 最小要求 步骤 1.下载 Spring Tool 4.7.1 2.下载 thymeleaf 的 eclipse 插件 2.打开 STS – Help…

    Java 2023年6月9日
    0104
  • synchronized 是可重入锁吗?为什么?

    什么是可重入锁? 若一个程序或子程序可以”在任意时刻被中断然后操作系统调度执行另外一段代码,这段代码又调用了该子程序不会出错”,则称其为可重入(reentr…

    Java 2023年6月14日
    073
  • Java 代理模式

    1、打王者段位一直打不上王者段位怎么办?请游戏代练。2、过年回家自已抢不到高铁票怎么办?找黄牛帮我们抢票。3、…….(生活中处处可见。) 由上可知,代理模式…

    Java 2023年5月29日
    097
  • JUC并发编程进阶!!

    1.知识点回顾及延伸 2.生产者消费者问题 3. 八锁问题 4.集合类线程不安全解决 5.Callable再理解 6.三大常用辅助类 6.1、 CountDownLatch 6.2…

    Java 2023年6月8日
    092
  • 基于Python豆瓣自动化测试【2】

    —— Pytest基础使用教程【2】 从测试报告说起 承接上一篇中最后的测试结果图,使用过的pytest-html 插件原生态的报告的话。可能会发现 内容样式都有些不同。其实是做了…

    Java 2023年6月15日
    076
  • Mybatis-Spring源码分析

    Mybatis-Spring 博主技术有限,本文难免有错误的地方,如果您发现了欢迎评论私信指出,谢谢JAVA技术交流群:737698533 当我们使用mybatis和spring整…

    Java 2023年6月6日
    083
  • EMQ云端与局域网实现桥接功能

    云端部署Emqx。局域网部署NanoMQ。相关配置即可实现桥接功能; 建议采用docker部署。 sudo docker run -itd -v /home/nvidia/nano…

    Java 2023年5月29日
    077
  • 互联网医院实施方案(一)实施前准备

    业务标签:医院信息集成平台、互联网医院、互联网护理、慢性病随访 技术标签:ESB、ETL+CDC、NLP、FaaS、SaaS、Hadoop、MicroService 技术微信群:加…

    Java 2023年5月29日
    074
  • 【spring源码学习】spring的事务管理源码学习

    一、抽象概念 1、事务管理器 接口:org.springframework.transaction.PlatformTransactionManager 实现类:org.sprin…

    Java 2023年5月29日
    071
  • leetcode_19. 删除链表的倒数第 N 个结点

    这个题目是我在leetcode上写出来的第一道题目。 题目表述 给你一个链表,删除链表的倒数第 n个结点,并且返回链表的头结点。 ++i 和 i++ i++会产生一个临时变量,而 …

    Java 2023年6月5日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球