Git使用学习笔记
# Git知识点
- 将发生变化的文件全部保存。为了减少磁盘使用,只保存发生变化的文件。使用sha1算法的20字节(40位)值作为对象的唯一标识。
- 三个域:
- repository -- 仓库
- working directory -- 工作区
- staging area/index -- 过渡区
- 三个对象:
- tree :记录文件名,及指向blob的指针
- blob :记录文件内容
- commit :和tree是一一对应的
find .git/objects/ -type f |wc -l
git cat-file -t sha1码
git show -s --pretty=raw xxx
1
2
3
2
3
- 三个引用:
HEAD
branch
remote branch
- 其他: 对象是静止的,引用是动态的。
# git配置
# 1.文件位置
用户目录下的全局配置文件:
C:\Users\Administrator\.gitconfig
各仓库自己的配置文件:
D:\gitdemo\.git\config
# 2.用户配置:
# 全局,
git config --global user.name 'pyli.xm'
git config --global user.email 'pyli.xm@gmail.com'
# 局部,
git config user.name 'pyli.xm'
git config user.email 'pyli.xm@gmail.com'
1
2
3
4
5
6
2
3
4
5
6
# 命令
# 1、git初始化
新项目创建:
echo "# test" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/pylixm/test.git
git push -u origin main
1
2
3
4
5
6
7
2
3
4
5
6
7
项目目录已存在创建:
git remote add origin https://github.com/pylixm/test.git
git branch -M main
git push -u origin main
1
2
3
2
3
# 2、添加文件
git add # 文件名
1
# 3、提交
git commit -m '说明'
# 添加并提交
git commit -a -m '说明'
# 移除受控文件,
git rm -r -n --cached */Runtime/\* #预览剔除版本控制的文件 --cached 保留本地
git rm -r --cached */Runtime/\* #剔除版本控制
git commit -am "移除Runtime目录下所有文件的版本控制"
git push
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4、标签
# 创建:
git tag 标签名
# 打包:
git archive --format=tar --prefix=gitdemo/ 标签名|gzip > /gitdemo/gitdemo.tar.gz
# 检出:
git checkout 标签名
# 删除
git tag -d tagname
# 提交tag到远程
git push [origin] --tags
# 删除远程tag
$ git push origin :refs/tags/tagname
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 5、分支
#列出
git branch -l/-all
#创建:
git branch 分支名
#分支提交
git push origin 分支名
#分支切换
git checkout 分支名
# 创建分之并切换分之
git checkout -b 分支名
# 拉取远程分支并在本地创建
git checkout -b 分支名 origin/分支名
#分支合并:
git merge 分支名A 在B分之下执行,将A合并到B分支上。
#删掉分支
git branch -D 分支名A
#删除远程分支(>v1.7)
git push origin --delete <branchName>
# 修改分支名称
> git branch -m devel develop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 6、回溯
单个文件:
git log -3
1
# 使用此方法回溯单个文件的版本。
git check f0a843a92216d103cec18c746dd7a0b1ed5b0020 [文件路径]
1
2
2
整个版本库:
本地库回滚:
git reset --hard <commit ID号> 或者 git reset --hard HEAD^
- –soft是保留工作区的内容和add提交,只是切换指针
- –hard是什么都不保留
- 不加参数是保留工作区的内容但是不保留add提交
远程库回滚:
原理:先将本地分支退回到某个commit,删除远程分支,再重新push本地分支
操作步骤:
1、git checkout the_branch
2、git pull
3、git branch the_branch_backup //备份一下这个分支当前的情况
4、git reset --hard the_commit_id //把the_branch本地回滚到the_commit_id
5、git push origin :the_branch //删除远程 the_branch
6、git push origin the_branch //用回滚后的本地分支重新建立远程分支
7、git push origin :the_branch_backup //如果前面都成功了,删除这个备份分支
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 7、查看当前修改了那些文件
# 8、合并
# 分支合并:
git merge 分支名A 在B分之下执行,将B合并到A分支上。
# 在B分之下执行,将A合并到B分支上。
git merge --no-ff 分支A
# 合并提交
> git rebase -i HEAD~3
看到如下信息:
pick:*******
pick:*******
pick:*******
修改成:
pick:*******
squash:*******
squash:*******
保存退出,提示录入commit信息,保存即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 9、其他
# 修改历史commit信息
> git rebase -i HEAD~3(3位从当前commit往前的个数)
看到如下信息:
pick:*******
pick:*******
pick:*******
如果你要修改哪个,就把那行的pick改成edit,然后退出。
> git commit --amend
> git rebase --continue
# 合并当前分支的commit
>git rebase -i HEAD~3
看到如下信息:
pick:*******
pick:*******
pick:*******
- Commands:
- p, pick = git会应用这个补丁,以同样的提交信息(commit message)保存提交
- r, reword = ugit会应用这个补丁,但需要重新编辑提交信息
- e, edit = git会应用这个补丁,但会因为修订(amending)而终止
- s, squash = git会应用这个补丁,但会与之前的提交合并
- f, fixup = git会应用这个补丁,但会丢掉提交日志
- x, exec = git会在shell中运行这个命令
- d, drop = 直接删除该commit
从以上关键字说明,我们可以看出,与之前分支合并则使用 squash 关键字。
把rebase信息改为如下:
pick:*******
squash:*******
squash:*******
保存退出,会看到合并之后的所有commit的提交信息,大概如下:
# This is a combination of 2 commits.
# This is the 1st commit message:
init readme
# This is the commit message #2:
Create CONTRIBUTING.md
直接修改保存即可。注意此处的提交信心不能为空。
# 查看远端和本地分支情况
> git remote show origin
# 根据远端分支修建本地分支,将远端分支删除的分支在本地也删除
> git fetch -p / git remote prune origin
# 查看文件提交情况
> git blame 文件名
显示格式:
commit ID | 代码提交作者 | 提交时间 | 代码位于文件中的行数 | 实际代码
# 查看每次提交的信息
> git show commitID
# 撤销 reset
$ git reflog
b7057a9 HEAD@{0}: reset: moving to b7057a9
98abc5a HEAD@{1}: commit: more stuff added to foo
b7057a9 HEAD@{2}: commit (initial): initial commit
$ git reset --hard 98abc5a
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
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
更多实例参考 git --help
# 参考资料
上次更新: 2023/09/19, 09:03:18