乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

使用计算器进行开方的两种方法

发表于 2020-01-04

生活中很少使用到开方运算, 前段时间为了计算理财复合收益率, 运用到了这一块的内容, 在这里做个记录

场景复现

比如64需要进行开6次方的操作, 计算器该如何操作呢?

第一种

第二种

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Git如何删除某次commit

发表于 2020-01-03

在团队开发的时候, 经常会出现某次commit导致整个项目出现无法名状的错误, 这个时候, 最好的解决办法就是删除错误的commit

场景复现一

1.假设有2个提交记录

1
2
3
4
5
6
7
8
9
10
11
12
13
commit def5adef853da4cc05752bdb36577c127be71ba5

Author: xxx
Date: Thu Dec 28 16:01:36 2017 +0800

优化代码

commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date: Thu Dec 28 15:59:46 2017 +0800

修复
(END)

2.现在需要回滚到上一次提交

那么 我们可以使用

1
git reset --hard HEAD^

或者

1
git reset --hard HEAD~1

或者

1
git reset --hard f36801544670e00b2f59a28e19017d2786c4085e

3.执行完后 查看日志,就会发现只剩下一个提交了

1
2
3
4
5
6
7
8
git log

commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date: Thu Dec 28 15:59:46 2017 +0800

修复
(END)

4.如果这个时候,你突然发现回退版本错了,那么就用git reflog查看提交记录

1
2
3
4
5
6
7
git reflog

f368015 HEAD@{0}: reset: moving to f36801544670e00b2f59a28e19017d2786c4085e
def5ade HEAD@{1}: reset: moving to def5ade
f368015 HEAD@{2}: reset: moving to f36801544670e00b2f59a28e19017d2786c4085e
def5ade HEAD@{3}: commit: 优化代码
f368015 HEAD@{4}: commit (initial): 修复

5.然后找出想要回退的版本,进行回退

1
git reset --hard def5ade

6.如果此时需要同步远程仓库, 需要使用强推

1
git push -f

因为我们本地库HEAD指向的版本比远程库的要旧

由此可见, git reset可以很方便的回滚到指定的历史commit,

但是它的劣势也很明显, 一旦回滚到指定commit, 那么后面提交的commit都会一并删除

*为了保留后面需要的的commit内容, 咱们可以使用另一种指令 *git revert

场景复现二

1.假设有3个提交记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
commit def5adef853da4cc05752bdb36577c127be71ba5

Author: xxx
Date: Thu Dec 28 16:01:36 2017 +0800

优化代码
commit 853dadef5adef4cc05752bdb36577c127be71ba5

Author: xxx
Date: Thu Dec 28 16:01:36 2017 +0800

增加文件
commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date: Thu Dec 28 15:59:46 2017 +0800

修复
(END)

2.现在我们不需要第二个commit的操作,也就是不需要 增加文件 这个操作

那么, 我们可以使用git revert -n +版本号 命令进行反做

1
git revert -n 853dadef5adef4cc05752bdb36577c127be71ba5

注意: 这里可能会出现冲突,那么需要手动修改冲突的文件, 然后重新add提交

1
2
git add .
git commit -m "重做 增加文件"

3.执行完后 查看日志,会发现原来的commit记录还在,同时新增了一个commit版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
git log

commit 05752def5adef853da4ccbdb36577c127be71ba5
Author: xxx
Date: Thu Dec 28 16:01:36 2017 +0800

重做 增加文件

commit def5adef853da4cc05752bdb36577c127be71ba5
Author: xxx
Date: Thu Dec 28 16:01:36 2017 +0800

优化代码
commit 853dadef5adef4cc05752bdb36577c127be71ba5
Author: xxx
Date: Thu Dec 28 16:01:36 2017 +0800

增加文件
commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date: Thu Dec 28 15:59:46 2017 +0800

修复
(END)

4.如果此时需要同步远程仓库

1
git push

使用git revert这种方式既可以清除指定的commit操作, 同时可以保留后面的commit

但是也存在一个让人不舒服的地方, 虽然操作被重写了,但是记录还在, 而且由新增了一个记录,感觉有些冗余

为了解决这个问题, 最后我选择了第三种方式, 也就是使用 git rebase 节点切片

场景复现三

1.假设有3个提交记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
commit def5adef853da4cc05752bdb36577c127be71ba5

Author: xxx
Date: Thu Dec 28 16:01:36 2017 +0800

优化代码
commit 853dadef5adef4cc05752bdb36577c127be71ba5

Author: xxx
Date: Thu Dec 28 16:01:36 2017 +0800

增加文件
commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date: Thu Dec 28 15:59:46 2017 +0800

修复
(END)

2.现在我们不需要第二个commit的操作,也就是不需要 增加文件 这个操作

假设是master分值那么, 我们可以使用git rebase --onto [startpoint] [endpoint]

1
git rebase --onto master~853dade master~def5ade master

或者

1
git rebase --onto master~2 master~1 master

或者使用

1
git rebase i f368015 /把 需要改动那条 commit 前面的 pick 改成drop 然后, 保存退出即可

3.执行完后 查看日志 指定的commit已被切除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git log

commit def5adef853da4cc05752bdb36577c127be71ba5
Author: xxx
Date: Thu Dec 28 16:01:36 2017 +0800

优化代码

commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date: Thu Dec 28 15:59:46 2017 +0800

修复
(END)

4.如果此时需要同步远程仓库

1
git push  -f

要注意的是,这样做会 彻底 删掉那条 commit。唯一的找回方式是通过 git reflog。

5.如果你只是想改下那条 commit 的 author

这样就行:

1
git rebase -i f368015

把 需要改动那条 commit 前面的 pick 改成 edit

然后

1
git commit --amend --author="xxxxxxxx"

然后

1
git rebase --continue

最后保存退出即可

总结

  • git reset

适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。

  • git revert

适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

  • git rebase –onto和git rebase i

适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,彻底清除commit记录, 而又不增加新的commit记录, 就可以用这种方法

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

如何将gradle插件发布到插件门户网站

发表于 2019-12-29

Step 1: 创建账户.

点击注册.

注册地址:https://plugins.gradle.org/user/register

Step 2: 生成API key.

Step 3: 将 API key 添加到Gradle 配置中.

拷贝API Key到电脑$USER_HOME/.gradle/gradle.properties文件中,如果电脑没有该文件, 就自行创建一个

$USER_HOME 指的是你的电脑用户名

如果你嫌手动配置api麻烦, 可以使用官方的login task进行自动注册,

image-20210727105738873

执行login task 执行窗口会出现授权链接 点击浏览器打开即可

image-20210727110154697

在此之前需要先应用插件, 往下看:

Step 4: 使用官方插件进行代码的推送.

在你自己的插件工程build.gradle中添加如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 第一步 应用插件
plugins {
id "com.gradle.plugin-publish" version "0.10.1"

}


pluginBundle {
website = 'http://www.gradle.org/'//你自己的插件官网地址
vcsUrl = 'https://github.com/gradle/gradle'//插件版本同步地址 填写你的github地址即可
description = 'Greetings from here!'//插件描述
tags = ['greetings', 'salutations']//标签 便于搜索

plugins {
greetingsPlugin {
version = "1.2" //插件版本号
group = "com.foo.myplugin"//插件包名
displayName = '这里填写在插件官网中显示的名称'
}
}
}

配置完成后,执行 publishPlugins task即可自动上传代码

Step 5: 等待审核.

审核通过后,即可在官网搜索到你的插件, 上面附有插件的使用方法

Step 6: 完成.

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

强制刷新gradle依赖缓存的方法

发表于 2019-12-28

有时候我们需要在不改变版本号的前提下 同步gradle重新从远程更新依赖包

方案一:

修改项目任意一个依赖库版本号,然后同步gradle,同步完成后再改回来

方案二:

执行以下指令强制刷新

1
2
3
4
5
6
Windows:    
gradlew build --refresh-dependencies


Mac:
./gradlew build --refresh-dependencies

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

给工程打jar包时如何把libs中的jar包一并打入

发表于 2019-12-28

当我们在进行maven打包时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apply plugin: 'maven'


uploadArchives { // 这里只是更新到本地,可以上传到自定义的maven仓库
repositories {
mavenDeployer {
//提交到远程服务器:
// repository(url: "http://www.xxx.com/repos") {
// authentication(userName: "admin", password: "admin")
// }
pom.groupId = 'com.insworks.plugin'
pom.artifactId = 'framework-plugin'
pom.version = '1.0.3'
repository(url: uri("$rootDir/global/repo"))
}
}
}

如果工程在本地引用了第三方jar包, 那么直接使用uploadArchives指令是无法将第三方jar包打进去的

解决方案如下:

方案一: 将jar包源代码拷入工程,然后一并打包(不推荐 )

方案二: 只需加入以下代码

1
2
3
4
5
6
7
8
task makeJar(type: Jar) {
//以下是需要打包进jar包中的内容
from(project.zipTree("libs/dom4j-2.1.1.jar"))
}
//包含第三方jar
artifacts {
archives makeJar
}

附加

  1. 如果我想打包源码, 那么加入以下代码:
1
2
3
4
5
6
7
8
9
10
11
// 源代码一起打包(不需要打包源代码的不要添加这几行)
task androidSourcesJar(type: Jar) {
classifier = 'sources'
//指定源码目录
source = android.sourceSets.main.java.srcDirs
//加入第三方jar 这个是字节码文件
from(project.zipTree("libs/dom4j-2.1.1.jar"))
}
artifacts {
archives androidSourcesJar
}
  1. 如果我想打包文档, 那么加入以下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//生成文档注释
task androidJavadocs(type: Javadoc) {
//如果出现错误 忽略不计
failOnError = false
//指定源码目录
source = android.sourceSets.main.java.srcDirs
ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
classpath += files(ext.androidJar)
}
//将文档打包成jar
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
//包含文档
artifacts {
archives androidJavadocsJar
}
  1. 如果我想将两个jar包合并成一个jar包, 那么使用以下代码:
1
2
3
4
5
6
7
8
9
task makeJar(type: Jar) {
//以下是需要打包进jar包中的内容
from(project.zipTree("libs/dom4j-2.1.1.jar"))
from(project.zipTree("build/libs/lib_framework_plugin.jar"))
//合体后的jar包名称
archiveName = "framework-plugin-1.0.1.jar"
//输出目录
destinationDir = file('build/libs')
}

然后执行makeJar指令

成功后,可以在build目录中找到合并后的jar包

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

解决android中EditText设置末尾省略号不生效的情况

发表于 2019-12-28

在Textiew中可以通过设置TextView的属性

1
android:maxEms

和

1
android:ellipseize

来使过多的文字显示为省略号,但在在EditText中设置只这两个属性则不行,

android默认只有在文字不可编辑的状态下才可以显示这些效果,但是EditText重写了这个属性,使得文字默认都是可以编辑的。

所以若想要呈现TextView的效果,必须加上以下属性

1
android:editable= "false"

另外EditText不支持跑马等的效果.咱们来看看android源码

1
2
3
4
5
6
7
override
public void setEllipsize(TextUtils.TruncateAt ellipsis) {
if (ellipsis == TextUtils.TruncateAt.MARQUEE) {
throw new IllegalArgumentException("EditText cannot use the ellipsize mode TextUtils.TruncateAt.MARQUEE");
}
super.setEllipsize(ellipsis);
}

如果设置跑马灯效果,会直接抛出异常

那么有同学会说了,editable设为false, 那岂不是没法进行文本编辑了?

这里呢, 建议大家自定义EditText并重写onTouchEvent方法,从外部进行控制是否获取焦点, 如下:

1
2
3
4
5
6
class FocusEditText(context: Context, attrs: AttributeSet) : EditText(context, attrs){
override fun onTouchEvent(event: MotionEvent?): Boolean {
return isEnabled && super.onTouchEvent(event)
}

}

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

将代码发布至jcenter步骤

发表于 2019-12-24

Step 1

在项目的build.gradle中buildscript中添加如下脚本,使用最新版本号,在https://github.com/novoda/bintray-release查看:

     

buildscript {
repositories {
    jcenter()
}
dependencies {
    //classpath 'com.novoda:bintray-release:<latest-version>'
    classpath 'com.novoda:bintray-release:0.8.1'
}
}

Step 2

在库模块(需要上传的模块)的build.gradle中添加:

apply plugin: 'com.novoda.bintray-release'

publish {
    userOrg = '组织ID' //bintray账户下某个组织id 个人用户填写账户名
    groupId = 'com.insworks.plugin' //maven仓库下库的包名,一般为模块包名
    artifactId = 'framework-plugin' //项目名称
    publishVersion = '1.0.2' //版本号
    desc = '组件化架构插件' //项目介绍,可以不写
    website = '' //项目主页,可以不写
}
tasks.withType(Javadoc) {//防止编码问题
    options.addStringOption('Xdoclint:none', '-quiet')
    options.addStringOption('encoding', 'UTF-8')
    options.addStringOption('charSet', 'UTF-8')
}

Step 3

在bintray中创建仓库并获取仓库key。Bintray网站点击右上角用户名–>Edit Your Profile -> API Key –>输入密码–>Submit–>Show。

Step 4

使用指令上传代码:

在Android Studio的Terminal面板中执行下面命令,其中BINTRAY_USERNAME替换为你的binatray用户名,BINTRAY_KEY替换为上面获取的API Key,-PdryRun=false会上传到仓库中,如果为true,只会执行gradle任务,但不会上传。替换完成后回车执行

示例
gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false

我的
gradlew clean build bintrayUpload -PbintrayUser=songjianziana -PbintrayKey=5e7f0ea95e85af4cceca20cb109fb50ad7cba6bc -PdryRun=false

或者使用gradle快捷上传, 需要先编译项目(切记)

Step 5

Android Studio中配置https://bintray.com仓库地址

maven { url 'https://dl.bintray.com/songjianzaina/insoan' }

和然后在app模块build.gradle中添加依赖:

1
implementation 'com.xxx.xxx.xx.:1.0.0'

Step 6

添加到JCenter。点击“Add to JCenter”,填写项目介绍,点击Send发送,然后等待审核,审核成功之后会发送站内通知

上传成功之后将maven { url 'https://dl.bintray.com/songjianzaina/insoan' }替换成jcenter即可

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android源码下载

发表于 2019-12-24

Android源码下载支持的系统目前只有Ubuntu和Mac OS两种操作系统, 本次以Ubuntu系统为例.

官方网站: http://source.android.com/source/downloading.html

下载单独项目的源码:https://github.com/android

  1. 下载Git(版本控制工具). 调出命令行: ctrl + alt + T

    1
    sudo apt-get install git   (下载地址在源中,"系统设置/软件和更新",路径:/etc/apt/sources.list)
  2. 安装curl(上传和下载数据的工具).

    1
    sudo apt-get install curl
  3. 安装repo(一个基于git的版本库管理工具, 这里用于自动批量下载android整个项目.).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 创建目录
    mkdir ~/bin

    // 下载repo脚本到本地bin文件夹下
    curl http://android.git.kernel.org/repo >~/bin/repo (官网:curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo)
    // 如果上面下载失败, 采用下面这种方式
    curl "http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo" >~/bin/repo

    // 给所有用户追加可执行的权限
    chmod a+x ~/bin/repo

    // 临时把repo添加到环境变量中, 方便后面执行.
    // 注意: 每次重启ubuntu之后此环境变量失效, 重新配置就可以了.
    export PATH=~/bin:$PATH
  4. 创建文件夹, 用于存放下载的Android源码.

    1
    2
    3
    4
    5
    6
    7
    // 创建目录
    mkdir ~/android_source

    // 修改权限
    chmod 777 ~/android_source

    cd ~/android_source
  5. 初始化库.

    1
    2
    3
    4
    5
    6
    7
    8
    // 需要先配置git的用户信息
    git config --global user.email "dai_zhenliang@163.com"
    git config --global user.name "haha"

    repo init -u https://android.googlesource.com/platform/manifest -b android-2.3_r1

    // 如果上面初始化失败, 用下面的代码
    repo init -u git://codeaurora.org/platform/manifest.git -b gingerbread
    当屏幕出现以下信息表示成功初始化
    1
    repo initialized in /home/haha/android_source
  6. 开始同步下载.

    1
    repo sync

    注意: 下载过程中, 因为网络问题, 可能会中断下载. 当中断下载时, 继续使用repo sync命令继续下载.

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android源码编译

发表于 2019-12-24

在编译源码之前需要做一些准备操作, 详细步骤如下:

1. 安装JDK, google官方要求编译2.3源码需要JDK1.6.

  • 1). 下载JDK1.6, 下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html、http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin

  • 2). 创建目录.

    1
    sudo mkdir /usr/java
  • 3). 在文件系统中右击上面的创建的文件夹,选择“以管理员权限打开”,然后把下载好的jdk-6u45-linux-x64.bin拖动到/usr/java目录中

  • 4). 添加可执行权限.

    1
    sudo chmod 755 /usr/java/jdk-6u45-linux-x64.bin
  • 5). 解压.

    1
    2
    cd /usr/java
    sudo ./jdk-6u45-linux-x64.bin
  • 6). 配置环境变量.

    1
    2
    3
    export JAVA_HOME=/usr/java/jdk1.6.0_45
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  • 7). 验证是否成功.

    1
    java -version

2. 安装其他编译时依赖的软件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo apt-get install gnupg
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install gperf
sudo apt-get install zip
sudo apt-get install curl
sudo apt-get install build-essential
sudo apt-get install libesd0-dev
sudo apt-get install libwxgtk2.8-dev
sudo apt-get install libsdl-dev
sudo apt-get install lsb-core
sudo apt-get install lib32readline-gplv2-dev
sudo apt-get install g++-multilib
sudo apt-get install lib32z1-dev
sudo apt-get install libswitch-perl

安装注意事项:

3. 开始编译, 在源码的目录下, 执行一下命令:

1
2
3
cd ~/android_source
make clean(如果之前有编译过,则需要调用这个命令)
make

注意: ubuntu自带的源中速度比较慢, 有些软件找不到, 所以需要修改为国内的源, 修改源步骤如下:

  • 1). 备份ubuntu自带的源.

    1
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.old
  • 2). 修改源文件.

    1
    sudo gedit /etc/apt/sources.list
  • 3). 这时会弹出一个文本编辑框, 先删除所有内容, 然后把以下内容拷贝进去, 并保存.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

    deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
  • 4). 保存之后, 更新数据源.

    1
    sudo apt-get update

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

git stash 详解

发表于 2019-12-24

应用场景

  1. 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
  2. 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。

总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。

这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。

注: stash只对被追踪的文件才有效, 也就是说 是针对被add的文件 。

命令详解

1. git stash

能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: src/main/java/com/wy/CacheTest.java
modified: src/main/java/com/wy/StringTest.java

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash
Saved working directory and index state WIP on master: b2f489c second

$ git status
On branch master
nothing to commit, working tree clean

2. git stash save

作用等同于git stash,区别是可以加一些注释,git stash save “test1”的效果 如下:

1
stash@{0}: On master: test1

3. git stash list

查看当前stash中的内容

4. git stash pop

将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。
注:该命令将堆栈中最近保存的内容删除(栈是先进后出)
顺序执行git stash save “test1”和git stash save “test2”命令,效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1

$ git stash pop
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: src/main/java/com/wy/StringTest.java

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (afc530377eacd4e80552d7ab1dad7234edf0145d)

$ git stash list
stash@{0}: On master: test1

可见,test2的stash是首先pop出来的。
如果从stash中恢复的内容和当前目录中的内容发生了冲突,也就是说,恢复的内容和当前目录修改了同一行的数据,那么会提示报错,需要解决冲突,可以通过创建新的分支来解决冲突。

5. git stash apply

将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应用到工作目录中,适应于多个分支的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git stash apply
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: src/main/java/com/wy/StringTest.java

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1

堆栈中的内容并没有删除。
可以使用git stash apply + stash名字(如stash@{1})指定恢复哪个stash到当前的工作目录。

6. git stash drop + 名称

从堆栈中移除某个指定的stash

7. git stash clear

清除堆栈中的所有 内容

8. git stash show

查看堆栈中最新保存的stash和当前目录的差异。

1
2
3
$ git stash show
src/main/java/com/wy/StringTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

git stash show stash@{1}查看指定的stash和当前目录差异。
通过 git stash show -p 查看详细的不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ git stash show -p
diff --git a/src/main/java/com/wy/CacheTest.java b/src/main/java/com/wy/CacheTest.java
index 6e90837..de0e47b 100644
--- a/src/main/java/com/wy/CacheTest.java
+++ b/src/main/java/com/wy/CacheTest.java
@@ -7,6 +7,6 @@ package com.wy;
*/
public class CacheTest {
public static void main(String[] args) {
- System.out.println("git stash test");
+ System.out.println("git stash test1");
}
}
diff --git a/src/main/java/com/wy/StringTest.java b/src/main/java/com/wy/StringTest.java
index a7e146c..711d63f 100644
--- a/src/main/java/com/wy/StringTest.java
+++ b/src/main/java/com/wy/StringTest.java
@@ -12,7 +12,7 @@ public class StringTest {

@Test
public void test1() {
- System.out.println("=================");
+ System.out.println("git stash test1");
System.out.println(Strings.isNullOrEmpty(""));//true
System.out.println(Strings.isNullOrEmpty(" "));//false
System.out.println(Strings.nullToEmpty(null));//""

同样,通过git stash show stash@{1} -p查看指定的stash的差异内容

9. git stash branch

从最新的stash创建分支。

应用场景:当储藏了部分工作,暂时不去理会,继续在当前分支进行开发,后续想将stash中的内容恢复到当前工作目录时,如果是针对同一个文件的修改(即便不是同行数据),那么可能会发生冲突,恢复失败,这里通过创建新的分支来解决。可以用于解决stash中的内容和当前目录的内容发生冲突的情景。
发生冲突时,需手动解决冲突。

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…454647…51

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

505 日志
145 标签
RSS
© 2026 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%