Git详细使用教程

1 篇文章 0 订阅

git

1.1 什么是git

Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 [1]  也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。

1.2 git 官网

https://git-scm.com/

1.3 Git 工作区、暂存区和版本库

  • **工作区:**就是你在电脑里能看到的目录。

  • **暂存区:**英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

  • **版本库:**工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

    img

    • 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
    • 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
    • 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
    • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
    • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
    • 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
    • 当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
    • 当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
    • 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

    1.4 Git 创建仓库

    git init

    Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。

    在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。

    使用方法

    使用当前目录作为 Git 仓库,我们只需使它初始化。

    git init
    

    该命令执行完后会在当前目录生成一个 .git 目录。

    使用我们指定目录作为Git仓库。

    git init newrepo
    

    初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。

    如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:

    $ git add *.c
    $ git add README
    $ git commit -m '初始化项目版本'
    

    以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。

    注: 在 Linux 系统中,commit 信息使用单引号 ',Windows 系统,commit 信息使用双引号 "。

    所以在 git bash 中 git commit -m ‘提交说明’ 这样是可以的,在 Windows 命令行中就要使用双引号 git commit -m “提交说明”

    git clone

    我们使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)。

    克隆仓库的命令格式为:

    git clone <repo>
    

    如果我们需要克隆到指定的目录,可以使用以下命令格式:

    git clone <repo> <directory>
    

    参数说明:

    • **repo:**Git 仓库。
    • **directory:**本地目录。

    比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:

    $ git clone git://github.com/schacon/grit.git
    

    执行该命令后,会在当前目录下创建一个名为grit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。

    如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:

    $ git clone git://github.com/schacon/grit.git mygrit
    

    编辑 git 配置文件:

    $ git config -e    # 针对当前仓库 
    

    或者:

    $ git config -e --global   # 针对系统上所有仓库
    

    设置提交代码时的用户信息(全局用户信息):

    $ git config --global user.name "runoob"
    $ git config --global user.email test@runoob.com
    

    git reset 命令


    git reset 命令用于回退版本,可以指定退回某一次提交的版本。

    git reset 命令语法格式如下:

    git reset [--soft | --mixed | --hard] [HEAD]
    

    –mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。

    git reset  [HEAD] 
    

    实例:

    $ git reset HEAD^            # 回退所有内容到上一个版本  
    $ git reset HEAD^ hello.php  # 回退 hello.php 文件的版本到上一个版本  
    $ git  reset  052e           # 回退到指定版本
    

    –soft 参数用于回退到某个版本:

    git reset --soft HEAD
    

    实例:

    $ git reset --soft HEAD~3   # 回退上上上一个版本 
    

    –hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:

    git reset --hard HEAD
    

    实例:

    $ git reset --hard HEAD~3  # 回退上上上一个版本  
    $ git reset –hard bae128  # 回退到某个版本回退点之前的所有信息。 
    $ git reset --hard origin/master    # 将本地的状态回退到和远程的一样 
    

    **注意:**谨慎使用 –hard 参数,它会删除回退点之前的所有信息。

    HEAD 说明:

    • HEAD 表示当前版本

    • HEAD^ 上一个版本

    • HEAD^^ 上上一个版本

    • HEAD^^^ 上上上一个版本

    • 以此类推…

    可以使用 ~数字表示

    • HEAD~0 表示当前版本

    • HEAD~1 上一个版本

    • HEAD^2 上上一个版本

    • HEAD^3 上上上一个版本

    • 以此类推…

    git reset HEAD

    git reset HEAD 命令用于取消已缓存的内容。

    我们先改动文件 README 文件,内容如下:

    # Runoob Git 测试
    # 菜鸟教程 
    

    hello.php 文件修改为:

    <?php
    echo '菜鸟教程:www.runoob.com';
    echo '菜鸟教程:www.runoob.com';
    echo '菜鸟教程:www.runoob.com';
    ?>
    

    现在两个文件修改后,都提交到了缓存区,我们现在要取消其中一个的缓存,操作如下:

    $ git status -s
        M README
        M hello.php
    $ git add .
    $ git status -s
    M  README
    M  hello.php
    $ git reset HEAD hello.php 
    Unstaged changes after reset:
    M    hello.php
    $ git status -s
    M  README
        M hello.php
    

    现在你执行 git commit,只会将 README 文件的改动提交,而 hello.php 是没有的。

    $ git commit -m '修改'
    [master f50cfda] 修改
        1 file changed, 1 insertion(+)
    $ git status -s
        M hello.php
    

    可以看到 hello.php 文件的修改并未提交。

    这时我们可以使用以下命令将 hello.php 的修改提交:

    $ git commit -am '修改 hello.php 文件'
    [master 760f74d] 修改 hello.php 文件
        1 file changed, 1 insertion(+)
    $ git status
    On branch master
    nothing to commit, working directory clean
    

    Git 基本操作

    创建仓库命令

    下表列出了 git 创建仓库的命令:

    命令说明
    git init初始化仓库
    git clone拷贝一份远程仓库,也就是下载一个项目。

    提交与修改

    Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。

    下表列出了有关创建与提交你的项目的快照的命令:

    命令说明
    git add添加文件到暂存区
    git status查看仓库当前的状态,显示有变更的文件。
    git diff比较文件的不同,即暂存区和工作区的差异。
    git commit提交暂存区到本地仓库。
    git reset回退版本。
    git rm将文件从暂存区和工作区中删除。
    git mv移动或重命名工作区文件。

    提交日志

    命令说明
    git log查看历史提交记录
    git blame <file>以列表形式查看指定文件的历史修改记录

    远程操作

    命令说明
    git remote远程仓库操作
    git fetch从远程获取代码库
    git pull下载远程代码并合并
    git push上传远程代码并合并

Git 分支管理

几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。

使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WfJrjoEY-1662454510012)(https://static.runoob.com/images/svg/git-brance.svg)]

Git 分支实际上是指向更改快照的指针。

有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。

创建分支命令:

git branch (branchname)

切换分支命令:

git checkout (branchname)

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。

合并分支命令:

git merge 

你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。

开始前我们先创建一个测试目录:

$ mkdir gitdemo
$ cd gitdemo/
$ git init
Initialized empty Git repository...
$ touch README
$ git add README
$ git commit -m '第一次版本提交'
[master (root-commit) 3b58100] 第一次版本提交
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README

Git 分支管理

列出分支

列出分支基本命令:

git branch

没有参数时,git branch 会列出你在本地的分支。

$ git branch
* master

此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。

当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。

如果我们要手动创建一个分支。执行 git branch (branchname) 即可。

$ git branch testing
#查看本地分支
$ git branch
* master
  testing
#查看本地和远程仓库
$ git branch -a

现在我们可以看到,有了一个新分支 testing

当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。

接下来我们将演示如何切换分支,我们用 git checkout (branch) 切换到我们要修改的分支。

$ ls
README
$ echo 'runoob.com' > test.txt
$ git add .
$ git commit -m 'add test.txt'
[master 3e92c19] add test.txt
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
$ ls
README        test.txt
$ git checkout testing
Switched to branch 'testing'

当我们切换到 testing 分支的时候,我们添加的新文件 test.txt 被移除了。切换回 master 分支的时候,它们又重新出现了。

$ git checkout master
Switched to branch 'master'


我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。

$ git checkout -b newtest
Switched to a new branch 'newtest'


如你所见,我们创建了一个分支,在该分支上移除了一些文件 test.txt,并添加了 runoob.php 文件,然后切换回我们的主分支,删除的 test.txt 文件又回来了,且新增加的 runoob.php 不存在主分支中。

使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。

删除分支

删除分支命令:

git branch -d (branchname)


git fetch用法和git pull的区别

1.相同点

先在作用上他们的功能是大致相同的,都是起到了更新代码的作用。

2.不同点

首先我们要说简单说git的运行机制。git分为本地仓库和远程仓库,我们一般情况都是写完代码,commit到本地仓库(生成本地仓的commit ID,代表当前提交代码的版本号),然后push到远程仓库(记录这个版本号),这个流程大家都熟悉。
我们本地的git文件夹里面对应也存储了git本地仓库master分支的commit ID 和 跟踪的远程分支orign/master的commit ID(可以有多个远程仓库)。那什么是跟踪的远程分支呢,打开git文件夹可以看到如下文件:

.git/refs/head/[本地分支]
.git/refs/remotes/[正在跟踪的分支]

其中head就是本地分支,remotes是跟踪的远程分支,这个类型的分支在某种类型上是十分相似的,他们都是表示提交的SHA1校验和(就是commitID)。
但是,不管他们是如何的相似,他们还是有一个重大的区别:
更改远端跟踪分支只能用git fetch,或者是git push后作为副产品(side-effect)来改变。我们无法直接对远程跟踪分支操作,我们必须先切回本地分支然后创建一个新的commit提交。
拉取不同
1、Git fetch:Git fetch会将数据拉取到本地仓库 - 它并不会自动合并或修改当前的工作。
2、git pull:git pull是从远程获取最新版本并merge到本地,会自动合并或修改当前的工作。
commitID不同

1、Git fetch:使用Git fetch更新代码,本地的库中master的commitID不变,还是等于1。
2、git pull:使用git pull更新代码,本地的库中master的commitID发生改变,变成了2。
分支(branch)的基本操作

3.git fetch用法

$ git fetch <远程主机名> //这个命令将某个远程主机的更新全部取回本地

如果只想取回特定分支的更新,可以指定分支名:

$ git fetch <远程主机名> <分支名> //注意之间有空格

最常见的命令如取回origin 主机的master 分支:

$ git fetch origin master

取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:

$ git log -p FETCH_HEAD

4.git pull 用法

前面提到,git pull 的过程可以理解为

git fetch origin master //从远程主机的master分支拉取最新内容 
git merge FETCH_HEAD    //将拉取下来的最新内容合并到当前所在的分支中

即将远程主机的某个分支的更新取回,并与本地指定的分支合并,完整格式可表示为:

$ git pull <远程主机名> <远程分支名>:<本地分支名>

如果远程分支是与当前分支合并,则冒号后面的部分可以省略:

$ git pull <远程主机名> <本地分支名>

5.拉取远程分支

git fetch  //代码拉取到本地之后
git branch //查看分支
git checkout 远程分支的分支名 

Git命令解析 - merge、rebase

merge:合并 commits

前面说到, pull 的内部操作其实是把远程仓库取到本地后(使用的是 fetch ),再用一次 merge 来把远端仓库的新 commits 合并到本地。这一节就说一下, merge 到底是什么。

含义和用法

merge 的意思是「合并」,它做的事也是合并:指定一个 commit ,把它合并到当前的 commit 来。

具体来讲, merge 做的事是: 从目标 commit 和当前 commit (即 HEAD 所指向的 commit )分叉的位置起,把目标 commit 的 路径上的所有 commit 的内容一并应用到当前 commit ,然后自动生成一个新的 commit 。

git merge 分支名

由于现在 Git 仓库处于冲突待解决的中间状态,所以如果你最终决定放弃这次 merge ,也需要 执行一次 merge --abort 来手动取消它:

git merge --abort

可交互式rebase

可交互式rebase让你在把变更提交给其他分支之前有机会对提交记录进行修改。这甚至比自动rebase操作更强大,毕竟它提供了对于分支提交历史的完全掌控力。通常来说这一操作的使用场景在于合并功能分支到main分支之前,对于功能分支杂乱的提交记录进行整理。

进行可交互式rebase操作,需要向git rebase命令传递i选项参数

git checkout 分支名
git rebase 分支名


git中tag的用法以及作用

Git 中的tag指向一次commit的id,通常用来给开发分支做一个标记,如标记一个版本号

#注解:git tag 是打标签的命令,-a 是添加标签,其后要跟新标签号,-m 及后面的字符串是对该标签的注释。
git tag -a "version" -m "标签注释"

#将本地标签提交到远程仓库 -tags可以把本地的打的标签全部提交到远程仓库
git push origin --tags

#删除标签
git tag -d version

#删除远程标签
git push origin :refs/tags/version 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值