20221212
[devspec.git] / devspec.en_US / 7.1.code-manage-git.txt
blob98d0756ba3cf07890d337e958de9685b52768604
1 \r
2 \r
3 \r
4 =================\r
5 $ git clone https://gitee.com/用户个性地址/HelloGitee.git\r
6 $ git config --global user.name "你的名字或昵称"\r
7 $ git config --global user.email "你的邮箱"\r
8 \r
9 $ git add . #将当前目录所有文件添加到git暂存区\r
10 $ git commit -m "my first commit" #提交并备注提交信息\r
11 $ git push origin master #将本地提交推送到远程仓库\r
14 ==================\r
15 $ git init \r
16 $ git remote add origin https://gitee.com/用户个性地址/HelloGitee.git\r
17 $ git pull origin master\r
18 $ git add .\r
19 $ git commit -m "第一次提交"\r
20 $ git push origin master\r
21 $ git push origin master -f\r
22 $ git push origin master\r
27 git使用手册\r
29 简介\r
30     git是一个程序版本关联软件。与传统的cvs和svn不同的是,git是一个分布式的版本管理软件,可对多个源码库进行代码的使用或管理。\r
31     使用git,通常有这么几个用途:\r
32 @ 已有软件包的源码下载,用于编译。\r
33 @ 新建项目的软件源码管理。\r
34 @ 已有软件包的部分代码修改,递交给container进行bug修复,功能添加。\r
35 @ 基于已有软件包,创建一个软件包的分支,或基于该软件包的一个新软件包。\r
36     在这些用途中,使用git包含这些操作:\r
37 @ 安装git-client软件,并初始化一个git目录。\r
38 @ 下载一个已有软件包的源码,并非clone一个软件包。\r
39 @ 使用一个git-server进行代码管理。\r
40 @ 新建一个软件包代码库。本机新建一个目录,用于git-server上的代码库的共享和同步,并添加一个软件包模板文件,编译,distclean之后,commit到本机代码库,再push到git-server。\r
41 @ 在另一台计算机或另一个目录,从git-server上clone一份代码,进行编译,添加功能代码后,commit并push到git-server。\r
42 @ 在原有目录中pull代码到本机,并进行代码merge,再进行代码编译。\r
43 @ 两个目录下的代码修改同一个源文件,在merge时产生的conflect处理。\r
44 @ 创建代码tag,用于对于代码创建分支前的标记。\r
45 @ 再新建一个目录,并创建一个软件包的分支。修改单个文件,commit并push到分支,同时将修改的代码merge到主分支,并编译。\r
46 @ 在主分支和新建的分支同时编写代码,将新建的分支代码merge到主分支,编译。删除用于功能扩展的分支。\r
47     这里罗列的是单个代码库的多人开发,以及其它用户下载、使用代码的操作。对于新建分支到另一个代码库,对个人以及中小规模的软件开发不常用,不进行介绍。\r
49 概念\r
50 版本:\r
51 代码库:\r
52 分支:\r
53 标签:\r
54 clone:\r
55 ckeckout:\r
56 branch:\r
57 本机代码库状态:\r
58 traced:\r
59 modifier:\r
60 commit:\r
61 push:\r
62 pull:\r
64 1.安装git客户端软件\r
65     在ubuntu下,git客户端软件的安装只需单个命令行命令.\r
66 $ sudo apt-get install git\r
68 1.1.只下载用于编译的代码\r
69     通常使用git用于下载代码,并编译程序使用.相比与clone一个git的project,下载代码只下载代码,而clone一个project是将代码的所有修改信息都下载到本机,占用的流量和存储空间都比较大.\r
71 $ git remote  https://github.com/xxx/ABC.git\r
72 $ git checkout master\r
73 $ git pull\r
75 1.2.git-server的使用\r
76     这里的git-server并不是指自己搭建的git服务器,而是提供git服务的网站的申请.较常用的git代码管理网站有:\r
77 @ github.io\r
78 @ gitlab.net\r
79 @ gitee.net\r
80 @ code.net\r
81 @ gitea.com\r
82 @ savannah.nongnu.org\r
85 2.新建一个软件包\r
86     一个project的代码最初是从一个空白的project或其它project代码修改而来的.在git上使用,需要先新建一个project,并进行代码的修改和递交.\r
89 2.1.添加traced文件\r
90     traced表示文件在某个git库中的一种状态.文件traced,表示git对该文件进行trace(管理),文件的修改,在git库中进行记录.当文件commit时,将已修改的文件commit到git的本地代码库.而为traced的文件,未进行trace(管理),当commit时,文件不commit到本地代码库.\r
91         使用traced状态,将代码中一些编译时临时的输出文件,不放入代码库中,便于代码管理.\r
92         使用以下命令将文件添加到代码库.\r
94 $ git status\r
95 On branch master\r
96 Untracked files:\r
97 (use "git add <file>..." to include in what will be committed)\r
98 README\r
99 nothing added to commit but untracked files present (use "git add" to track)\r
100 $ git add README\r
102     使用git的status命令浏览代码库中的文件状态.\r
104 $ git status\r
105 On branch master\r
106 Changes to be committed:\r
107 (use "git reset HEAD <file>..." to unstage)\r
108 new file: README\r
110     可以看到,git代码库的缓存中包含了一个文件.\r
113 2.2.修改文件并添加到缓存中\r
115 $ git status\r
116 On branch master\r
117 Changes to be committed:\r
118 (use "git reset HEAD <file>..." to unstage)\r
119 new file: README\r
120 $ touch README\r
121 $ git status\r
122 On branch master\r
123 Changes to be committed:\r
124 (use "git reset HEAD <file>..." to unstage)\r
125 new file: README\r
128 2.3.代码库文件状态\r
130 2.4.代码到commit\r
132 2.5.push代码到git-server\r
134 3.在另一个目录clone代码编译\r
136 3.1.修改并添加文件,更新到代码库\r
138 3.2.原目录下的代码更新和编译\r
140 3.3.merge时代码的conflect\r
142 4.1.创建代码库的tag\r
144 5.创建软件包版本分支\r
146 5.1.修改并添加文件,commit&push到新的分支\r
148 5.2.新的分支代码merge到主分支\r
150 5.3.新的分支和主分支代码同时修改后的merge\r
152 5.4.删除分支\r
154 6.git命令行小结\r
159 用户配置\r
161 git config --global user.name "Your Name"  \r
162 git config --global user.email "email@example.com"\r
164 注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。\r
166 git config --global user.name "Your Name"  \r
167 git config --global user.email "email@example.com"\r
169 密钥配置\r
171 编写代码之前还需要生成并配置SSH-KEY(这个东东是将本地的工作区中的分支和远程的分支进行关联的)\r
173 #生成密钥,一路回车、用默认选项 \r
174 ssh-keygen -t rsa  \r
175 #在本地(我的电脑或者计算机)中找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件(id_rsa是私钥,id_rsa.pub是公钥),将id_rsa.pub文件中的内容 复制到粘贴板 \r
176 cat ~/.ssh/id_rsa.pub | clip # Windows \r
177 cat ~/.ssh/id_rsa.pub | pbcopy # MacOS\r
179 注意:粘贴的一定是.pub文件,里面的是公钥,另一个文件不能随便透露,里面是私钥。\r
181 ssh-keygen -t rsa\r
182 cat ~/.ssh/id_rsa.pub\r
184 在现有目录中初始化仓库\r
186 $ git init\r
187 $ git add *.c\r
188 $ git add LICENSE\r
189 $ git commit -m 'initial project version'\r
191 使用现有的仓库\r
193 $ git clone https://github.com/libgit2/libgit2\r
194 这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。\r
196 $ git clone https://github.com/libgit2/libgit2 mylibgit\r
198 记录每次更新到仓库\r
200 详见下载的示意图。git对untraces,unmodified,modofied,staged文件进行跟踪。\r
202 检查当前文件状态\r
204 要查看哪些文件处于什么状态,可以用 git status 命令。\r
206 在克隆仓库后立即使用此命令,会看到类似这样的输出:\r
207 $ git status\r
208 On branch master\r
209 nothing to commit, working directory clean\r
211 在项目下创建一个新的 README 文件。 如果之前并不存在这个文件,使用 git status 命令,你将看到一个新的未跟踪文件:\r
212 $ echo 'My Project' > README\r
213 $ git status\r
214 On branch master\r
215 Untracked files:\r
216 (use "git add <file>..." to include in what will be committed)\r
217 README\r
218 nothing added to commit but untracked files present (use "git add" to track)\r
220 暂存已修改文件\r
222 现在我们来修改一个已被跟踪的文件。 如果你修改了一个名为 CONTRIBUTING.md 的已被跟踪的文件,然后运行 git status 命令,会看到下面内容:\r
223 $ git status\r
224 On branch master\r
225 Changes to be committed:\r
226 (use "git reset HEAD <file>..." to unstage)\r
227 new file: README\r
228 Changes not staged for commit:\r
229 (use "git add <file>..." to update what will be committed)\r
230 (use "git checkout -- <file>..." to discard changes in working directory)\r
231 modified: CONTRIBUTING.md\r
233     modified表示文件在git仓库中,但修改后未添加到commit列表,即未在stage中。这在git reset --hard和git reset --soft时有些不同。\r
235 状态简览\r
237 git status 命令的输出十分详细,但其用语有些繁琐。 如果你使用 git status -s命令或 git status --short 命令,你将得到一种更为紧凑的格式输出。 运行 git status -s ,状态报告输出如下:\r
239 $ git status -s\r
240 M README\r
241 MM Rakefile\r
242 A lib/git.rb\r
243 M lib/simplegit.rb\r
244 ?? LICENSE.txt\r
246 ?? 新添加的未跟踪文件\r
247 A 新添加到暂存区中的文件\r
248 M 修改过的文件前面有 M 标记。  M有两个可以出现的位置。\r
249 出现在右边的 M 表示该文件被修改了,但是还没放入暂存区。\r
250 出现在靠左边的 M 表示该文件被修改了,并放入了暂存区。\r
252 忽略文件\r
253 一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。 来看一个实际的例子:\r
254 $ cat .gitignore\r
255 *.[oa]\r
256 *~\r
258 参考: https://github.com/github/gitignore\r
260 查看已暂存和未暂存的修改\r
261 git diff将通过文件补丁的格式显示具体哪些行发生了改变。\r
262 若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。(Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的,但更好记些。)\r
264 提交更新\r
266 $ git commit\r
268 这种方式会启动文本编辑器以便输入本次提交的说明。 (默认会启用 shell 的环境变量 $EDITOR 所指定的软件,一般都是 vim 或 emacs。当然也可以按照 起步 介绍的方式,使用 git config --global core.editor 命令设定你喜欢的编辑软件。)\r
270 在 commit 命令后添加 -m选项,将提交信息与命令放在同一行,如下所示:\r
271 $ git commit -m "Story 182: Fix benchmarks for speed"\r
272 [master 463dc4f] Story 182: Fix benchmarks for speed\r
273 2 files changed, 2 insertions(+) create mode 100644 README\r
275 跳过使用暂存区域\r
277 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交。\r
279 git是一个分布式的版本管理软件。在代码从远处服务器更新到本地时,更新到是所有的版本更新内容。所以commit递交到本地的代码库。通常服务器上的project不一定是当前代码修改者的,如果代码修改者在project中,具有写权限,即可将代码push到远处服务器上。\r
280 git push [remote-name] [branch-name]。\r
282     例如:\r
283 $ git push origin master\r
285     这里origin是服务器,master是branch。服务器名详见"remote"相关的内容,它用于代替冗长的web地址。\r
287 从远程仓库中获取与拉取\r
289 从远程仓库中获得数据,可以运行:\r
291 $ git fetch [remote-name]\r
293 通常在其它开发者commit代码修改后,需要进行的代码获取操作。\r
294 必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。\r
296 如果你有一个分支设置为跟踪一个远程分支(阅读下一节与 Git 分支 了解更多信息),可以使用 git pull 命令来自动的获取然后合并远程分支到当前分支。\r
297 $ git checkout iss53\r
298 Switched to a new branch "iss53"\r
300     通常fetch某个remote的某个branch的代码,需要使用上面这个命令。\r
306 移除文件\r
308 $ git rm \*~\r
310 该命令为删除以 ~ 结尾的所有文件。\r
312 移除文件\r
314 $ git mv file_from file_to\r
316 移动文件\r
318 $ git mv README.md README\r
319 $ git status\r
320 On branch master\r
321 Changes to be committed: (use "git reset HEAD <file>..." to unstage)\r
322 renamed: README.md -> README\r
324 其实,运行 git mv 就相当于运行了下面三条命令:\r
325 $ mv README.md README\r
326 $ git rm README.md\r
327 $ git add README\r
329 查看提交历史\r
331 git log 有许多选项可以帮助你搜寻你所要找的提交, 接下来我们介绍些最常用的。\r
333 一个常用的选项是 -p,用来显示每次提交的内容差异。 你也可以加上 -2 来仅显示最近两次提交:\r
335 撤消操作\r
336 有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交:\r
337 $ git commit -m 'initial commit'\r
338 $ git add forgotten_file\r
339 $ git commit --amend\r
342 取消暂存的文件\r
344 $ git reset HEAD CONTRIBUTING.md\r
345 Unstaged changes after reset: M CONTRIBUTING.md\r
347 撤消对文件的修改\r
349 $ git checkout -- CONTRIBUTING.md\r
352 远程仓库的使用\r
354 查看远程仓库\r
356 如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出你指定的每一个远程服务器的简写。 如果你已经克隆了自己的仓库,那么至少应该能看到 origin - 这是 Git 给你克隆的仓库服务器的默认名字:\r
358 $ git clone https://github.com/schacon/ticgit\r
359 Cloning into 'ticgit'...\r
360 remote: Reusing existing pack: 1857, done.\r
361 remote: Total 1857 (delta 0), reused 0 (delta 0)\r
362 Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.\r
363 Resolving deltas: 100% (772/772), done.\r
364 Checking connectivity... done.\r
365 $ cd ticgit\r
366 $ git remote\r
367 origin\r
369 你也可以指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。\r
370 $ git remote -v origin https://github.com/schacon/ticgit (fetch) origin https://github.com/schacon/ticgit (push)\r
372     这里origin即是前面的web地址的名称。它用于git push是的server-name。\r
374 如果你的远程仓库不止一个,该命令会将它们全部列出。 例如,与几个协作者合作的,拥有多个远程仓库的仓库看起来像下面这样:\r
376 $ cd grit\r
377 $ git remote -v\r
378 bakkdoor https://github.com/bakkdoor/grit (fetch)\r
379 bakkdoor https://github.com/bakkdoor/grit (push)\r
380 cho45 https://github.com/cho45/grit (fetch)\r
381 cho45 https://github.com/cho45/grit (push)\r
382 defunkt https://github.com/defunkt/grit (fetch)\r
383 defunkt https://github.com/defunkt/grit (push)\r
384 koke git://github.com/koke/grit.git (fetch)\r
385 koke git://github.com/koke/grit.git (push)\r
386 origin git@github.com:mojombo/grit.git (fetch)\r
388     这里表示origin这个服务器上下载的代码,包含了多个cooperator,每个cooperator使用自己的server地址。这对于多个project的协同使用,通常用到的比较少。\r
390 添加远程仓库\r
392 我在之前的章节中已经提到并展示了如何添加远程仓库的示例,不过这里将告诉你如何明确地做到这一点。 运行 git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写:\r
394 $ git remote origin\r
395 $ git remote add pb\r
396 https://github.com/paulboone/ticgit\r
397 $ git remote -v\r
398 origin https://github.com/schacon/ticgit (fetch)\r
399 origin https://github.com/schacon/ticgit (push)\r
400 pb https://github.com/paulboone/ticgit (fetch)\r
401 pb https://github.com/paulboone/ticgit (push)\r
403 从远程仓库中抓取与拉取\r
405 $ git fetch [remote-name]\r
407 推送到远程仓库\r
409 $ git push origin master\r
411 查看远程仓库\r
413 $ git remote show origin\r
415 远程仓库的移除与重命名\r
417 $ git remote rename pb paul\r
418 $ git remote\r
419 origin\r
420 paul\r
422 同样也会修改你的远程分支名字。 那些过去引用 pb/master 的现在会引用 paul/master。\r
424 如果因为一些原因想要移除一个远程仓库,可以使用 git remote rm :\r
426 $ git remote rm paul\r
427 $ git remote\r
428 origin\r
430 Git 分支\r
432 分支创建\r
434 $ git branch testing\r
436 它只是为你创建了一个可以移动的新的指针。实际在每次commit之后,是以sha1校验值为id的tree结构。分支创建了对应的指针,用于指向某个节点。\r
438 分支切换\r
440 $ git checkout testing\r
442 分支的创建并切换\r
444 $ git checkout -b iss53\r
445 Switched to a new branch "iss53"\r
447     它是下面两条命令的简写:\r
448 $ git branch iss53\r
449 $ git checkout iss53\r
451 分支的删除\r
452 $ git branch -d hotfix\r
453 Deleted branch hotfix (3a0874c).\r
455 分支的合并\r
457 假设你已经修正了 #53 问题,并且打算将你的工作合并入 master 分支。 为此,你需要合并 iss53 分支到 master 分支,这和之前你合并 hotfix 分支所做的工作差不多。 你只需要检出到你想合并入的分支,然后运行 git merge 命令:\r
459 $ git checkout master\r
460 Switched to branch 'master'\r
461 $ git merge iss53 Merge made by the 'recursive' strategy.\r
462 index.html | 1 +\r
463 1 file changed, 1 insertion(+)\r
467  \r