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这个命令的惨痛教训
修改文件名之后,提交到暂存区
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
删除分支
git branch -d [分支名]
git branch -D [分支名]
如果-d清除不掉的,确实不想要,可以用-D
其实就是让你确认删除的意思
查看文件类型
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^^
比较暂存区与HEAD之间的差异
git diff --cached
比较工作区与HEAD之间的差异
git diff —HEAD
比较工作区与暂存区差异
git diff
注意后面什么都不加,表示所有文件作比较
可以使用
git diff -- [文件名]
来单独比较指定的文件,注意 --与[文件名]之间必须加空格
如何让暂存区的全部文件恢复成和HEAD的一样?
git reset HEAD
我们每次在工作区修改了文件,都要先添加到暂存区,然后执行commit,把暂存区的文件提交到仓库
git status 是查看工作区与暂存区文件的区别,他不会显示每个文件的具体那内容,只是告诉你
- 工作区有一个文件没添加到暂存区 红色 还不能提交
- 工作区有一个文件内容修改了,但是没添加到暂存区 红色 还不能提交
- 你已经把工作区的修改添加到了暂存区 绿色 可以直接提交了
下图:
- 第一次执行 git status 显示你已经把工作区的修改add到了暂存区
- 执行完git reset HEAD 后,把暂存区恢复成功与HEAD一样了,也就是说,之前工作区add到暂存区的文件都回退了
- 第二次执行git status 显示,你工作区的文件,还没有add进暂存区,
- 其实git reset HEAD 是 git add 的逆向操作
暂存区里的部分文件恢复成和HEAD一样
git reset HEAD -- [文件名]
git reset HEAD -- [文件名] [文件名]
多个文件之间使用空格
工作区恢复成暂存区状态 23
git checkout — [文件名]
如果变暂存区内容:reset
如果变工作区内容:checkout
消除最近的几次提交 24
git reset — hard [commit sha1值]
修改最近一次提交的msg
git commit --amned
弹出
修改完退出后
修改前几次的提交信息
git rebase -i [commit sha1]
假设log历史为
5
4
3
2
1第一步:
注意:要改变第3条log,必须
git rebase 2
也就是3的父亲,然后再展开操作第二步:
弹出下图,把你要修改的那条提交 pick 改为r ,保存退出
第三步:
退出上图会再次弹出一个图,直接修改log信息,然后保存退出,就成功了(这一步没截图,使用这个黑色的图凑一下,就是这个图)
第四步:
注意下图变基之后的提交sha1都变了
合并多个连续的commit为一个commit
需求:
合并多个提交
第一步:
git rebase -i [父提交sha1]
第二步:弹出下图,把pick改为s ,‘ESC’键,输入:wq 退出
第三步:
这时候会弹出来,键入三次合并一次的提交信息,保存退出
弹出
检查一下子:
合并多个不连续的commit
需求:
步骤繁琐一点,略 可参见视频《怎样把间隔的几个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)
添加忽略文件
注意:
doc 表示不管doc文件夹,也不管doc文件夹下面的文件
doc/ 表示要管里doc文件夹,但是不要管doc文件夹下面的文件
git备份
哑协议(一般不用)
智能协议(一般用这个)
git clone --bare file:///path [仓库名].git [备份仓库名]
本地的仓库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
查看本地仓库所关联的远端仓库地址
第二步:git push
首次提交需要使用
git push --set-upstream zhineng temp
以后使用git push <name>
即可这样每次本地hello仓库有了变动,就可以push到远端了
注意:如果本地关联了多个远端仓库
- 先查看所有的远端仓库
git remote -v
- 然后选择你要push的仓库地址
git push [路径]
Github
GitHub里创建ssh公钥、私钥 ?
创建公钥私钥
查看创建好的公私钥(我原来就有,新创建了一个)
在github里配置公钥
配置好公钥后,以后不需要输入账户名密码,github会智能识别你的身份
在上图的命令行里切换到公钥所在目录,输入命令查看公钥信息
然后打开github,复制进去
配置好如下图(这是老师在视频里的截图)
在github上创建一个个人仓库
略
把本地的仓库关联到github的仓库
- 复制远端地址 use HTTPS 可以切换各种协议,得到远端不同的仓库地址
- 本地运行git remote add [新起个仓库名字] [远端仓库地址]
往github上push
在上图中 执行 git push [我们起远端仓库名 github] --all
--all
表示push本地所有分支
push 之前一定要先在github上配置好公钥,不然会显示没有权限
开始push,出现问题
git fetch [远端仓库名] [远端仓库分支]
gitk --all
图形化查看所有分支
我们直接 git merge [远端分支],被拒绝了
需要加上 --allow-unrelated-histories
去merge不相关的提交
git merge --allow-unrelated-histories github/master
查看本地+远端所有分支
ok,merge成功了
现在再去push
再次看看图形
本地仓库
github仓库
不同人修改了不同的文件 34
步骤:
- 先git push 试一下
- 如果被拒绝了,就git fetch
- 然后merge
git merge [远端分支名 github/feature/add_git_commands]
- 最后再次git push
以下的为演化解释过程
从github上把仓库克隆下来
git clone [远端仓库地址] [克隆到本地后的仓库名字]
为了模拟不同的提交者,我们先建立一个新的用户,用这个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成功了
切换回到原来操作的本地仓库hello,由于现在远端新建的分支,hello仓库还不知道呢,所以先fetch下来
git fetch github
此时此刻,本地还是没有建立新分支的,只是能看见远端出现了一个新分支
现在需要创建新分支命令
git -b feature/add_git_commands origin/feature/add_git_commands
现在本地就有了远端最新的分支了,可以在本地仓库提交push了,假设你修改了B文件,本地提交,
在push时候,报错
提示你要先fetch
现在就可以merge了
git merge [远端分支名 github/feature/add_git_commands]
因为本例子中不同的人分别修改了不同的文件所以没有冲突,直接merge成功了(盗的图意会即可)
然后push即可
理解
探秘.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三剑客》***课程的笔记,老师讲解很透彻,感谢!!!
笔记持续更新中…