Git三剑客之基本操作

下载:

Git - 安装 Githttps://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git

检查版本

git --version

配置基本的用户名与邮箱(全局)

git config --global user.name ‘huyilong’
git config --global user.email ‘835972443@qq.com’

查看Git安装路径

which -a git

新建的项目直接用用Git管理

如果是已经有了项目然后再进行管理的话那么就直接进入文件夹执行

git init

以下为新建git仓库然后再管理

cd 某个文件夹

git init your_project

cd your_project

ls -al //查看所有文件包括隐藏文件

初始化代码仓库 git init_learning

git commit -m'Add readme' // 提交一个版本控制并且说明信息



git add PyTest.ipynb // 让git管控该文件

管控之后再进行提交版本控制



git status // 查看git的状态  

工作区与暂存区

commit到暂存区中的文件已经属于git的管理范畴了。但是只是预提交不是正是提交。相当于中间的一个缓存,我们可以在这个缓存中多次修改最终去提交。除了错我们也可以回滚,因为它不是正是的提交。在git中称这个缓存区为工作树。

git add 一个文件夹 #就是将这个文件(夹)添加到缓存区
git commit -m '这里写上添加的备注' #这个是git将暂存区里面的内容提交

git -u #将git所跟踪的文件一次性都放到缓存区

git commit -am'Add test branch' # 绕过暂存区直接提交到历史库中

 Git中名字的修改

如果直接修改的话就会显示直接删除然后重新创建了一个文件。但是并没有与git发生关联,也就是只修改了物理但是没有修改逻辑。只有手动的使用git命令去建立逻辑上的关系这时git才会知道它所做的事情。

git reset--hard #清理暂存区

 所以正确的做法是使用git的重新命名的方式。

git mv A A.txt #修改文件名

 通过git查看版本历史

git log --oneline #简洁显示git的log

git log -n2 #查看最近的两条log
git log -n2 --oneline #简洁显示最近的两条log

git branch -v #查看分支
git checkout -b branch_name fb8cc1e608a0498a886 #创建一个分支,后面的fb**指的是这个分支是从master的这个编号的提交中演化出来的。

 查看当前分支的名字。

 查看所有的分支

 

 图形化显示log

版本历史的图形工具gitk

揭秘.git文件夹

HEAD

 HEAD表示当前的工作分支。可以使用git branch -av来查看。

 在切换分支的时候必须首先回到工作目录再使用git checkout master

 config

代表着我们在设置local时所设置的一些配置。

修改这个文件相当于是git config --local user.name '123' 的效果是一样的(以用户名为例)。

refs

这个文件夹最重要的就是

heads:我们创建的分支。

tags:我们创建的一些标签,可以认为是一些具有里程碑意义的事件,所以我们做了一些标记。

 而main文件的里面存放的是该分支commit的id号。意味着master的指针指向哪一个commit。

 查看文件类型

 

需要注意的是这里的hash遵循前缀匹配如果前缀太短而不能匹配的时候就输入更长的前缀。

objects

这些文件夹里面存放着二进制文件。树对象等等。其中pack表示会将琐碎的文件整合起来。

 再拼上文件的前缀的情况下能够查看文件的类型(t)与内容(p)。

到此为止已经涉及到了git的核心对象,commit,tree,blob。

commit|tree|blob的关系

commit表示当前工作空间的快照。而快照是按照树的方式呈现的。 

它的组织方式与文件系统一直,就是有目录文件与文件目录。 如果是文件则直接指向blob,如果是目录的话指向下一层目录(下一层树)这里的树可以理解为索引节点当然就会有一级索引节点与二级索引节点。需要注意的是只要blob没变多个版本(commit)会指向同一个blob,大大的节省了资源。

通过创建简单的案例来剖析objects中的对象及其结构

 步骤

新建watch_git_objects仓库。

创建空的文件夹doc。此时git不会做出任何反应。在doc下创建一个新文件时git会做出反馈。

 与此同时objects文件中会多出来一个blob对象。

 当提交之后会将tree对象与commit对象都产生出来。

 他们的类型与内容分别如下

 分离头指针的含义

场景:当我们切换到一个commit的时候就会处于一个分离头指针的状态。也就是脱离所有分支的一个游离状态。在这种状态下依然可以开发,但是如果再切换到主分支的时候且此时分离头指针还依然处于未绑定状态这时游离的那一部分就会被当做垃圾回收掉。如果想保留分离时开发的必须做出绑定。具体的绑定的细节就是使用git branch branch_name 1decsdfa 为这个分离头指针创建一个分支。

HEAD的具体用法

创建新分支且切换到新分支。

 后面是父分支。修改之后,HEAD指向了新的分支。

 HEAD可以指向一个commit也可以指向一个branch。当切换分支时HEAD会跟随当前的分支而分支最后也要落脚到一个commit所以可以把HEAD看做是头指针。

使用 git diff 2392d4f5 d8767e7503对比不同commit的不同。

 也可以使用当前路径的方法。

 分支的删除

 强制清除(对于没有merge的分支来说我确实不想要了)使用-D的方式。

修改commit的信息(这些都是基于本地的仓库的commit)

修改最近一次的commit的信息

修改旧的commit的信息

要修改A的commit就要rebase到A的父commit。其中rebase操作需要分离头指针的支持。可以根据选项来选择修改类型。这里的案例只是修改提交信息。

git rebase -i 2392d4f5b9

 只改名字

 然后再文本中直接修改名字就ok了。

 修改之后发现内容没变但是ID号变了

 合并commit(注意是commit而非branch)

将一些小的功能合并成大的功能。

仍然是选择要合并的几个commit的父commit。

使用s选项把要合并的分支合并了。 如将d8与c8合并。

 用到的命令

合并不连续的commit

 假设要合并1,3commit。

git rebase -i 2392d4f5b

 补充commit修改如下。

 git rebase --continue

 

出现两个无祖先的节点,我们最后工程需要的节点是上面的那两个。剩下的可以删除掉。 

暂存区与HEAD比较

暂存区的东西能否够提交。就是比较最新的提交的文件与暂存区中的文件的区别。

git diff --cached

工作区与暂存区的差异

git diff //这个会比较全部的差异比如修改了两个文件

 如果后面加上具体的文件名就能够查看具体的文件变化。如git diff -- readme.md(注意这里的空格)。

将暂存区同步成与当前工作区相同

全部文件

git reset HEAD

部分文件同步成工作区

git reset HEAD -- A B C

后面可以跟着多个文件。

执行之后使用git diff --cached 结果为空。

将工作区同步成暂存区

使用git checkout -- filename

 撤销最近几个commit

比如要回到8a1503fbba这个commit.

 之前的树状图。

 之后的树状图。

 分支与commit的区别,分支是分叉动作,commit是在一个分支上的推进动作。

比较两个分支(两个分支最新的提交的内容的差异)

也可以推广到直接比较两个commit号来比较commit。

 比较temp01与rebase_branch的区别。

全部变化

显示的是由A 到 B的变化。

 某个文件的变化

也可以直接使用commit的编号。 

正确删除路径下面的文件

git rm filename

将当前任务挂起到一个堆栈

将当前的commit保存到一个堆栈中。

 此时的缓冲区就空了可以做其他的事情。

 当做完要紧的事情之后要恢复之前的任务可以使用以下两种命令。

其中 git stash apply是直接取头而不会弹出元素。

 执行list命令可以看到挂起队列还有刚刚放进去的元素

使用git reset --hard HEAD使得缓冲区变得干净。

git stash pop 直接将堆栈中的内容弹出。

让Git忽略一些文件(夹)

在实际的开发中,有一些文件不需要被git管理纳入到开发代码中去,比如说一些doc,Java开发中的.class文件我们都可以使用原始代码直接生成所以不需要Git托管。

在工作路径下创建A.Class文件

 创建.gitignore文件,并且写上不需要托管的文件类型。

 此时git不在跟踪.Class文件

 注意:过滤名单必须是.gitignore。里面的ABC/的含义是ABC文件下的文件不在托管,而ABC的文件(不在ABC文件夹下的)还是会被管理的。

实现仓库之间的同步

常用传输协议

 

 使用呀协议来备份仓库

git clone --bare /Users/logic/git_learning/.git ya.git

 使用只能协议来备份仓库

git clone --bare file:///Users/logic/git_learning/.git smart.git

实时同步项目

与远端仓库建立连接

git remote add zhineng file:///Users/logic/git_backup/smart.git

 比如在源端删除一个分支

 此时的远端还没有被删除

 使用push命令

git push --set-upstream zhineng temp02

​​​​​​​

关于"Everything up-to-date"问题,解决方法就是先add+commit。然后再去同步,而且只能够同步当前分支所改变的内容。下面为新增一个分支。

 在远端

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elong_Hu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值