实习笔记-5

git相关知识

新建代码库

1
2
3
4
5
6
7
8
## 当前目录 新建一个Git代码库
$ git init

## 新建一个目录,将其初始化为Git代码库
$ git init [project-name]

## 下载一个项目和它的整个代码历史
$ git clone [url]

配置

1
2
3
4
5
6
7
8
9
## 显示当前的Git配置
$ git config --list

## 编辑Git配置文件
$ git config -e [--global]

## 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

增加/删除文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## 添加指定文件到暂存区
$ git add [file1] [file2] ...

## 添加指定目录到暂存区,包括子目录
$ git add [dir]

## 添加当前目录的所有文件到暂存区
$ git add .

## 添加每个变化前,都会要求确认
## 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

## 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...

## 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]

## 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]

-p 参数的提示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk nor any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk nor any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

代码提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 提交暂存区到仓库区
$ git commit -m [message]

## 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

## 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a

## 提交时显示所有diff信息
$ git commit -v

## 使用一次新的commit,替代上一次提交
## 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

## 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

分支

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
## 列出所有本地分支
$ git branch

## 列出所有远程分支
$ git branch -r

## 列出所有本地分支和远程分支
$ git branch -a

## 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

## 以远程分支为基础新建一个分支,并切换到该分支
$ git checkout -b [branch] origin/[remote-branch]

## 新建一个分支,指向指定commit
$ git branch [branch] [commit]

## 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]

## 切换到指定分支,并更新工作区
$ git checkout [branch-name]

## 切换到上一个分支
$ git checkout -

## 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]

## 合并指定分支到当前分支
$ git merge [branch]

## 选择一个commit,合并进当前分支
$ git cherry-pick [commit]

## 删除分支
$ git branch -d [branch-name]

## 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

标签

  • Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)。
  • You have to commit first before tagging
    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
    27
    28
    29
    30
    31
    32
    ## 列出所有tag
    $ git tag
    ## 查看tag的信息
    $ git show [tag]

    ## 新建一个tag在当前commit
    $ git tag -a v1.4 -m "my version 1.4"

    ## 轻量标签
    $ git tag [tag]
    ## 轻量标签本质上是将提交校验和存储到一个文件中,没有保存任何其他信息。

    ## 新建一个tag在指定commit
    $ git tag [tag] [commit]

    ## 删除本地tag
    $ 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]

查看信息

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
## 显示有变更的文件,本地未commit的文件
$ git status

## 显示当前分支的版本历史
$ git log

## 显示commit历史,以及每次commit发生变更的文件
$ git log --stat

## 搜索提交历史,根据关键词
$ git log -S [keyword]

## 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s

## 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature

## 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

## 显示指定文件相关的每一次diff
$ git log -p [file]

## 显示过去5次提交
$ git log -5 --pretty --oneline

## 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn

## 显示指定文件是什么人在什么时间修改过
$ git blame [file]

## 显示暂存区和工作区的差异
$ git diff

## 显示暂存区和上一个commit的差异
$ git diff --cached [file]

## 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

## 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

## 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"

## 显示某次提交的元数据和内容变化
$ git show [commit]

## 显示某次提交发生变化的文件
$ git show --name-only [commit]

## 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]

## 显示当前分支的最近几次提交
$ git reflog

远程同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## 下载远程仓库的所有变动
$ git fetch [remote]

## 显示所有远程仓库
$ git remote -v

## 显示某个远程仓库的信息
$ git remote show [remote]

## 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]

## 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]

## 上传本地指定分支到远程仓库
$ git push [remote] [branch]

## 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force

## 推送所有分支到远程仓库
$ git push [remote] --all

撤销

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
27
28
29
30
31
## 恢复暂存区的指定文件到工作区
$ git checkout [file]

## 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]

## 恢复暂存区的所有文件到工作区
$ git checkout .

## 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]

## 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard

## 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]

## 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]

## 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]

## 新建一个commit,用来撤销指定commit
## 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]

## 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

git分支管理

master分支和开发分支

  • 主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。
创建develop分支
1
git checkout -b develop master
合并
1
2
3
4
5
## 切换到Master分支
git checkout master

## 对Develop分支进行合并
git merge --no-ff develop
  • --no-ff参数
    • 默认情况下,Git执行”快进式合并”(fast-farward merge),会直接将Master分支指向Develop分支。
    • 使用--no-ff参数,会执行正常合并,在Master分支上生成一个新节点

功能分支

  • 为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。

功能分支的名字,可以采用feature-*的形式命名。

创建一个功能分支:
1
git checkout -b feature-x develop
开发完成后,将功能分支合并到develop分支:
1
2
3
git checkout develop

git merge --no-ff feature-x
删除feature分支:
1
git branch -d feature-x

预发布分支

  • 指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。

  • 预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。

创建一个预发布分支:
1
git checkout -b release-1.2 develop
确认没有问题后,合并到master分支:
1
2
3
4
5
6
git checkout master

git merge --no-ff release-1.2

## 对合并生成的新节点,做一个标签
git tag -a 1.2
再合并到develop分支:
1
2
3
git checkout develop

git merge --no-ff release-1.2
最后,删除预发布分支:
1
git branch -d release-1.2

修补bug分支

  • 修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。
创建一个修补bug分支:
1
2
git checkout -b fixbug-0.1 master
## 以master分支为基础,创建一个分支
修补结束后,合并到master分支:
1
2
3
4
5
6
7
8
git checkout master
## 切换到master分支

git merge --no-ff fixbug-0.1
#合并分支

git tag -a 0.1.1
## 打tag
再合并到develop分支:
1
2
3
git checkout develop

git merge --no-ff fixbug-0.1
最后,删除”修补bug分支”:
1
git branch -d fixbug-0.1

版本回退-撤销文件修改(针对文件修改的恢复)

自定义组件之–自定义xml属性

step1. 自定义属性名称

  • 在values中创建一个xml文件,并且在其中写上你需要的自定义属性的名称以及类型。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <declare-styleable name="MyTitle">
    <!--name 指向自定义组件的类名-->
    <attr name="textColor" format="color"/>
    <attr name="titleText" format="string"/>
    <attr name="leftText" format="string"/>
    <attr name="rightText" format="string"/>
    </declare-styleable>
    </resources>

step2. 将属性名称与控件关联

1
2
3
4
5
6
7
8
9
10
11
//从xml的属性中获取到字体颜色与string
TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.MyTitle);
colorText=ta.getColor(R.styleable.MyTitle_textColor,Color.BLACK);
textLeft=ta.getString(R.styleable.MyTitle_leftText);
textTitle=ta.getString(R.styleable.MyTitle_titleText);
textRight=ta.getString(R.styleable.MyTitle_rightText);
ta.recycle();
//public void recycle ():
//Give back a previously retrieved array, for later re-use.
//回收 TypedArray,用于后续调用时可复用之。当调用该方法后,不能再操作该变量。
//该类没有公共的构造函数,只提供静态方法获取实例,显然是一个典型的单例模式。这个 array 是从一个 array pool的池中获取的。

step3. 从第三方命名空间获取到自定义属性名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:my_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--添加这个 命名空间-->
<com.example.double2.viewxmltest.MyView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_dark"
my_view:leftText="Back"
my_view:rightText="Go"
my_view:textColor="#fff"
my_view:titleText="MyViewTest"/>
<!--添加属性-->
</RelativeLayout>
作者

Meow Meow Liu

发布于

2022-03-22

更新于

2025-04-15

许可协议

评论