Git

1、Git工作流程

工作区域

工作区(Workspace):进行开发改动的地方,是你当前看到的,也是最新的。平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。

暂存区(Index/Stage):保存了下次将要提交的文件列表信息。在.git目录下的index文件,暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp),可以使用git status查看暂存区的状态。暂存区标记了当前工作区中,哪些内容是被git管理的。当完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。

本地仓库(Repository):保存了对象被提交过的各个版本。相比工作区和暂存区的内容要旧,git commit后同步index的目录树到本地仓库。

远程仓库(Remote):远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,它的内容是最旧的。如Github、Gitee或局域网的一台电脑。

文件状态

已修改(modified):表示修改了文件,但还没保存到数据库中。

已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

已提交(commited):表示数据已经安全的保存在本地数据库中。

分支(branch)

在开发软件时,可能有多人同时为一个软件开发功能或修复BUG,可能存在多个Release版本,并且需要对各个版本进行维护。因此,Git的分支功能应运而生。

分支是为了将修改记录的整体流程分叉保存,分叉后的分支不受其他分支的影响,所以在同一个数据库里可以同时进行多个修改。在完成修改后可合并到主分支。

2、Git常用命令

2.1、Git配置

1、配置用户信息

1
2
git config --global user.name "LinZhu"
git config --global user.email XXXX@example.com

2、配置默认文本编辑器

1
git config --global core.editor vim

3、查看所有配置信息及所在文件

1
git config --list --show-origin

2.2、Git分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#创建分支
git branch <branchName>
#查看分支
git branch
#查看每一个分支的最后一次提交,跟踪分支,以及分支与本地分支的对比情况
git branch -vv
#删除分支
git branch -d <branchName>
#强制删除分支
git branch -D <branchName>
#切换分支
git checkout <branchName>
#新建一个分支并切换到该分支
git checkout -b <branchName>
#跟踪分支(从一个远程跟踪分支检出一个本地分支会自动创建“跟踪分支”,跟踪分支是与远程分支有直接关系的本地分支。当克隆一个仓库时,它会自动的创建一个跟踪origin/master的master分支)
git checkout --track <remote>/<branch>
#新建一个本地分支追踪远程分支,并设置本地分支的名字
git checkout -b <branch> <remote>/<branch>
1
2
3
4
5
6
7
8
9
10
11
#更新本地工作区

#同步远程数据到本地仓库,但不会对工作区产生影响
git fetch
#合并从远程更新的数据
git merge

#替代方法(效果等同于git fetch + git merge)
git pull
#推荐使用 加参数 -r
git pull -r
1
2
#删除远程分支
git push <remote> --delete <branch>
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
#分支合并

git merge
git rebase

#(一)git merge
#使用git merge命令将master分支合并到feature分支中
git checkout feature
git merge master
#使用git merge会在feature分支中新增一个新的merge commit,然后将两个分支的历史联系在一起。
#(1)使用merge是很好的方式,因为它是一种非破坏性的操作,对现有分支不会以任何方式被更改。
#(2)另一方面,也意味着feature分支每次需要合并上游更改时,它都将产生一个额外的合并提交。
#(3)如果master提交非常活跃,这会严重污染你的feature分支历史记录。不过这个问题可以使用git log来缓解。


#(二)git rebase
#使用git rebase命令将master分支合并到feature分支中。
git checkout feature
git rebase master

#(1)rebase会将整个feature分支移动到master分支的顶端,从而有效整合所有master分支上的提交。
#(2)rebase通过为原始分支中的每个提交创建全新的commits来重写项目历史记录,特点是仍然会在feature分支上形成线性提交。
#(3)rebase可以获得更清晰的项目历史。消除了git merge所需的不必要的合并提交。

#使用原则:
#(1)融合代码到公共分支的时使用git merge,而不用git rebase
#(2)融合代码到个人分支的时候使用git rebase,可以不污染分支的提交记录,形成简洁的线性提交历史记录。

2.3、修改和提交

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#(1)提交至暂存区

#提交readme.md文件至暂存区
git add readme.md
#提交所有修改至暂存区
git add .


#(2)提交至本地仓库

#将git add到暂存区的文件提交到本地仓库。
git commit
#会先把所有已经track的文件的改动`git add`进来,然后提交,不用先暂存
git commit -a
# 增补提交,会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消。
git commit --amend


#(3)查看当前文件状态
git state
#状态简览
git state -s


#(4)查看修改
#查看未暂存文件修改
git diff
#查看已暂存文件的修改
git diff -cached
git diff -staged
#查看最后提交的修改,即查看git仓库的最后一次变动
git show


#(5)删除文件

#删除文件/文件夹,并把它从git的仓库管理系统中移除
git rm readme.md
git rm -f readme.md # -f 强制删除
git rm --cached readme.md #将文件从暂存区删除,工作目录中仍保留
git rm -r myDir #-r 递归删除该目录下的所有子目录和文件
git rm -r *#进入某目录,执行该命令将删除该目录下的所有子目录和文件


#(6)移动/重命名

#移动或重命名一个文件、目录、软链接
git mv
#重命名文件
git mv fileName newFileName
#移动文件位置
git mv text.txt myDir


#(7)回退版本

#退回某一次提交的版本
git reset [--soft|--mixed|--hard] [HEAD]
# 1、--mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
# 2、--soft 参数用于回退到某个版本。
# 3、--hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。

#回退所有内容到上一个版本
git reset HEAD^
#回退到上上上个版本
git reset HEAD~3
#回退指定文件到上一个版本
git reset HEAD^ fileName
# 将本地的状态回退到和远程的一样
git reset --hard origin/master

# HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上个版本,以此类推。
# 可以使用数字表示。HEAD~0表示当前版本,HEAD~1表示上一个版本,以此类推


#(8)贮藏操作
#用于将更改贮藏在脏工作目录中。(切换分支时,不想提交正在进行中的工作,所以贮藏这些变更到一个栈上,你可以在任何时候重新应用这些改动。)
git stash
#查看贮藏
git stash list
#应用最近一个贮藏,应用后删除
git stash pop
#应用指定的贮藏
git stash apply stash@{2}
#删除贮藏
git stash drop <stashName>


# (9)git cherry-pick
# 将指定的提交(commit)应用于其他分支
1、举例来说,有如下Master和Feature分支:
a - b - c - d Master
\
e - f - g Feature
现在将提交f应用到Master分支,
git checkout Master
git cherry-pick f
应用之后,分支结构如图:
a - b - c - d - f Master
\
e - f - g Feature
2、cherry-pick一次转移多个提交
git cherry-pick <HashA> <HashB>

#cherry-pick中发生代码冲突解决
第一步将修改的文件重新加入暂存区(git add .)
运行 git cherry-pick --continue 让cherry-pick继续执行。
其他参数:--abort 放弃合并,回到操作前的样子;--quit 退出。


2.4、提交日志

1
2
3
4
#查看历史提交记录
git log
#查看指定文件的修改记录
git blame <fileName>

3、Repo简介

一个Python实现的Git代码脚本,用于整合多个Git代码库,方便在Android环境中使用Git。