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 init

把文件添加到暂存区

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都会消失),这样可以共存

git reset [sha1] 没有—hard,只是让暂存区与指定的提交变得一模一样,加上—hard是让暂存区、工作区与指定提交一模一样

找回丢失的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

貌似 git reset 就可以实现同样需求,因为默认是HEAD 我们每次在工作区修改了文件,都要先添加到暂存区,然后执行commit,把暂存区的文件提交到仓库

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

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

下图:

  1. 第一次执行 git status 显示你已经把工作区的修改add到了暂存区
  2. 执行完git reset HEAD 后,把暂存区恢复成功与HEAD一样了,也就是说,之前工作区add到暂存区的文件都回退了
  3. 第二次执行git status 显示,你工作区的文件,还没有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

需求:

提交,正在修改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)

添加忽略文件

vi .gitignore

仓库备份

哑协议(一般不用)

智能协议(一般用这个)

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到远端了

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

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

Github

GitHub里创建ssh公钥、私钥 ?

帮助文档

创建公钥私钥

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

在github里配置公钥

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

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

然后打开github,复制进去

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

在github上创建一个个人仓库

把本地的仓库关联到github的仓库

  1. 复制远端地址 use HTTPS 可以切换各种协议,得到远端不同的仓库地址
  2. 本地运行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

步骤:

  1. 先git push 试一下
  2. 如果被拒绝了,就git fetch
  3. 然后mergegit merge [远端分支名 github/feature/add_git_commands]
  4. 最后再次git push

注意:上面的2、3步骤可以合并为一个操作git pull,也就是说;pull=fetch+merge

以下的为演化解释过程

从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即可

不同人修改了同一个文件的不同部分 35

与上面一样

步骤:

  1. 先git push 试一下
  2. 如果被拒绝了,就git fetch
  3. 然后mergegit merge [远端分支名 github/feature/add_git_commands]
  4. 最后再次git push

注意:上面的2、3步骤可以合并为一个操作git pull,也就是说;pull=fetch+merge

不同人修改了同一个文件的同一部分 36

步骤:

  1. git pull(或者git fetch+ git merge),把远端仓库最新提交更新到本地,并且试图去merge
  2. 如果有冲突,打开冲突文件 vi [冲突文件名],手动解决冲突,保存退出
  3. 如果没问题,直接commit -a,如果有问题 git merge --abort 终止手动解决冲突
  4. 最后git push

由于不同人改了文件的同一个部分,此时此刻使用git merge ,发现冲突

打开有冲突的文件,vi readme.md解决冲突

解决后,保存退出

此时,你可以提交了 先add 再commit 也可以 commit -a

但是最好可以使用git status查看一下,

下图中,如果你对手动修改不满意可以使用git merge --abort终止上面的手动修改冲突

如果满意的话,直接commit

最后,git push就好了

一个人改了文件名,另一人继续用原来的文件修改该文件

  1. 第二个人直接git pull就好了,git会感知到修改了文件名和文件内容,就像是是修改了同一个文件的不同位置一样,直接pull就merge成功了(会提醒你写merge 日志)
  2. 然后直接git push就好了

不同人修改同一个文件的文件名

用户A修改了f1的文件名,改为f1-1,并且push成功了

用户B修改了f1的文件名,改为f1-2,此时他push报错

ok,那就git pull

git stauts

然后我们根据实际需要(把f1重命名为f1-2)

  1. git rm f1
  2. git add f1-2
  3. git rm f1-1
  4. 然后 commit,最后push

危险动作 git push -f

远端仓库由于你的push -f force的意思,丢失了很多提交

公共分支千万千万千万不要变基操作

别人是基于某个提交修改的,但是你变基,使得这个提交消失了,那么别人提交就会产生错误,会让别人很苦恼,需要很多merge来修改

高级搜索

关于分支总结

理解

探秘.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三剑客》***课程的笔记,老师讲解很透彻,感谢!!!

笔记持续更新中...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值