Git---基础
1. 最小配置,即配置用户信息
Email :git会自动提取用来发送邮件(注意一定是可以收取邮件的),name :标识身份
注意:空格不要等号
用来处理本机多个仓库
local命令必须在git项目中才可以使用,优先级最高
2.本机建git仓库
3.工作目录和暂存区
没有commit就不会存到git仓库中
4. 常用命令
追踪新文件:git add .
提交已经修改的文件到暂存器(前提是文件已经被捕获) git add -u
git commit -m ‘ ’
git commit -am " " 省略add操作(只将被tracked的文件添加到暂存区并提交,而将文件添加到git管理是要git add命令的)
重命名文件 git mv oldname newname 相当于三个步骤:目录修改文件名(mv oldname newname)git删除旧文件(git rm oldname ) git追踪新文件( git add newname) (三个命令)
复原刚才的操作(危险命令)
git reset --hard: 暂存区(add 了的文件 绿色的)工作区(没有add的文件 没有add-u的文件操作 红色的)上所有的操作都会消失,而且不会有提交历史 相当于返回了HEAD 对应的commit的状态
查看提交历史 git log -4 --oneline --all(看所有分支,当然也可以指定git log temp(不要加-- 这是命令)) --graph (看图)
创建分支 git checkout -b temp XXX(没有默认就在HEAD所在的commit创建分支,-b 创建分支命令同时会切换到所创建分支) git checkout temp 直接切换分支
查看帮助文档 git help --web log 指定web就是在浏览器查看 log 就是你要查看的指令
图像化界面 gitk
创建分支 分支名称 checkout 对应的commit 为 master :git branch checkout master
比较暂存区与HEAD之间的差异
比较工作区和暂存区之间的差异
暂存区恢复到和HEAD一样(变暂存区用reset)
工作区变成暂存区(变工作区用checkout 相当于把暂存区的文件提交回来,不要当前工作区文件的内容)
取消暂存区部分文件
消除最近几次提交/回退到之前的提交(注意暂存区和工作区 HEAD 都会退到之前的commit)
比较不同提交文件差异(提交的SHA1值也是可以的)
删除文件(相当于工作区,暂存区都删除了文件)
5.git 文件夹
ls -al = ll 命令
配置
HEAD 指向
refs 文件
查看master文件 里面是一个对象
git cat-file -t XX 查看对象类型 t 查看文件类型 -p 查看文件内容
git branch -av 查看所有分支信息 -a 只是查看分支名称 -v 查看分支信息
查看tags 文件夹:查看其中的tag文件,里面也是有一个对象(SHA 1都代表一个对象),发现对象类型是tags:查看tag对象发现里面还有一个对象, 对象类型commit
查看objects 文件夹 :两字符的文件夹 pack文件夹(git打包的两字符文件夹)
树 和 commit blob 类型对象 blob 就是一个文件(我们切切实实修改了的文件)
6.三种对象:commit tree blob
blob:只要是一样的文件就是一个blob
tree 文件夹 blob 文件(git 归根到底就是这两种对象在存储文件以及文件结构)
7.一个commit创建了多少树
find 查找所有文件
一个commit 对象 对应着objects 文件夹下的一个文件,(内容)以及对应这一个或多个tree对象或是直接blob对象
一个tree 对象, 对应着objects 文件夹下的一个文件,(内容)tree对象,blob对象
一个blob对象, 对应着objects 文件夹下的一个文件, (内容) 文件内容
8.分离头指针:没有在任何分支上
我们当中正工作在没有任何分支上,并且还会提交了很多commit 怎么办
下面直接切入某个commit就会进入分离头指针状态
分离头指针的危险在于:commit 没有 和tag或者branch绑定,日后都会被git当作垃圾进行清除(不会马上),而一旦与tag,branch进行了绑定git就不会删除
可以看到只有HEAD没有分支
当我们要切换到其他正常分支上:
注意:解决:git branch dddd commitSHA1
9.HEAD 与 branch
HEAD :指向分支,指向commit HEAD无论如何最终都会指向commit
Branch:分支和tag一样都是指向commit ,远程分支也是分支指向commit
-b 可以创建并且切换 可以指向commit也可以指向branch
HEAD 快速指代作用 指代
git diff HEAD commitSHA1 /HEAD ^1 父亲节点 /HEAD~2相当于HEAD^1^1
10.删除分支
如果没有merged,会报错,使用D 如果是最新的commit对应的分支,并且没有branch/tags相对应,那么相应的commit也会删除
11.修改message
修改最新commit的message
git commit -amend(修改完之后,commit的SHA也变了)
git commit –amend既可以对上次提交的内容进行修改,也可以修改提交说明。
修改旧的commit的message
git rebase -i XXX
变基在之前那个commit(之后的commit的sha1都会变)
pick (use commit) 意味着commit保留,即是commit对应的那些对象保存
rebase 变基 一定在自己的分支上进行操作,如果在公共分支上变基会影响其他人
12.合并commit
首先你需要一个commit,也就是一个pick,用来承接你要合并产生的新的commit
你不要动的commit 直接pick就行 s命令是合并到前一个commit
添加修改信息 注意# 信息不会出现,而其他的那些就是你写的message
如何操作不连续的 改第一个commit的message同理
13.变基
git rebase -i XXX
进入交互式环境
如果是第一个的话,需要自己写pick命令
默认交互式文件中,越靠上,commit也是提前的
当你进入变基1/2状态时
git rebase --continue
就可以进入下一步
git rebase --abort
来取消目前的进程
14.管理文件
.gitignore doc/ 管理doc文件 不管理doc文件夹 doc 都管理
有两个起始commit ,如果我们把下面的tag还有分支删除掉那么下面的分支在日后就会被git清除掉,两个孤独的commit而且还不一样
指定特定文件的差异
15.git仓库备份
我们可以push或者frech 来实现备份,当然也可以clone 注意--bare不带工作区的裸仓库
16.连接远程仓库
可以起别名 ,可以不止一个远程仓库(我们可以先用备份创建远程仓库,再用remote建立连接)
17.GitHub 配置
ssh :可以不用每次push 的时候输入密码
第一步检测,第二部创建
18.上传与下拉
git push --set-upstream github --all
git push --set-upstream github master (代表 GitHub 这给别名仓库的master分支)
git pull 包含两步 git fetch github(默认会把GitHub所有分支下载下来) 然后merge
不是一个祖先 not first forwards 同一个分支如果远端和本地不是同一份祖先是不可以push的 fetch 是没问题的,本地没有远端的文件,也可以fetch
三个独立的分支 gitk 默认只是打开当前分支的树 --all
git merge 分支1 (当前分支与对应分支1合并:分支1说的是远程分支)
19.合并
merge 失败将处于当前状态:注意三种commit 状态 绿色 暂存区 红色 工作区(还未索引) 黄色 HEAD 故而有三种解决办法
命令行下的状态
只要merge成功,汇聚在一起 我们就可以进行push了(我们还可以使用变基进行合并)
20.工作模型
(两个人协调工作同一个分支,先在GitHub创建一个分支,然后让两人分别clone)
只要是我们git clone 下来的远程分支前都有一个origin 这表明是原始的
基于远端分支创建本地分支
当我们commit之后即时push到远端(由远端创建的本地分支可以直接push)
查看分支 所有分支
两个人同时操作一个分支,但是操作不同的文件
两个人同时操作一个分支,操作相同文件的不同区域
两个人同时操作一个分支,操作了相同文件的相同区域
两个人同时操作一个分支,操作文件名和文件内容:一人修改文件名 一人修改文件内容
两个人同时操作一个分支,两人同时修改文件名 :挨个处理
方法一:如果我们确定远程的分支正好是我们需要的,而本地的分支上的修改比较陈旧或者不正确,那么可以直接丢弃本地分支内容,运行如下命令(看需要决定是否需要运行git fetch取得远程分支):
$:git reset --hard origin/master
或者$:git reset --hard ORIG_HEAD
解释:
git-reset - Reset current HEAD to the specified state
--hard
Resets the index and working tree. Any changes to tracked files
in the working tree since <commit> are discarded.
方法二:我们不能丢弃本地修改,因为其中的某些内容的确是我们需要的,此时需要对unmerged的文件进行手动修改,删掉其中冲突的部分,然后运行如下命令
$:git add filename
$:git commit -m "message"
方法三:如果我们觉得合并以后的文件内容比价混乱,想要废弃这次合并,回到合并之前的状态,那么可以运行如下命令:
$:git reset --hard HEAD
如何取消merge,因为此时的merge已经对工作区产生影响:
--abort 也只有在合并状态中才能使用
处于merge 的状态
标签理解:当我们本地合并后,远端还是在 它那个commit ,所以合并之后技术push,让远端master和本地master 同时
如果我们的分支没有和远端分支绑定,第一次需要设置
而如果我们是copy的远程分支,就直接push可以,或者我们之前设置了
两个危险命令丢失commit
禁止在集成分支rebase ,宁可多提交几次修改代码也不要变基
21.暂存区和工作区
reset可以修改暂存区,--hard 可以修改工作区(这个让工作区和暂存区一样)
checkout 可以修改工作区 :通过下面这个命令我们可以将工作区的文件进行修改,尤其是在合并时。并且此命令默认还会加到暂存区,我们不需要add就可以直接commit
git checkout ${commit} /path/to/file
reset XXX 可以直接修改暂存区
status 只是查看当前工作区状态,没有显示的文件:说明工作区和暂存区一样,
红色:代表修改了 文件 或是both added 这种合并冲突已经和暂存区不同了,而暂存区还是原来的
绿色:代表我们提交了修改,暂存区已经修改的和本地一样了
diff命令:查看暂存区的命令
如何查看暂存区 使用 diff 命令,它可以比较快照
"---"表示变动前的文件(暂存区文件),"+++"表示变动后的文件(工作区现实就有的文件)。
第二部分,变动的位置用两个@作为起首和结束
@@ -1,7 +1,7 @@
前面的"-1,7"分成三个部分:减号表示第一个文件(即f1),"1"表示第1行,"7"表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。同样的,"+1,7"表示变动后,成为第二个文件从第1行开始的连续7行。
第一行表示结果为git格式的diff
diff --git a/f1 b/f1
进行比较的是,a版本的f1(即变动前)和b版本的f1(即变动后)。
第二行表示两个版本的git哈希值(index区域的6f8a38c对象,与工作目录区域的449b072对象进行比较),最后的六位数字是对象的模式(普通文件,644权限)。
index 6f8a38c..449b072 100644
如果是合并:可以看到有三个@@@ (标识前两个都是暂存区文件,后面的是显示文件 应该是把===也算作了一行)
如果此时想要从暂存区提取东西是不可以的(checkout)这是因为文件还没合并导致,或者说这个文件出现了两个暂存区,有两种方式我们可以解决合并问题(出现了一个文件两个暂存区只有这时才会出现)
1.我们强制这个文件的暂存区为一个,即指定一个分支,这样就变成正常的暂存区了,我们就可以checkout。
注意此时 status 是不会显示这个文件,因为我们这个文件在暂存区和工作区是完全一莫一样的 (已经在暂存区了,最后直接commit就可以)
2.手动删除》》》》 《《《《(直接修改工作区) , 然后add到暂存区然后提交