玖叶教程网

前端编程开发入门

程序员必须掌握版本控制的工具 --- git(二)

程序员必须掌握版本控制的工具---git(二)

上面我们介绍了git本地仓库的创建和使用,下面我来看看,如何使用远程仓库, 比如使用github或者gitee来托管你的代码。

git clone 命令来copy一份完整的仓库到本地。比如我在github上发现了一个项目我现在把它clone到我本地。

$ git clone https://github.com/github/gitignore.git
Cloning into 'gitignore'...
remote: Enumerating objects: 9714, done.
remote: Total 9714 (delta 0), reused 0 (delta 0), pack-reused 9714
Receiving objects: 100% (9714/9714), 2.29 MiB | 7.90 MiB/s, done.
Resolving deltas: 100% (5283/5283), done.

现在我已经clone了一个github上的仓库,我现在可以用git remote来查看远端仓库了。如下所示:

$ git remote
origin

origin 是git给远端仓库服务器的默认名字。我们可以加上-v参数来查看远端仓库的url:

$ git remote -v
origin  https://github.com/github/gitignore.git (fetch)
origin  https://github.com/github/gitignore.git (push)

你也可以使用 git remote add <shortname> <url>命令来添加一个远端仓库。

从远端仓库获取数据可以使用git fetch 命令。这个命令会从远端仓库中拉取你本地还没有的数据。比如 你可以用 git fetch origin 拉取远端仓库的内容。

$ git fetch origin
remote: Counting objects: 1151, done.
remote: Compressing objects: 100% (1115/1115), done.
remote: Total 1151 (delta 583), reused 62 (delta 34)
Receiving objects: 100% (1151/1151), 4.31 MiB | 1.31 MiB/s, done.
Resolving deltas: 100% (583/583), done.

如果你已经设置了跟踪远程分支,那么你也可以使用git pull命令来拉取远端仓库内容。顺便说一下git fetch 和 git pull的区别,git fetch只是将代码拉下来,但是并不会合并到本地分支,而git pull会将远端代码拉下来后再做合并操作,相当于git fetch 和git merge两步操作。

我们还可以使用git remote show origin 看到更多信息。

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/github/gitignore.git
  Push  URL: https://github.com/github/gitignore.git
  HEAD branch: main
  Remote branches:
    add-metadata            tracked
    annotating-visualstudio tracked
    ghfw                    tracked
    main                    tracked
    old-ghfw                tracked
    reduce-noise            tracked
  Local branch configured for 'git pull':
    main merges with remote main
  Local ref configured for 'git push':
main pushes to main (up to date)

当你需要把你的修改推送到remote仓库时,可以使用git push命令,你需要有远端仓库的写权限才可以推送, 如下所示:

$ git push
Everything up-to-date

很多时候我们希望给我们的修改打上tag,以便于我们管理版本。我们可以使用git tag 命令,git标签有轻量级标签和带注释标签之分。

轻量标签只是某个特定提交的引用。而附注标签是存储在 Git 数据库中的一个完整对象,是可以被校验的。

如果你只是想用一个临时的标签, 或者因为某些原因不想要保存这些信息,那么也可以用轻量级标签。

如下所示,使用git tag命令创建一个轻量级标签v1.2:

$ git tag v1.2

上述命令就添加了一个tag v1.2,我们可以直接输入git tag,它会列出当前分支所有的tag。

$ git tag
v1.2

我们也可以在添加tag时,增加注释,这时我们就需要使用带注释的标签了,使用命令git tag -a 即可,如下命令:

$ git tag -a v1.3 -m "v1.3 version"

上面的命令使用-m选项指定对该标签的注释。可以使用git show命令查看当前标签信息和与之对应的提交信息。

$ git show v1.3
tag v1.3
Tagger: Coder
Date:   Mon Mar 28 13:10:31 2022 +0800

v1.3 version
commit de66be47774323a0859b1408b806b1b5ae76a970 (HEAD -> master, tag: v1.3)
Author: Coder
Date:   Mon Mar 28 13:05:57 2022 +0800
Add two new VIDs

默认情况下,git push是不会将标签信息推送到远端仓库的,如果希望将标签信息也推送到远端仓库,那么需要显示指定。可以使用命令git push origin –tags 一次推送多个标签,也可以指定标签进行推送,如下演示:

$ git push origin v1.3
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 885 bytes | 885.00 KiB/s, done.
Total 6 (delta 3), reused 0 (delta 0)
To ssh://xxx.git
 * [new tag]         v1.3 -> v1.3

我们可以看到,我们使用git push origin v1.3成功将本地仓库的修改和tag v1.3一同推送到了远端仓库。

当然也可以删除标签,使用命令git tag -d <tagname> 来删除标签,如下演示:

$ git tag -d v1.2
Deleted tag 'v1.2' (was de66be4)

可以看到我们成功将tag v1.2删除了。

你可以使用git checkout 命令跟随标签的名字来查看该标签指向的文件版本。如下演示:

$ git checkout v1.3
Note: checking out 'v1.3'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at de66be4 Add two new VIDs

但是上述命令有个副作用,就是会使你的仓库处于detached HEAD状态。这不是一个好现象,在这种状态下,如果你做了任何更改然后提交,标签不会发生任何变化,并且新的提交也将不属于任何分支。这个时候,你只能通过提交时git生成的哈希值才能访问到刚刚的提交。

下面我们继续学习如何使用git管理不同的分支。

在git中默认分支是master,master分支跟普通分支没有任何区别,只是master分支是在git init的时候自动创建的,大家默认都不去改动它而已。

在git中创建分支使用的是git branch 命令.假设当前只有master一个分支,如下图所示:


$ git branch dev

我们使用git branch dev命令后创建了一个dev分支(使用git checkout -b dev创建分支后会直接切换到dev分支),那么可以得到分支图如下:


这个时候我们看到master和dev同时指向了同一个commit对象。现在我们尝试在master分支上做两次commit,分支图就会如下图所示:


可以看到这是dev分支和master分支指向了不同的commit对象了。我们可以使用git log --oneline --decorate 命令来查看各个分支当前所指的对象。

我们可以使用git checkout命令来切换分支, 现在我们来切换到dev分支。执行命令:

$ git checkout dev

执行完该命令后,分支状态如下图:


我们看到HEAD指针指向了dev分支,说明当前我们在dev分支了。我们在dev分支上做两次commit操作,完成后,分支状态图,如下图所示:


我们看到dev分支和master分支各自拥有不同的commit对象。我们可以通过git branch来查看当前有哪些分支。

$ git branch
*dev
master

dev 分支前面有个*号表明当前处于dev分支。

我们也可以使用git branch -a 查看,加上-a参数后,不仅会列出本地分支,还会列出远端分支,如下示例:

$ git branch -a
* dev
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev
  remotes/origin/master

现在我们尝试将dev分支合并到master分支,我们首先需要使用git checkout master切换到master分支,然后使用git merge dev命令来将dev分支合并到master分支。

$ git checkout master


$ git merge dev


我们从上图可以看到dev分支被成功地合并到了master分支。如果你在合并后不再需要dev分支那么你可以使用git branch -d dev来删除dev分支,如下演示:

$ git branch -d dev


我们由上图可以看到dev分支被删除了,但是之前dev分支上的提交记录会被保留,所谓分支删除只是删除了指向提交对象的指针而已。

现在我们继续学习一下如何将本地分支推送到远程分支。

本地分支并不会自动与远程仓库同步,所以我们需要显示地将其推送到远程仓库。假设我们需要将dev分支推送到远端那么如下所示:

$ git push origin dev
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create pull request for dev:
remote:   https://xxx/pull-requests?create&sourceBranch=refs/heads/dev
remote:
To ssh://xxx.git
 * [new branch]      dev -> dev

当我们从远端仓库分支检出一个本地分支的时候就会自动创建“跟踪分支”。跟踪分支是与远程分支有直接关系的本地分支。在一个跟踪分支上使用git pull,git可以自动到被跟踪的远程分支上拉取数据,并合并到本地跟踪分支上。我们在使用git clone命令来clone远端仓库时git 会自动帮我们设置跟踪分支通常为跟踪origin/master的master分支。如果你愿意,你可以使用git checkout -b <branch> <remote>/<branch> 来创建一个本地分支并同时跟踪一个远端仓库的分支。如下演示:

$ git checkout -b localdev origin/dev
Switched to a new branch 'localdev'
Branch 'localdev' set up to track remote branch 'dev' from 'origin'.

上面的命令执行后,git就会帮我们创建一个本地的localdev分支,该分支会跟踪远端的dev分支。但是还是有一个更加快捷的操作git checkout --track origin/dev 运行该命令后,如果本地不存在dev分支,git会帮你创建dev分支,同时设置本地dev分支跟踪远程dev分支。如果我已经创建了一个本地分支,我希望它能够跟踪远端分支dev,那么可以参考下面的例子:

$ git branch -u origin/dev
Branch 'mylocal' set up to track remote branch 'dev' from 'origin'.

上面的例子中我们将本地分支mylocal设置为可远端分支dev的跟踪分支。

一旦设置后,那么你就可以使用git pull来拉取代码了。

最后我们来学习一下,如何删除一个远端分支。前面我们展示了可以使用git branch -d来删除本地分支,下面我们来看看如何删除远端分支。使用命令git push origin --delete 命令可以删除一个远端分支,在平时工作中要慎用。如下示例:

$ git push origin --delete dev
To ssh://xxx.git
 - [deleted]         dev

好了关于git的基本使用方法就介绍到这里。希望对大家有所帮助。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言