Git学习笔记

Git笔记

安装

git官网

git下载

Git命令

查看版本

git --version

检查安装成功,查看版本,输出当前版本 git version 2.21.0

配置名字

git config --global user.name '[your_name]'

配置名字(–global可以改为–local /–system)

设置完—global,在设置—local后 ,优先使用—local的配置

配置邮箱

git config --global user.email '[your_email@163.com]'

配置邮箱

显示配置信息

git config --list --global

显示配置信息

创建仓库

git init [xxx_rep]

创建仓库

把文件添加到暂存区

git add [xxx_file]

把xxx文件添加到暂存区

git add -u

已经添加到git里的文件修改之后,必须再次add一次该文件

加上-u,可以快速把所有文件更新添加,不需要add每一个文件

把变动从暂存区提交到仓库

git commit -m'[add xxx]'

把变动从暂存区提交到仓库,-m后面是条的log信息

执行commit之前 一定要执行add

把文件从暂存区里删除

git rm [xxx_file]

把xxx文件从暂存区里删除

查看提交信息

git log

查看提交信息

清理暂存区

git reset --hard

清理暂存区(也就是清理掉本地工作区与暂存区的区别,让暂存区与本地工作区一模一样)

但是不影响已经提交的文件

reset回退到过去的某次commit(危险!!!)

git reset [1dedb4c7d15a commit sha1]

reset后加具体的提交sha1值,可以会退到[1dedb4c7d15a]这个版本,之后的提交将会被删除(危险操作!!!慎用,虽然可以使用git fsck --lost-found 找回)
可以使用checkout [1dedb4c7d15a]分离头指针查看之前的提交,可以基于此次提交去修改代码,(注意再次切回其他分支时候,必须为此创建一个branch,不然基于此次的commit都会消失),这样可以共存

找回丢失的commit(救命!!!)

git fsck --lost-found

如果不小心使用的 git reset [commit sha1],会把你的[commit sha1]提交之后的文件全部删除

此时,可以通过git fsck --lost-found去寻找那些被悬空(dangling)的commit,然后通过提交的sha1值去

改命令还可以先找到那些被悬空的文件

可参加 github总结(4)–关于git reset --hard这个命令的惨痛教训

image-20190304101451178

修改文件名之后,提交到暂存区

git mv [readme] [readme.md]

修改文件名之后,提交到暂存区

注意:不需要1.在工作区里修改这个文件名,然后 2. add修改后的文件 3.rm旧的文件,

直接执行 git mv [readme] [readme.md]即可

查看简要的log

git log --oneline

查看简要的log

查看最近4个log

git log -n4 --oneline

查看最近4个log

图形化展示所有分支的log

git log --all --gragh

查看所有分支的log,图形化展示

查看git log的帮助,在浏览器里

git help --web log

查看git log的帮助,在浏览器里

调出图形界面

gitk

调出图形界面

创建分支

git checkout -b [分支名] [commit sha1/分支名称]

创建分支

切换分支

git checkout [分支名]

切换分支

查看所有分支

git branch -av

image-20190306164157975

删除分支

git branch -d [分支名]

git branch -D [分支名]

如果-d清除不掉的,确实不想要,可以用-D

其实就是让你确认删除的意思

image-20190306164635157

查看文件类型

git cat-file -t [文件sha1]

查看文件类型,有三种文件类型
commit :提交
tree :文件夹
blod :文件

查看文件内容

git cat-file -p [文件sha1]

查看文件内容,注意只能查看sha1,不能写文件名(因为git存文件是以sha1存储的,避免同一个文件不同名称的情况浪费空间)

直接 cat [文件名]也可以查看文件内容,但这不是git的命令

比较两次提交的差异

git diff [commit sha1] [commit sha1]

还可以用HEAD指代当前的提交
用HEAD~1指代前一次提交 相当于 HEAD^
HEAD~2 指代前两次提交… 相当于 HEAD^^

image-20190306163333703

比较暂存区与HEAD之间的差异

git diff --cached

比较工作区与HEAD之间的差异

git diff —HEAD

比较工作区与暂存区差异

git diff

注意后面什么都不加,表示所有文件作比较

可以使用git diff -- [文件名] 来单独比较指定的文件,注意 --与[文件名]之间必须加空格

image-20190308172615162

如何让暂存区的全部文件恢复成和HEAD的一样?

git reset HEAD

我们每次在工作区修改了文件,都要先添加到暂存区,然后执行commit,把暂存区的文件提交到仓库

git status 是查看工作区与暂存区文件的区别,他不会显示每个文件的具体那内容,只是告诉你

  1. 工作区有一个文件没添加到暂存区 红色 还不能提交
  2. 工作区有一个文件内容修改了,但是没添加到暂存区 红色 还不能提交
  3. 你已经把工作区的修改添加到了暂存区 绿色 可以直接提交了

下图:

  1. 第一次执行 git status 显示你已经把工作区的修改add到了暂存区
  2. 执行完git reset HEAD 后,把暂存区恢复成功与HEAD一样了,也就是说,之前工作区add到暂存区的文件都回退了
  3. 第二次执行git status 显示,你工作区的文件,还没有add进暂存区,
  4. 其实git reset HEAD 是 git add 的逆向操作

image-20190308173316672

暂存区里的部分文件恢复成和HEAD一样

git reset HEAD -- [文件名]

git reset HEAD -- [文件名] [文件名] 多个文件之间使用空格

image-20190312145515774

工作区恢复成暂存区状态 23

git checkout — [文件名]

如果变暂存区内容:reset

如果变工作区内容:checkout

消除最近的几次提交 24

git reset — hard [commit sha1值]

image-20190312160058515

修改最近一次提交的msg

git commit --amned

image-20190306165644464

弹出

image-20190306165603799
修改完退出后

image-20190306170100514

修改前几次的提交信息

git rebase -i [commit sha1]

假设log历史为

5
4
3
2
1

第一步:
image-20190306172552145

注意:要改变第3条log,必须 git rebase 2 也就是3的父亲,然后再展开操作

第二步:
弹出下图,把你要修改的那条提交 pick 改为r ,保存退出
image-20190306170732470

第三步:
退出上图会再次弹出一个图,直接修改log信息,然后保存退出,就成功了(这一步没截图,使用这个黑色的图凑一下,就是这个图)

image-20190306172449746

第四步:
注意下图变基之后的提交sha1都变了
image-20190306172754310

合并多个连续的commit为一个commit

需求:

合并多个提交

image-20190308110734050

第一步:

git rebase -i [父提交sha1]

image-20190308110840579

第二步:弹出下图,把pick改为s ,‘ESC’键,输入:wq 退出

image-20190308105345136

第三步:

这时候会弹出来,键入三次合并一次的提交信息,保存退出

image-20190308110428664

弹出

image-20190308111337716

检查一下子:

image-20190308112309546

合并多个不连续的commit

需求:

image-20190308112852573

步骤繁琐一点,略 可参见视频《怎样把间隔的几个commit整理成1个》

临时加塞的紧急任务怎么办stash

基于上次提交,正在修改A文件,但是还没改完,这时候突然有紧急bug,需要处理C文件,
可以使用 git stash 把目前的修改了一部分的A文件暂存在一边,此时git status发现工作区是干净的,与暂存区一样的,
现在去处理C文件,处理完后提交即可
现在想回过头来继续处理A文件,执行git stash apply或者git stash pop后即可把做了一般的A文件恢复

git stash

把目前手头上的活先搁置到一边存起来

git statsh list

查看所有stash的列表

WIP on master: c5618a9 qqq)

git stash apply

类似堆栈,弹出最上面的stash

把 stash里的改动弹出来,放到工作区,而且stash list里的信息(WIP on master: c5618a9 qqq)还存在

git stash pop

把 stash里的改动弹出来 放到工作区,而且删除stash list里的信息(WIP on master: c5618a9 qqq)

添加忽略文件

image-20190312163655898

image-20190312163830860

注意:

doc 表示不管doc文件夹,也不管doc文件夹下面的文件

doc/ 表示要管里doc文件夹,但是不要管doc文件夹下面的文件

image-20190312163937450

git备份

image-20190312164322223

image-20190312164416037

image-20190312164440055

哑协议(一般不用)

image-20190312165347488

智能协议(一般用这个)

git clone --bare file:///path [仓库名].git [备份仓库名]

image-20190312165823908

本地的仓库push到远端仓库

需求:

在上图中,hello这个仓库是本地的仓库,我们在这里完成工作,并提交到仓库里

上图中的ya.git和zhineng.git属于远端仓库,是通过git clone --bare file:///path [仓库名].git创建的,

现在我们要把平时工作的hello仓库的提交,push到远端的zhineng.git

第一步:通过git remote add建立仓库间的关联

切换到本地hello仓库,执行

git remote add <name> <url>

git remote add [zhineng] [file:///Users/apple/learning/beifen/zhineng.git]

建立关联

此时可以通过 git remote -v查看本地仓库所关联的远端仓库地址

image-20190312180545133

第二步:git push

首次提交需要使用git push --set-upstream zhineng temp
以后使用 git push <name>即可

这样每次本地hello仓库有了变动,就可以push到远端了

注意:如果本地关联了多个远端仓库

  1. 先查看所有的远端仓库 git remote -v
  2. 然后选择你要push的仓库地址 git push [路径]

image-20190313093652346

Github

GitHub里创建ssh公钥、私钥 ?

帮助文档

创建公钥私钥

image-20190313100409056

查看创建好的公私钥(我原来就有,新创建了一个)

image-20190313100221581

在github里配置公钥

配置好公钥后,以后不需要输入账户名密码,github会智能识别你的身份

在上图的命令行里切换到公钥所在目录,输入命令查看公钥信息

image-20190313101201273

然后打开github,复制进去

image-20190313100810563

配置好如下图(这是老师在视频里的截图)

image-20190313100859522

在github上创建一个个人仓库

把本地的仓库关联到github的仓库
  1. 复制远端地址 use HTTPS 可以切换各种协议,得到远端不同的仓库地址
  2. 本地运行git remote add [新起个仓库名字] [远端仓库地址]

image-20190313103652029

image-20190313103951652

往github上push

在上图中 执行 git push [我们起远端仓库名 github] --all

--all表示push本地所有分支

push 之前一定要先在github上配置好公钥,不然会显示没有权限

开始push,出现问题

image-20190313112816596

git fetch [远端仓库名] [远端仓库分支]

image-20190313113532027

gitk --all图形化查看所有分支

image-20190313114237039

我们直接 git merge [远端分支],被拒绝了

image-20190313115159016

需要加上 --allow-unrelated-histories去merge不相关的提交

git merge --allow-unrelated-histories github/master

image-20190313115310232

查看本地+远端所有分支

image-20190313111035200

ok,merge成功了

image-20190313115517344

现在再去push

image-20190313131934726

再次看看图形

本地仓库

image-20190313132039391

github仓库

image-20190313132345982

不同人修改了不同的文件 34

步骤:
  1. 先git push 试一下
  2. 如果被拒绝了,就git fetch
  3. 然后mergegit merge [远端分支名 github/feature/add_git_commands]
  4. 最后再次git push
以下的为演化解释过程
从github上把仓库克隆下来

git clone [远端仓库地址] [克隆到本地后的仓库名字]

image-20190313133750565

为了模拟不同的提交者,我们先建立一个新的用户,用这个zhang用户来操作刚刚git clone的git_hello2本地仓库

在这个git_hello2里创建的local config 后以后这个仓库的提交者就是zhang了

git config --local user.name 'zhang'

git config --local user.email 'zhang@163.com'

bogon:hello apple$ git config --local -l

user.name=zhang
user.email=zhang@163.com
bogon:hello apple$

git branch -av

查看所有分支 远端+本地

git -b [本地分支名] [远端分支地址]

git -b feature/add_git_commands origin/feature/add_git_commands

我们基于远端的origin/feature/add_git_commands分支在本地创建一个新的分支,也叫feature/add_git_commands
如果远端有一个新分支,本地没有,你要是想操作这个分支,就必须在本地基于这个分支建立一个分支,同时,本地分支会关联到远端分支,你就可以操作提交push了 假设你修改了A文件,提交并且push成功了

image-20190313135424137

切换回到原来操作的本地仓库hello,由于现在远端新建的分支,hello仓库还不知道呢,所以先fetch下来

git fetch github

image-20190313150802165

此时此刻,本地还是没有建立新分支的,只是能看见远端出现了一个新分支

image-20190313151155088

现在需要创建新分支命令 git -b feature/add_git_commands origin/feature/add_git_commands

image-20190313151437359

现在本地就有了远端最新的分支了,可以在本地仓库提交push了,假设你修改了B文件,本地提交,

在push时候,报错

image-20190313155736384

提示你要先fetch

image-20190313155851453

现在就可以merge了

git merge [远端分支名 github/feature/add_git_commands]
因为本例子中不同的人分别修改了不同的文件所以没有冲突,直接merge成功了(盗的图意会即可)

image-20190313160218120
然后push即可

image-20190313160425841

理解

探秘.git 隐藏文件夹

理解HEAD文件

在.git文件夹下有个HEAD文件,他里面保存的是指向refs,实际上就是一个在当前分支上的最新的一次提交sha1

每次成功的提交,及每次切换分支,这里都换变化,都指向—》当前分支上的最新的一次提交sha1

git三种对象之前的关系 commit—》tree—》blob

以下的文件都在 objects(上图的红框)里

每次commit 包含一个文件夹(tree)

每个文件夹(tree) 包含一个或者多个文件夹(tree)/文件(blob)

每个文件(blob)在git里存储不是以文件名存储的,而是以sha1存在的,因为对于相同的文件,不同的文件名,git只存储一份,节约空间

分离头指针(危险!!!)

有时候,我们checkout了一个commit(注意:不是切换分支 ,切换分支是 checkout [分支名])
然后我们基于这个commit,进行了变更,现在由于不是在任何分之下进行的变更,在你下次且回到其他分支的时候,git会把这些变更丢弃掉,危险!!!
git比较智能的,你切换分支时候,会提示你,要不要参加一个分支,保存上面的更改
如果你再试试临时性的更改,那就不要创建分支
如果需要保存更改,必须创建分支

理解后就不危险了

其他

列出目录下的文件信息

ls -al

显示目录下的文件信息

拷贝文件

cp [file/dir] [dir]

拷贝文件

. 当前目录

…父目录

cp hao.txt file/c.txt

删除文件

rm [file/dir]

删除文件

创建文件夹

mkdir [dir]

创建文件夹

删除空文件夹

rmdir [空目录]

不过一旦目录非空会提示
Directiry not empty

删除非空文件夹

rm -rf [/User/Dhyana/desktop]

使用rm既可以删除文件又可以删除文件夹
删除文件夹(无论文件夹是否为空),使用 -rf 命令即可。
即:rm -rf 目录名字
-r 就是向下递归,不管有多少级目录,一并删除
-f 就是直接强行删除,不作任何提示的意思

将会删除 /User/Dhyana/desktop目录以及其下所有文件、文件夹

危险!!!使用这个rm -rf的时候一定要格外小心,linux没有回收站的,删除之后再想找回就很难了

重命名文件

mv [readme.txt] [readme]

重命名文件

创建文件

vi [aa.txt]

创建文件aa.txt(并且可以编辑内容)

编辑完 按ESC退出

输入:q(不保存退出)

或者:wq(保存退出)可以在后面加感叹号(强制执行)
vi 会有提示E是可以改
然后按i
下面出现INSERT就可以编辑,编辑完输入:wq!保存退出
切记要将输入法变成英文不然中文输入没反应

寻找该文件夹下的所有文件

find [文件夹路径] -type f

寻找该文件夹下的所有文件 -type f 表示指定找file类型

以上所有内容均为学习***极客时间苏玲老师的《玩转git三剑客》***课程的笔记,老师讲解很透彻,感谢!!!

笔记持续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值