【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。

随笔4个月前发布
52 0 0

目录

  • Git下载与安装
  • 设置Git
    • Git的用户设置
  • 使用Git
    • 新增初始Repository
    • 将文件交给Git管控(将文件加入暂存区)
    • 查看Git文件记录
      • 查找commit记录
      • 更改提交commit的记录
      • 撤销提交commit
    • 将某些文件取消Git版控
    • Git中删除或更改文件名
    • Git查看某个文件的某一行代码是谁写的
    • .git目录中有什么?
    • Git资源回收机制
      • Git什么时候会自动触发资源回收机制
  • Git使用分支
    • Git 查看、切换分支
      • 切换分支发生了什么
      • Git更改分支名和删除分支
    • Git合并分支:
      • A合并B 和 B合并A有什么不同?
    • 标签
      • 标签和分支的联系和区别?
    • Git远程连接Github
      • 将内容Push到GitHub
      • Pull下载更新
        • 多人开发时,一定一定要遵循“先拉后推”的顺序,先pull在本地解决冲突,然后在push上去。
      • 从服务器上去的Repository
    • PullRequest

Git下载与安装

windows操作系统下载Git,官方下载链接 git官网下载:
选择自己操作系统对应的版本即可,安装时只需要一路Next即可安装完成,安装完成后选择 Git Bash即可打开,输入git --version如果出现相关版本信息,就安装成功了。
【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。
Linux系统安装更简单,只需要apt-get install git或者sudo apt-get install git

打个广告全篇满满都是干货,看完即会,避免再去看书,省时省钱哦~
以下是本文总字数,包学会的。
【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。

设置Git

Git的用户设置

  1. 全局设置Git用户名和E-mail:
git config --global user.name "Eddie Kao"   # Eddie Kao换成自己的名字
git config --global user.name "eddir@qq.com"  #    eddir@qq.com换成自己的邮箱

git config --list  # 检查是否设置成功

  • 1
  • 2
  • 3
  • 4
  1. 局部设置Git用户,给每个项目设置不同的作者
git config --local user.name "Eddie Kao"   # Eddie Kao换成自己的名字
git config --local user.name "eddir@qq.com"  #    eddir@qq.com换成自己的邮箱

git config --global core.editor emacs # 将基本的vim编辑器改成Emacs

  • 1
  • 2
  • 3
  • 4
  1. 用户个性化设置(设置Git命令的缩写)
git config --global alias.co checkout  # 设置之后输入git co 等于输入git checkout
git config --global alias.br branch  # 设置之后输入git co 等于输入git checkout

  • 1
  • 2
  • 3

使用Git

【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。
图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。

新增初始Repository

cd /tmp
git init # 对tmp这个目录进行git初始化版本控制
git status # 查看目录下的文件版本控制状态

  • 1
  • 2
  • 3

想要该目录移除管控,则把.git文件删除即可。

将文件交给Git管控(将文件加入暂存区)

git add . # 将这个目录中的所有文件版控
git add --all # 将这个目录中的所有文件版控
git add *.html # 将这个目录中的后缀危.html的文件进行版控

# 将暂存区的文件加入到存储库存档
git commit -m "add html file"

git commit -a -m "add html file" # -a参数表示先add 再commit

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

查看Git文件记录

git log

git log --oneline --graph # 将输出结果更加精简化

  • 1
  • 2
  • 3

查找commit记录

git log --oneline --author="xxx" # 查找xxx的commit
git log --oneline --grep="LOL" # 查找commit信息中包含LOL的内容
git log -p welcome.html # 查看welcome.html这个文件的commit记录

  • 1
  • 2
  • 3

更改提交commit的记录

git commit --amend -m "Welcome file" # 修改最后一次commit信息

  • 1

撤销提交commit

git log --oneline  # 查看Git记录

git reset master^
# 或者
git reset HEAD^

  • 1
  • 2
  • 3
  • 4
  • 5

” ^ “这个符号表示“前一次”的提交,如果想要撤销前两次的提交,则是” ^^ “
HEAD是一个指标,指向某一个分支,通常当做“当前所在分支”

将某些文件取消Git版控

创建一个.gitignore文件,Git就会自动读取里面的文件,并进行管控:

touch .gitignore
vim .gitignore
# 将内容写入.gitignore
	secret.html
	*.yml
	*.json
	!index.json

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

则Git将不会把secret.html和所有后缀为yml和后缀为json的文件,但index.json文件除外(!表示除外)

Git中删除或更改文件名

# 删除文件
git rm welcome.html # 删除文件
git rm welcome.html --cached # 不删除文件,只是移除Git版控

# 更改文件名
git mv welcome.html world.html # 更改文件名

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Git查看某个文件的某一行代码是谁写的

git blame index.html # 查看index文件的哪一行是谁在什么时候修改的
git blame -L 5,10 index.html # 查看第5~10行的内容

  • 1
  • 2

.git目录中有什么?

在Git中,有4种很重要的对象,分别是Blob对象,Tree对象,Commit对象和Tag对象。

  1. Blob对象
    例如:index.html当文件被加入暂存区无误后,Git则会在.git目录中生成一个Blob对象,这个对象会将html文件中的内容按照SHA-1的值进行计算,然后存储html文件的内容,可以使用git cat-file -t xxxx来查看xxx(SHA-1压缩值),用git cat-file -p xxxx来还原压缩值。
    因此,如果创建一个空的目录mkdir config,git’是检测不到这个空目录的,因为空的内容是不可以被压缩,即没有SHA-1值,所有git检测不到空的目录。
  2. Tree对象
    理解思路:Blob对象关注文件本身,Tree关注文件即目录的结构信息,Tree是一个有向无环图结构。
  3. Commit对象
    commit对象记录内容如下:
    a. 某个Tree对象;
    b. 本次commit的时间;
    c. 作者信息和本次commit的人
    d. 本次commit的信息
  4. Tag对象
    必须手动的吧Tag铁在某个Commit上, git tag -a big_treasure -n "tag在这里"使用这个命令后会创造一个 big_treasure的tag对象。
    总体理解思路:
    这4种类把Git中的文件(类似于葡萄一样,把跟拎起来就会把所有的葡萄都串起来)
    commit对象会指向某个Tree对象;
    Tree对象的内容会指向某个或者某些Blob对象或者其他的tree对象;
    除了第一个commit(初始的)对象外,所有的commit对象会指向前一次的commit对象;
    Tag对象会指向某一个Commit对象;
    分支虽然不属于这4种对象之一,但它会指向某个Commit对象;
    往Git服务器上推送之后,在.git/refs下就会多出一个remote目录,里面放的是远端的分支,基本上与本地分支类似,同样也会指向某个Commit对象
    HEAD也不属于这4种对象之一,它会指向某个分支。

Git资源回收机制

通常在Git觉得对象太多时会自动触发回收机制,也可以手动触发git gc回收机制,这样子就会把原本放在.git/objects目录下的全部对象打包到.git/objects/pack目录下。

Git什么时候会自动触发资源回收机制

  1. 当.git/object目录的对象或者打包的packfile数量过多时,Git会自动触发资源回收命令。
  2. 当执行git push命令将内容推送至远端时。
    对于内存空间问题,Git不是很在意,最主要的是版本迭代,因此,能够快速和高校的操作Git才是关键。

Git使用分支

分支其实可以想象成贴纸,贴在某一个Commit上,当做了一次新的commit时,这个新的commit会指向前一个commit(前面说过),分支就会贴到新的commit
Git中的分支不是通过复制目录活文件来进行改动形成的。

Git 查看、切换分支

git branch # 查看当前分支

  • 1

【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。

git branch cat
git checkout cat # 切换到cat分支

  • 1
  • 2

【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。
注意,切换分支时必须该分支存在才行,如果改分支不存在,则会报错。

切换分支发生了什么

切换分支主要做了2件事:

  1. 更新暂存区和工作目录,当切换分支时,会用该分支指向的那个commit内容来“更新”暂存区及工作目录。但在切换分支之前所做的改动则会留在工作目录不收影响,即切换分支并不影响已经在工作目录中的那些改动。
  2. 变更HEAD的位置。除了更新暂存区和工作目录的内容外,HEAD也会指向刚刚切过去的那个分支,即.git/HEAD文件会一起被改动。

Git更改分支名和删除分支

git branch -m cat tiger

  • 1

参数 -m表示修改分支名,原分支名 想要新修改分支名

git branch -d tiger # 如果想强制删除,则使用-D 参数进行强制删除

  • 1

Git合并分支:

用master分支来合并cat分支:

# 先切换回master分支
git checkout master
# 使用git merge进行合并
git merge cat # 目前在master分支

  • 1
  • 2
  • 3
  • 4

A合并B 和 B合并A有什么不同?

从最终结果来看是一样的,但过程会有点区别。
假设master分支创建了dog和cat分支,并且现在正在cat分支:
1. 如果master要合并cat或者dog分支,Git直接使用快转模式进行合并,也就是直接收割cat或dog的成果。(因为cat和dog都是master创建的)

A合并B和B合并A的区别:
从最终结果来说,二者并没有什么区别,只是在合并过程中有区别;
cat和dog分支有相同的来源(master),当cat要合并dog或者dog要合并cat时,Git生成一个额外的Commit来处理,而一般的Commit只会指向某一个Commit,但是这个Commit会指向两个Commit,明确标记来自哪两个分支。
1. 假设想用cat分支来合并dog分支(现在在cat分支上)运行git merge dog
2. Git将生成额外的Commit对象,这个Commit会分别指向cat和dog分支,HEAD随着cat分支往前,而dog分支会停留在原地。(dog合并cat则反之)
二者区别:
1. 合并的分支会继续往前,被合并的分支就会停留在原地,HEAD也会随之指向到合并分支;
2. 为了合并而生成的额外的Commit对象,会记录是谁合并的谁(cat合并dog,则会记录cat在前;dog合并cat,则会记录dog在前)
其实所谓的合并分支,合并的不是分支,其实合并的是:分支指向的那个Commit,分支只是贴纸是没办法合并的。之所以说“合并分支”是比“合并commit”更好理解。

标签

标签是一个指向某个Commit的指示标,通常在开发软件是会完成特定的“里程碑”。
标签分为两种:

  • 轻量标签:只需直接指定要贴上去的那个Commit即可,命令git tag xxxx将xxx贴到当前的Commit上。轻量标签只是一个标签,不含有其他信息。
  • 附注标签:带有信息的标签
git tag tag_name -a -m "test tag"

  • 1

其中,-a参数就是创建有附注的标签;后面的-m参数则是附注的信息(-d参数是删除标签,例如:git tag -d tag_name

标签和分支的联系和区别?

二者被删除时都不会影响到被指到的对象;
区别:分支会随着Commit移动而移动,但标签不会移动,一旦贴上,就停留在当前位置。因此,分支可以看做会移动的标签

Git远程连接Github

Git是工具,GitHub是网站,GitHub的本体是一个Git服务器。

将内容Push到GitHub

  1. 先在GitHub上创建新项目:在GitHub网站的右上角单击+,选择New respository ,如图所示
    a. Repository name可以随意填写,只要不重复就行。
    b. 存取权限选中Public单选按钮,免费试用。
    c. 单击Create repository按钮,即可增加一个Repository。
    d. 需要填写一个README.md文档(填不填都行)
    将一下流程走完就可以创建新的仓库了。
    【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。
    【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。
  2. 接下来就是我们熟悉的Git命令了
git init # 初始化.git
git add README.md # 添加README.md文档
git commit -m "first commit"

  • 1
  • 2
  • 3
  1. 以上是简单的Git基本招式,接下来准备把内容推送到远端的Git服务器,首先需要设置一个远端节点:
git remote add origin git@https://github.com/1841302012/yolov5.git

  • 1

需要说明的是:
a. git remote指令主要进行与远端有关的操作;
b. add指令是指要加入一个远端的节点;
c. 这里的origin是一个代名词,指的是后面那串GitHub服务器的位置;
4. 将内容推送到远端服务器:

git push -u origin master

  • 1

这个push指令做了:
a. 把master分支推向origin位置;
b. 在origin远端服务器上,如果master不存在,就创建一个名为master的分支;
c. 如果服务器上存在master分支,就会移动分为上的master分支的位置,使它指到当前最新的进度上。
d. -u参数表示upstream,将该分支设置为上游分支,以后的更新就会把这个当做默认值。(如果不设置上游分支,则Git不知道要将新内容提交到哪,就要每次都设置远端分支,比较麻烦)

Pull下载更新

pull命令是将远端代码拉回本机更新,但其实fetch才是下拉的主角。
直接输入命令git fetch,会发现没有任何变化,因为远端的代码并没有发生改变,因此,需要先改变远端代码,才能看到变化。
git pull = git fetch + git commit,git pull命令相当于去线上把内容抓下来冰鞋更新本机的进度。

多人开发时,一定一定要遵循“先拉后推”的顺序,先pull在本地解决冲突,然后在push上去。

因为本地计算机的内容可能是比较旧的,应该先拉一份在线版本的内容更新后再推上远程分支。

从服务器上去的Repository

当我们在GitHub上看到很有趣的项目时,如何把它拉到本地呢?

git clone https://github.com/1841302012/yolov5.git

  • 1

即可把这个项目克隆到本地(clone只有第一次拉项目才使用)
【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。

PullRequest

当你在GitHub看到好的项目,并且想要帮忙开发时,由于该项目是别人的,你没有修改权限。
因此,你可以:
1. 先复制(fock)一份原作者的项目到自己的GitHub账号下;(因此你就有了权限)
2. 改完后再把项目推送上GitHub(Push);
3. 发个PullRequest通知告诉原作者,你修改了什么,做了那些事情;
4. 原作者看到如果觉得可以,就会进行merge,把你的分支合并到他的项目中。

感谢你看到了最后,这就是Git最常用的使用教程,相信你已经学会啦,快去注册GitHub账号试试吧!

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...