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到暂存区然后提交

原文地址:https://www.cnblogs.com/BlueFire-py/p/10809925.html