第1章:Git入门
==使用#号可以来表示1-6级别的标题==
# 一级标题 ctrl+1
##二级标题ctrl+2
......
######六级标题 快捷键为 Ctrl + 6
本章提要
介绍几个最常用的git命令(绝大多数时间里仅用到它们)。
1.1 基本操作
git init
git add ...
git clone [url] [shortname]
git commit -m "***"
git status
git diff
git push
git pull
git log -p -2
git log
git diff --cache
git rm [name]
gir reset HEAD //这个不太熟悉,用来取消暂存
1)初始化新的代码仓库
$ git init
初始化以后,当前目录出现一个名为.git的目录,包含Git需要的数据和资源
2)跟踪文件,提交
$ git add *.c
$ git add README
$ git commit -m "initial project version"
$ git push
3)从现有仓库克隆
$ git clone git://github.com/schacon/grit.git
这会在当前目录下创建一个名为“grit"的目录,其中内含一个.git的目录,并从同步后的仓库中拉出所有的数据,取得最新版本的文件拷贝。
$ git clone git://github.com/grit.git mygrit
此命令唯一的差别是:新建的目录成了mygrit而不是grit
引用 :> +空格 +文字
代码: **```+回车 **
原文显示: **
5)记录每次更新到仓库
检查当前文件状态
git status
跟踪新文件
git add ****
暂存已经修改的文件
使用git add命令,==不仅仅可以跟踪新文件==,还可以把已经跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态。
查看尚未暂存的文件更新了哪些部分
git diff
查看已经暂存的文件和上次提交时的快照之间的差异
git diff --cached
6)提交文件
提交
git commit -m "版本说明"
跳过缓存区提交
git commit -a -m "版本说明"
查看提交历史
git log
默认不用任何参数的话,git log会按提交时间列出所有的更新。
git log -p -2
###### 跳过缓存区提交
-```
+```3
git commit -a -m "版本说明"
+###### 查看提交历史 + +``` +git log
我们常用-p选项展开显示说,-2则仅显示最近的两次更新:
git log --state
显示简要的增改行数统计
#### 7)忽略某些文件
有一些文件我们不需要把它放到Git的管理,但也不希望它出现在未跟踪文件列表。
通常是自动生成的文件:如日志或编译过程中产生的。
可以创建.gitignore文件
$cat .gitignore
- .[oa] *~
忽略所有以.o或者.a结尾的文件
#### 8) 移除文件
rm grit.gemspec git rm grit.gemspec
该命令可以从已经跟踪文件清单中移除(从暂存区域移除),然后提交。
git rm可以完成上述工作,并且连带从工作目录中删除制定的文件。
git rm -f grit.gemspec
**如果删除之前修改过并且已经放到暂存区域的,需要用强制删除选项-f**
git rm --cached readme.txt
要移除跟踪但是不删除文件
#### 9)移动文件
git mv file_from file_to
相当于执行了三条命令
mv README.txt README git rm README.txt git add README
#### 10) 撤销操作
###### 修改最后一次提交
git commit --amend
有时候我们提交万才发现漏掉几个文件没有加,或者提交信息写错了,想要撤销刚才的提交操作。可以==修改以后==,使用--amend选项重新提交。
###### 取消暂存某个文件
git reset HEAD
文件又回到了之前已经修改未暂存的状态。在使用这条命令前,清务必确定真的不再需要保留刚才的修改。如果只是想回退版本,同时保留刚才的修改以便将来继续工作,可以用下章介绍的stashing和分支来处理。
### 1.2 远程仓库处理
#### 11)远程仓库的处理
远程仓库:托管在网络上的项目仓库,可能有好多个,有些只能读,有的可以写。
##### 查看当前的远程仓库
git remote
会列出每个远程库的简短名字。
在克隆完某个项目后,**至少可以看到一个名为origin的远程库**,GIt默认使用这个来标记你所克隆的原始仓库。
git remoye -v
origin https://github.com/youdutaidi/Notebook.git (fetch) origin https://github.com/youdutaidi/Notebook.git (push)
-v为vervose的简写,取首字母,显示对应的克隆地址
如果有多个远程仓库,此命令将全部列出。
##### 添加远程仓库
git remote add [shortname] [url]
现在可以用字符串pb指代对应的仓库地址。要抓取所有链接上有的,但本地仓库没有的信息,可以运行fetch [shortname]:
git fetch pb
现在,链接的主干分支可以完全在本地访问了,对应的名字是[shorname]/master
##### 从远程仓库抓取数据
git fetch [remote-name]
如果是克隆了一个仓库,此命令会自动将与将远程仓库归属到origin名下,所以git fetch origin会抓取你赏赐克隆以来别人上传到此远程仓库中的所有更新。
fetch命令只是将远端的数据拉到本地仓库,并不自动合并当前的工作分支。
git pull 命令可以自动抓取数据,并且将远程分支自动合并到本地仓库中的当前分支。
##### 推送数据到远程仓库
项目进行到一个阶段,和别人共同分享目前的成果,可以将本地仓库中的数据推送到远程仓库。
git push [remote-name][branch-name]
> 只有在所克隆的服务器上有写的权限,或者同一时刻没有其他人在推送数据,这个命令才会如期完成,
##### 查看远程仓库的信息
git remote show [remote-name]
> * 远程 origin
> 获取地址:https://github.com/youdutaidi/Notebook.git
> 推送地址:https://github.com/youdutaidi/Notebook.git
> HEAD 分支:master
> 远程分支:
> master 已跟踪
> 为 'git pull' 配置的本地分支:
> master 与远程 master 合并
> 为 'git push' 配置的本地引用:
> master 推送至 master (最新)
##### 远程仓库的删除和重命名
git remote rename pb paul
将**远程**仓库名从pb改为paul
git remote rm paul
删除远程仓库paul
### 1.3 标签
#### 11) 打标签
Git可以对某一个时间点上的版本打上标签。
##### 显示已经有的标签
git tag
##### 新建标签:含附注(annotated)的标签
git tag -a v1.4 -m 'my version 1.4'
创建一个含附注类型的标签,用-a指定标签名字,-m制定对应的标签说明。
##### 签署标签
如果你有自己的私钥,还可以用GPG来签署标签,只需要把之前的-a改为-s
git tag -s v1.5 -m 'my signed 1.5 tag'
##### 轻量级标签
轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。
不用-m,-a,-s,直接写出标签名
git tag v1.4-1w
##### 验证标签
git tag -v [tagname]
-v verify的首字母
此命令调用GPG来验证签名,需要你有签署者的公钥,存放在keyring中。
> object 90126d204e171e72dcf4fa9be603811a08470fe7
> type commit
> tag v.01
> tagger Viviancat <[email protected]> 1614163906 +0800
##### 后期加注标签
你可以在后期对早先的某次提交加注标签
git log --pretty=online
##### 分享标签
git push origin [tagname]
通过显示命令分享标签到远程仓库
git push origin --tags
一次性上传所有本地新增的标签
# 第2章 Git分支
有人把 Git 的分支模型称为**“必杀技特性”,**而正是因为它,将 Git 从版本控制系统家族里区分出来。Git 有何特别之处呢?Git 的分支可谓是**难以置信的轻量级**,它的新建操作几乎可以在瞬间完成,并且在**不同分支间切换起来也差不多一样快**。和许多其他版本控制系统不同,Git 鼓励在工作流程中频繁使用分支与合并,哪怕一天之内进行许多次都没有关系。
### 2.1 分支的定义
![image-20210224193538602](/home/cai/git/Notebook/1.png)
在 Git 中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内容快照的指针,作者和相关附属信息,以及一定数量(也可能没有)指向该提交对象直接祖先的指针:**第一次提交是没有直接祖先**的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先.
![image-20210224193944810](/home/cai/git/Notebook/img/2.png)
作些修改后再次提交,那么这次的提交对象会包含一个指向上次提交对象的指针(译注:即下图中的 parent 对象)。两次提交后,仓库历史会变成图 3.2 的样子.
Git 中的分支,**其实本质上仅仅是个指向 commit 对象的可变指针**。Git会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动
![image-20210224194214931](/home/cai/git/Notebook/img/3.png)
##### 创建新的分支
即为创建新的分支指针。
git branch testing
这会在当前的commit对象上新建一个分支指针。
![](/home/cai/git/Notebook/img/4.png)
##### Git对当前工作分支的判断
它保存一个名字为HEAD的特别指针。指向你正在工作的本地分支。
运行git branch 命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去。
##### 切换到其他分支
git checkout testing
HEAD指向testing
### 2.2 基本的分支与合并
>常用工作流程
>
>1\. 开发某个网站。
>2\. 为实现某个新的需求,创建一个分支。
>3\. 在这个分支上开展工作。
>假设此时,你突然接到一个电话说有个很严重的问题需要紧急修补,那么可以按照下面的方
>式处理:
>1\. 返回到原先已经发布到生产服务器上的分支。
>2\. 为这次紧急修补建立一个新分支。
>3\. 测试通过后,将此修补分支合并,再推送到生产服务器上。
>4\. 切换到之前实现新需求的分支,继续工作。
#### 1) 新建并切换到该分支
git checkout -b iss53
#### 2) 合并分支到master
git checkout -b 'testing' git checkout master git merge testing
#### 3)冲突的合并
如果你修改了两个等待合并的分支里面同一个文件的同一部分,Git就无法干净的合并。
git mergetool
会调用一个可视化的合并工具引导你解决所有冲突
git status
运行该指令来确认所有冲突都已经解决
### 2.3 分支管理
##### 列出当前所有分支清单
git branch
>*master
> testing
*代表当前分支
##### 查看各个分支最后一次commit信息
git branch -v
##### 查看哪些分支已经被并入当前分支
git branch --merged
##### 删除没有*的分支
git branch -d testing
如果分支中还有尚未合并的工作,删除会失败。
##### 查看尚未合并的工作
git branch --no-merged
# 第4章 服务器上的Git
### 4.1 协议
* 本地传输
* SSH协议
* Git协议
* HTTP协议
##### 如本地协议:
克隆一个本地仓库
git clone /opt/git/project.git
添加一个本地仓库到现有Git工程
git remote add local_proj /opt/git/project.git
### 4.2-4.4 在服务器部署Git
略
##
#### 其他章节主要是原理性的,目前主要是想学会怎么用,不需要