Repository navigation
Expand file tree
/
Copy pathgitLearn.txt
More file actions
171 lines (154 loc) · 7.92 KB
/
Copy pathgitLearn.txt
File metadata and controls
171 lines (154 loc) · 7.92 KB
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
一. 创建版本库
(1) 初始化一个Git仓库,使用git init命令
(2) 添加文件到Git仓库,分为两步:
第一步,使用命令git add <file> 注意:可以反复使用多次,添加多个文件;
实际上是把文件从工作区(Working Directory)添加到了暂存区(stage)
第二步,使用命令git commit,完成将文件提交到仓库;
实际上是把文件从暂存区添加到了当前分支(master)
例:
git add readme.txt
git commit -m "what have you done"
二. 时光机穿梭
(1) 要随掌握工作区的状态,使用git status命令
(2) 如果git status告诉你文件被修改过,用git diff可以查看修改内容
(3) HEAD指向的版本就是当前版本,因此,git允许我们在版本之间穿梭,使用命令
git reset --hard commit_id
回到上一个版本,使用命令
git reset --hard HEAD^
回到上上个版本,使用命令
git reset --hard HEAD^^
回到100个以前的版本,使用命令
git reset --hard HEAD~100
(4) 穿梭前,用git log可以查看提交历史,以便确保要退回到哪个版本
(添加--pretty=oneline单行显示)
(5) 要重返未来,用git reflog查看命令历史,以确保要回到未来的哪个版本
三. 管理修改
Git跟踪的是修改而不是文件,每次修改后,如果不add到暂存区,则不会加入到
commit中去
四. 撤销修改
场景1 : 当你改乱了工作区的某个文件的内容,想直接丢弃工作去的修改时,
使用命令:git chechout -- file_name
场景2 : 当你不但改乱了工作区的某个文件,而且将文件add到了暂存区,想要丢弃
修改,分两步走:
第一步: 使用命令 ; git reset HEAD file_name,就退回到场景1
第二步: 按照场景1操作恢复即可
场景3 : 已经提交了不适合的修改到版本库,想要撤销修改,参考(二)中回到上一个
版本的方法
五. 删除文件
命令git rm用于删除一个文件,如果一个文件已经被提交到了版本库,那么永远不用
担心误删,但是只能恢复到最新版本,会丢失最近一次提交后修改的内容
使用命令: git checkout -- file_name恢复
使用命令: git rm
git commit -m "what you do"彻底删除
六. 远程仓库
第一步: 创建SSH Key 在用户目录下,看看有没有.shh目录,若有看看.shh下有没
有id_rsa和id_rsa.pub两个文件,如果没有,使用命令:
ssh-keygen -t rsa -C "youremail@example.com"
第二步. 登陆GitHub,打开"Account Setting",选择"Add SSH Key",然后填上任意
Title,在Key文本框中粘贴id_rsa_pub文件的内容
到这里已经获取了远程仓库
添加远程库
关联一个远程库,使用命令:
git remote add origin git@github.com:path/repo-name.git
关联后,使用命令:
git push -u origin master
第一次推送master分支的内容
此后,没一次本地提交后,只要有必要,就可以使用命令:
git push origin master
推送新的修改
从远程仓库克隆
第一步: 登陆Github,创建一个新的仓库,名字就叫gitSkills
第二步: 使用命令:
git clone git@github.com:SBaof/gitSkills.git
完成远程仓库的克隆
如果有多个人协作开发,则每一个人各自从远程仓库克隆一份就OK了
小结:要克隆一个远程仓库,第一必须知道仓库的地址,然后使用git clone命令完
成克隆; Git支持多种协议,包括http,但是通过ssh支持的原生git协议速度最快
七. 分支管理
创建与合并分支
Git鼓励大量使用分支
查看分支: git branch
创建分支: git branch <name>
切换分支: git checkout <name>
创建+切换分支: git checkout -b <name>
合并某分支到当前分支: git merge <name>
删除分支: git branch -d <name>
解决冲突
当master分支和feature1分支各自都分别有心的提交后,git无法执行快速合并,只
能试图把各自的修改合并起来,但这种合并可能会有冲突
通过git status命令可以知道冲突的文件
**<<<<<<<<, ========, >>>>>>>>标记出不同分支的内容
修改后再次提交即可
用带参数的git log可以查看分支合并的情况
使用命令:
git log --graph --pretty=oneline --abbrev-commit
最后可以删除feature1分支了
分支管理策略
合并分支时,如果可能,Git还会用Fast Forward模式, 但是这种模式下,删除分支
后会,会丢掉分支信息,使用参数--no-ff,可以禁用Fast forward
例:使用命令:
git merge --no-ff -m "merge with no-ff" dev
由于本次合并要创建一个新的commit,所以要加上-m参数, 把commit描述写进去
分支策略
在实际开发中,我们应该按照以下几个基本原则进行分支管理:
首先,master分支应该是非常稳定的, 也就是仅用来发布新的版本,平时不在上边干
活; 干活都在dev分支上, 也就是说,dev分支是不稳定的, 到某个时候,比如1.0版
本发布时, 再把dev分支合并到master分支上, 在master分支上发布1.0版本;
每个人都在dev分支上干活, 每个人都有自己的分支,时不时的往dev分支上合并就
可以了
小结: Git分支十分强大,团队开发中应该充分利用
合并分支时, 加上--no-ff参数就可以使用普通模式合并,合并后的历史有分
支,能看出来曾经是否做过合并,而fast forward合并就看不出来曾经做过合
并
bug分支
修复bug时,我们通常会创建bug分支进行修改,然后进行合并,最后删除bug分支
当手头的工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后
,再使用命令: git stash pop,回到工作现场
首先使用命令:git stash list查看stash的内容
回到工作现场的方法有两种:
1) git stash pop
恢复工作现场,并且直接删除stash的内容
2) git stash apply
恢复现场
git stash drop
删除stash的内容
Feature分支
添加一个新功能时,不希望因为一些实验性质的代码,把主分支搞乱,所以,每添
加一个新功能时,最好创建一个feature分支,在上边开发,完成后,合并,最后
删除该分支;如果丢弃一个还没有合并的分支,可以使用命令:
git branch -D <name>
多人协作
查看远程库信息,使用: git remote -v
本地新建分支如果没有推送到远程,对其他人就是不可见的
从本地推送分支,使用: git push origin branch-name, 如果推送失败,先用
git pull抓去远程的新提交
在本地创建和远程分支相对应的分支,使用:
git checkout -b branch-name origin/branch-name
本地和远程的分支的名字最好相同
建立本地分支与远程分支的关联,使用:
git branch --set-upstream origin/branch-name
从远程抓取分支,使用: git pull,如果有冲突,先解决冲突,解决方法和解决冲
突完全一样
八. 标签管理
当发布一个新版本时,通常先在版本库中打一个标签,这样,就唯一确定了打标签时
刻的版本,就是把那个标签的时刻的历史版本取出来,所以,标签也是版本库的一个
快照
Git的标签虽然是版本库的快照,但其实它是指向某个commit的指针(跟分支很像,
但是分支是可以移动的,标签不可以移动),所以,创建和删除标签都是在
瞬间完成的
创建标签
命令: git tag <name> 用于新建一个标签,默认为HEAD,也可以指定一个commit_id
git tag -a <tag-name> -m "balabalabala..."可以指定标签信息
git tag -s <tag-name> -m "balabalabala..."可以用PGP签名标签
命令git tag可以查看所有标签
命令git tag v*.*可以查看某一个标签
操作标签
命令git push origin <tag-name> 可以推送一个本地标签到远端
命令git push origin --tags 可以推送全部未为推送过的本地标签
命令git tag -d <tag-name> 可以删除一个本地标签
命令git push origin :refs/tags/<tag-name>可以删除一个远程标签
首先应该删除本地的标签
九. 使用GitHub
在GitHub上,刻意人意Fork开源仓库
自己拥有Fork后的仓库的读写权限
可以推送pull request给官方仓库来贡献代码