Git-学习笔记

763 阅读7分钟

Git笔记

[TOC]

Git基础

使用Git之前需要做的最小配置

git config [--local | --global | --system] user.name 'Your name' git config [--local | --global | --system] user.email 'Your email'

查看配置git config --list [--local | --global | --system] 区别 local:区域为本仓库 global: 当前用户的所有仓库 system: 本系统的所有用户

创建第一个仓库,并配置local信息
  • 把已有的项目代码纳入Git管理
$cd 项目代码所在的文件夹
$git init
  • 新建的项直接用Git管理
cd 某个文件夹
git init your_project #会在当前路径下创建和项目名称同名的文件夹
cd your project
工作区和暂存区
  • 工作目录-->暂存区 :git add files
  • 暂存区-->版本历史:git commit
graph LR;
工作目录-->暂存区
暂存区-->版本历史
文件重命名
  • 直接重命名文件,是删除和添加的两个操作。 rm file add file
  • 可以通过git mv oldFileName newFileNames之间
git log查看日志

git log --all 查看所有分支的历史 git log --all --graph 查看图形化的 log 地址 git log --oneline 查看单行的简洁历史。 git log --oneline -n4 查看最近的四条简洁历史。 git log --oneline --all -n4 --graph 查看所有分支最近 4 条单行的图形化历史。 git help --web log 跳转到git log 的帮助文档网页

gitk图像化界面

  • setp 1 在命令行输入gitk,开启图形化界面
  • step2 选择view
  • step3 All refs 查看所有分支

.git目录 //TODO
  • COMMIT_EDITMSG
  • config 当前 git 的配置文件
  • description (仓库的描述信息文件)
  • HEAD (指向当前所在的分支),例如当前在 develop 分支,实际指向地址是 refs/heads/develop
  • hooks [文件夹]
  • index
  • info [文件夹]
  • logs [文件夹]
  • objects [文件夹] (存放所有的 git 对象,对象哈希值前 2 位作为文件夹名称,后 38 位作为对象文件名, 可通过 git cat-file -p 命令,拼接文件夹名称+文件名查看)
  • ORIG_HEAD
  • refs [文件夹]
  • heads (存放当前项目的所有分支)
  • tags (存放的当前项目的所有标签,又叫做里程碑)
  • cat 命令, 功能:用来显示文件。 例如 cat text.md 显示 text.md 文件的内容
  • ls -al 命令, 表示列出当前目录下的所有文件(包括隐藏文件)
  • git cat-file -t 命令 , 查看 git 对象的类型
  • git cat-file -p 命令, 查看 git 对象的内容
  • git cat-file -s 命令, 查看 git 对象的大小
commit、tree、blob三个对象之间的关系

当我们添加或者修改了文件并且add到Stage Area之后

  • 首先会根据文件内容创建不同的blob,
  • 当进行提交之后马上创建一个tree组件把需要的blob组件添加进去,
  • 之后再封装到一个commit组件中完成本次提交。
  • 在将来进行reset的时候可以直接使用git reset --hard xxxxx可以恢复到某个特定的版本,在reset之后,git会根据这个commit组件的id快速的找到tree组件,然后根据tree找到blob组件,之后对仓库进行还原,整个过程都是以hash和二进制进行操作,所以git执行效率非常之高。

分离头指针

git check out git checkout commitId:会出现分离头指针的情况,这种情况下比较危险,因为这个时候你提交的代码没有和分支对应起来,当切换到其他分支的时候(比如master分支),容易丢失代码。但是分离头指针也有它的应用场景,就是在自己做尝试或者测试的时候可以分离头指针,当尝试完毕没有用的时候可以随时丢弃,但是如果觉得尝试有用,那么可以新建一个分支,使用 git branch <新分支的名称> commitId

HEAD和Branch

HEAD头指针可以指向一个分支,也可以指向一个commit。

1 一个节点,可以包含多个子节点(checkout 出多个分支) 2 一个节点可以有多个父节点(多个分支合并) 3 ^是~都是父节点,区别是跟随数字时候,^2 是第二个父节点,而~2是父节点的父节点 4 ^和~可以组合使用,例如 HEAD~2^2

git删除分支

git branch -d branch_name:使用-d 在删除前Git会判断在该分支上开发的功能是否被merge的其它分支。如果没有,不能删除。如果merge到其它分支,但之后又在其上做了开发,使用-d还是不能删除。-D会强制删除。

commit修改message信息
  • 对最新一次提交做 commit 修改 git commit --amend
  • 对历史的提交信息,进行修改 git log查看提交历史 git rebase -i 需要提交commitId的父Id 对这个提交及其之后的所有提交可以选择保留或休息信息等其它操作

把几个连续的commit整理成一个

git rebase -i 需要提交commitId的父Id,选择squash,use commit,but meld into previous commit

git rebase -i 开始commit [结束commit], 在执行这个命令时,如果没有指定 结束commit,那么结束commit 默认为当前分支最新的 commit,那么rebase 结束后会自动更新当前分支指向的 commit,如果指定了结束 commit,而且结束 commit不是当前分支最新的 commit,那么rebase 后会有生成一个 游离的 head,,而且当前分支指向的commit 不会更新

比较暂存区和HEAD所含文件的差异

git diff --cached或者git diff —staged

比较工作区和暂存区的差异

假定:HEAD、缓存区、工作区中的readme.md文件内容均不相同。 git diff HEAD -- readme.md # 工作区 <===> HEAD git diff -- readme.md # 工作区 <===> 缓存区 git diff --cached -- readme.md # 缓存区 <===> HEAD

让工作区的文件恢复到和暂存区一样

1.暂存区恢复成HEAD:git reset 2.工作区恢复成暂存区:git checkout

消除最近的几次提交

修改了工作区,恢复:git checkout  add后,想撤销: git reset HEAD  commit后,想撤销: git reset--hard hash值

查看不同提交的指定文件的差异

git diff commit-id1 commit-id2 path-to-filename

删除文件的正常操作

原始的 是用rm删除工作区,然后再git rm 其实可以直接用 git rm filename

开发中临时加塞了紧急任务怎么处理

保存工作区的内容,然后切换到其它分支进行开发,开发完成之后。在切回来,回复工作区的内容。

git stash 保存工作区的内容 git stash list 查看工作区的内容 git stash apply 提取内容到工作区,但不删除stash中的内容 git stash pop 提取内容到工作区,并且删除stash中的内容

指定不需要git管控的文件

设置.ignore文件 github.com/github/giti… Java.ignore

# Compiled class file*
.class
# Log file*
.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar*
.war*
.nar*
.ear*
.zip*
.tar.gz*
.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
如何讲git仓库备份到本地

阐述协议

备份特点

  • 哑协议 $ git clone --bare /e/testgit/git_learning/.git ya.git

  • 智能协议 $ git clone --bare file:///e/testgit/git_learning/.git zhineng.git

  • 添加远程分支 $ git remote add zhineng file:///e/testgit/git_learning/.git zhineng.git

  • 推送给远程的备份的分支 $ git push --set-upstream zhineng master

配置公私钥

生成公私钥 $ ssh-keygen -t rsa -b 4096 -C "chenjiagen@qq.com" 生成的位置固定的在当前用户目录下的.ssh目录下 cd ~/.ssh /c/Users/jogeen/.ssh

id_rsa 私钥文件 id_rsa.pub 公钥文件 将公钥文件内容拷贝到github中进行设置。

d28302b86e638a2b61c2fb790f2f42dd.png

把本地仓库同步到GitHub
  • 添加github远程仓库 $ git remote add github git@github.com:jogeen/git_learning.git
  • 查看所有的远程仓库 $ git remote -v
  • 查看分支 $ git branch -va
  • 将本地所有分支都推送到github远程仓库 $ git push github --all
  • 如果存在推送失败,需要先
    • 拉远程分支 $ git fetch github master
    • 在强行合并 $ git merge  --allow-unrelated-histories github/master
git 本地创建分支,推送到远程

git push --set-upstream origin localbranch

备注

本文是我个人学习了苏玲老师的专栏课程之后,结合专栏文章和老师对同学答疑整理的学习笔记。仅供分享。更多精彩内容,大家可以扫描下方二位码,在极客时间订阅苏玲老师的课程。获取一手学习资料。