第1章 入门
-
在git中,文件有三种状态:
- 文件被修改编辑了,那么文件处于modified状态
- 文件被
git add
了,那么文件处于staged状态,(将文件的某个时间点的快照加入暂存区) - 文件被
git commit
了,那么文件处于committed状态(暂存区里的快照被永久保存在git本地仓库中)
-
如果我克隆了一个代码仓库到本地后,那么本地代码仓库中将自动包含此代码仓库的所有的历史版本
-
git在电脑中的配置文件有三个,对于windows里面有两个我是知道的(还有一个不是知道在哪里):
- 一个是代码仓库中里面的.git/config文件 (优先级最高)
- 一个是电脑的C:\Users\用户目录下的.gitconfig文件
-
通过命令行读取git配置值:
- 读取.gitconfig文件 的配置值:
git config --global user.email
- 读取git 全部配置值:
git config --list
(注意:因为该命令行读取了三个配置文件的配置值,可能会出现配置名相同,配置值不同的情况) - 读取git某个配置项的当前最终配置值,也就是优先级最高的配置值:
git config user.name
- 读取.gitconfig文件 的配置值:
第2章 Git基础
- Git中的文件有两种状态:
- 未跟踪的(Untracked):上一次本地Git仓库的快照中并未包含该文件,则该文件属于未跟踪状态
- 已跟踪的(Tracked):上一次本地Git仓库的快照中包含该文件,则该文件属于已跟踪状态
-
初始化一个Git仓库:当我们在本地项目的根目录中执行git初始化命令
git init
后,会自动生成一个.git目录,但是这不意味着git开始跟踪该项目的文件,需要再进行git add .
和git commit
命令后,Git仓库才能获得了一个快照,因为这个快照包含该项目的文件,所以项目文件终于处于已跟踪的状态了。 -
克隆仓库到指定目录:将需要克隆的远程仓库克隆到指定目录中new_folder的命令:
git clone https://e.coding.net/ttsefhsel/liflef/tp.git new_folder
-
克隆仓库到本地目录后,这些文件都已经是已跟踪且未修改的状态。
-
git status输出结果怎么看?
下面是对红框三个区域的解释:- Changes to be committed:列出暂存区文件,只要执行
git commit
那么这些文件在执行git add
的一瞬间的状态下的内容都会被包含到最新的本地GIT仓库快照中 - Changes not staged for commit:列出已被跟踪,且被修改的,但还未执行
git add
的文件(也就是未添加到暂存区),等待被执行git add
- Untracked files:列出还没跟踪的文件,等待被执行
git add
- Changes to be committed:列出暂存区文件,只要执行
-
git status简洁版:
git status -s
-
左边的两个字符是代表状态的,第一个字符说明文件是否已暂存,第二个字符表明文件是否被修改,例如:
-
跳过git add . 直接提交所有已跟踪文件的修改 (P22):
git commit -a
-
直接完成删除文件并提交删除状态到暂存区(P22):
git rm
-
不删除文件的情况下,让git不再跟踪某个文件或文件夹 (P24):
git rm --cached
-
查看git 提交历史 (顺序新–>旧) (P25):
git log
按回车键可以加载更多以往历史,按q键可以结束退出
最近两条提交:git log -2
可以看差异内容(diff 信息):git log -p
可以看每次提交的简要统计信息:git log --stat
只列出提交信息(P27):git log--pretty=oneline
只列出提交人、日期、提交信息:git log--pretty=short
待图标显示分支和合并历史 (P28):git log --graph
今天到两周前的提交内容:git log --since=2.weeks
查询作者为maureen2 的提交记录:git log --author=maureen2
-
将文件从暂存区中移出来:
git restore --staged api/app/api/service/user/LoginService.php
-
撤销对未暂存的文件进行的修改内容(P31):
git restore api/app/api/service/user/LoginService.php
-
什么是remote?(P32)
remote指的是远程仓库。 -
什么是origin?(P32)
如果克隆了一个远程仓库,则git 给该克隆源服务器(也就是remote)取的默认名字就是origin。
想要知道origin到底是指哪个服务器,可以执行git remote -v,这里可以获得远程仓库的url
-
添加远程仓库(P33):
git remote add + 仓库名 + url
(可以同时有多个远程仓库)
第3章 Git分支机制
- head和多个分支和提交版本记录的关系(P43-45)
- 如何生成新的分支(P44):
git branch test1
(这里只是新增一个分支,但是还没切换到该新分支中,HEAD指针未改变指向) - 切换到指定分支(P45):
git checkout test1
- 查看当前在哪个分支:
git branch
带*号的即当前所在分支(也即是HEAD指针指向的分支)
- 查看当前各分支指向的提交版本(P45):
git log --decorate
图中test1分支和master分支都指向同一个提交版本,因为test1分支是我处在master分支上的时候新增的一个分支,所以会跟着当前分支一起指向同一个提交版本
因为此时HEAD指向test1分支,那么我提交一个版本后,test1分支就不再跟master指向不同的提交版本了
- 如何理解两个分支的合并(P48):如果切换到master,然后合并dev分支,其实等于master吸收了dev分支的内容,然后创建了一个新的快照版本,并且让master分支的指针指向新版本,而dev分支的指针还是停留在原本的版本中没有变动。如果想要dev分支指向合并后的那个快照版本,则直接切换到dev分支,并合并master分支。执行后git不会生成新的快照版本,而是直接让dev分支指针往前挪,最后的效果就是master分支和dev分支的指针都指向了合并后的那个快照版本。
- 不同分支对同一个文件进行写操作,什么情况下合并会产生冲突(P53):
- 当该文件只有两行时,一个分支修改第一行,第二个分支修改第二行,合并后会产生冲突。看下面三张图就是例子:
![在这里插入图片描述](https://img-blog.csdnimg.cn/a0145f6b483d4a7ea069fe21098ff833.png
合并后产生冲突了
- 同一个文件,这个文件有三行,也就是说大于二行,第一个分支修改第一行,第二个分支修改第三行,合并后不会产生分支。看下面三张图就是例子:
合并执行顺利
- 远程分支:即是远程仓库所有的分支的指针,用来说明每条远程分支正在指向哪个快照版本,通过
git branch -a
可以看到远程仓库的所有分支指针
- 将本地的某个分支推送到远程仓库的某个分支(P63):
git push origin serverfix:awesomebranch
把本地serverfix分支推送到远程的awesomebranch分支上去。 - 如何想要推送的时候不用输入用户名和密码(P64)?
设置一个凭据缓存:git config --global credentital.helper cache
- 如果git clone后,远程仓库又添加多了一条dev新分支,那么本地执行拉取后,会看到本地多了一条对应的远程dev分支的指针,看下面两个图
拉取前,没有dev分支指针:
拉取后,会显示有dev分支指针:
- 直接将远程仓库的某个分支内容合并到当前的本地分支(P64):
git merge origin/dev
就算目前所在的本地分支不是dev分支也没关系、本地没有dev分支也没关系,反正就是把指定远程的分支合并到我本地当前分支即可。
13.创建一个本地分支来对应一个远程仓库分支(P65):git checkout -b dev_2 origin/dev_2
执行后本地会多一条分支叫dev_2,这个分支的指向的版本就是远程分支dev_2指向的版本
- 基于上一条的例子,此时远程分支dev_2的跟踪分支(tracking branch),也叫上有分支(upstream branch)就是本地的dev_2分支。他们是直接关联的。(P64)
- 当我们执行
git push
或git pull
时,git 会识别当前的分支是哪个远程仓库的哪个分支的跟踪分支,然后执行推送到该分支、或拉取该分支的数据并于本地分支合并。(P64) - 如果切换分支时,本地暂无该分支,但是远程仓库有一个同名分支,则git会添加远程分支同名的本地跟踪分支。(P65)
下面图中,原本本地没有dev分支,但是远程有dev分支,只要我执行git checkout dev
,立刻直接自动生成一个本地跟踪分支
- 设置某个的本地分支跟踪指定的远程分支(P65):
git branch -u origin/serverfix
用–set-upstream-to也可以:git branch --set-upstream-to=origin/mybranch1 mybranch1
- 查看本地分支和远程分支的对应跟踪关系(P66):
git branch -vv
不仅可以看到本地分支对应哪条远程分支,还可以看到差异:
ahead 3:指的是本地master分支提交了两次都还没推送到远程master分支
behind2:指的是远程master分支提交了两次的更改都还没合并到本地master分支