Git学习笔记

Git学习笔记

一、安装

  • 地址:https://git-scm.com/downloads

  • 步骤:默认安装

  • 检验:可以在开始菜单找到Git Bash就表示按装成功啦

  • 初始化:安装完成后还要进行初始化Git,此过程只需要执行一次就可以啦

    $ git config --global user.name "用户名"
    $ git config --global user.email "Git注册邮箱"
    

    注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

二、基本操作

仓库(repository)可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

1.创建仓库

$ mkdir learngit
$ cd learngit
$ git init

在这里插入图片描述

瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),并且当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了

2.文件添加

千万不要使用Windows自带的记事本编辑任何文本文件

(1)使用git add命令,将文件添加到仓库

$ git add readme.md

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gb3l47kx-1675763030976)(E:\LearnGit\static\image-20230201115231558.png)]

(2)使用git commit命令,将文件提交到仓库

$ git commit -m "wrote a readme file"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cx6N8RnC-1675763030976)(E:\LearnGit\static\image-20230201115324287.png)]

git commit命令,-m后面输入的是本次提交的说明,这样你就能从历史记录里方便地找到改动记录。

为什么Git添加文件需要addcommit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,例如

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files"

3.文件修改

readme.md文件进行修改,修改为:

Git is a distributed version control system.
Git is free software.

使用git status进行查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cXYtHGNs-1675763030976)(E:\LearnGit\static\image-20230201120148031.png)]

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。但是只能告知哪个文件的状态变化,但不会告知变化的内容

使用git diff可以查看文件具体修改了哪里

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cOF0dSlj-1675763030977)(E:\LearnGit\static\image-20230201121255696.png)]

4.文件删除

使用 git rm命令删除文件,然后再重现添加到版本库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TeeOHyzJ-1675763030977)(E:\LearnGit\static\image-20230201151006062.png)]

删除错误,版本库中还有,使用git checkout -- license.md来还原工作区

三、时光穿梭

再次修改readme.md文件:

Git is a distributed version control system.
Git is free software distributed under the GPL.

提交

$ git add readme.md
$ git commit -m "append GPL"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jwif4HmS-1675763030977)(E:\LearnGit\static\image-20230201125422864.png)]

回顾两次修改:

版本1:wrote a readme file

Git is a version control system.
Git is free software.

版本2:append GPL

Git is a distributed version control system.
Git is free software distributed under the GPL.

使用git log命令可以查看历史记录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W2PYHLEi-1675763030978)(E:\LearnGit\static\image-20230201125711194.png)]

使用git log命令时可以加上--pretty=oneline使得信息排列更加清晰

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FkyXjseY-1675763030978)(E:\LearnGit\static\image-20230201130529836.png)]

1.版本回退

使用版本回退之前,Git必须知道当前版本是哪个版本,在Git中使用HEAD来表示当前版本。HEAD^表示前一个版本,HEAD^^表示前前一个版本……

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UviarWuz-1675763030979)(E:\LearnGit\static\image-20230201131607896.png)]

使用git reset命令可以进行版本的回退,使得HEAD指向回退后的版本

返回到前一个版本:

$ git reset --hard HEAD^

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xRGgkgq1-1675763030979)(E:\LearnGit\static\image-20230201131947490.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wvm8uUQM-1675763030979)(E:\LearnGit\static\image-20230201132138695.png)]

回退完成后,最新的那个版本append GPL已经看不到了!只要上面的命令行窗口还没有被关掉,你就可以顺着往上找,找到那个append GPLcommit id1cf2b6f8260745a89a62b211ec10eaaaab466b3c4,于是就可以指定回到未来的某个版本:

$ git reset --hard cf2b6f8260745a89a62b211ec10eaaaab466b3c4

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z4hnPGuJ-1675763030979)(E:\LearnGit\static\image-20230201132531841.png)]

Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL

┌────┐
│HEAD│
└────┘
   │
   └──▶ ○ append GPL
              │
              ○ wrote a readme file

改为指向add distributed

┌────┐
│HEAD│
└────┘
   │
   │         ○ append GPL
   │         │
   └──▶ ○ wrote a readme file

你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?Git提供了一个命令git reflog用来记录你的每一次命令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekVu4G6T-1675763030979)(E:\LearnGit\static\image-20230201132952730.png)]

2.工作区和暂存区

工作区:电脑上的文件夹,例如:learngit文件夹就是一个工作区

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

暂存区:Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

我们把文件往Git版本库里添加的时候,是分两步执行的:

  • 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

  • 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

修改readme.md文件,修改为:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.

在工作区新增一个license.md的文件

$ touch license.md

使用git status查看状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ArQwBB6y-1675763030980)(E:\LearnGit\static\image-20230201141208933.png)]

Git非常清楚地告诉我们,readme.md被修改了,而license.md还从来没有被添加过,所以它的状态是Untracked

使用两次的git add将两个文件都添加到暂存区,再次查看状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARtuiw6S-1675763030980)(E:\LearnGit\static\image-20230201141419973.png)]

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h5tLS4iM-1675763030980)(E:\LearnGit\static\image-20230201141634860.png)]

此时,暂存区清空

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lAr3Gx2l-1675763030980)(E:\LearnGit\static\image-20230201141703344.png)]

3.管理修改

Git跟踪并管理的是修改,而非文件,这就是Git比其他控制系统设计更加优秀的原因。

修改readme.md文件

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.

readme.md文件放到暂存区,并且查看状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JpSTEyHR-1675763030980)(E:\LearnGit\static\image-20230201142327036.png)]

再次修改readme.md文件

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.

提交暂存区中的readme.md的文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uYxf6fZv-1675763030980)(E:\LearnGit\static\image-20230201142606420.png)]

提交后再查看状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3eRZSnsY-1675763030981)(E:\LearnGit\static\image-20230201142641132.png)]

此时,第一次的修改被提交了,第二次的修改不会被提交。。因为,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了。

使用git diff HEAD -- readme.md命令,可以对比版本库和工作区中的readme.md文件的区别。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rvTd0L6e-1675763030981)(E:\LearnGit\static\image-20230201143015921.png)]

如果想要提交第二次修改,那就继续git add将第二次的文件添加到暂存区,然后git commit -m "xxx"进行提交。

4.撤销修改

修改文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HKqkDot9-1675763030981)(E:\LearnGit\static\image-20230201144710768.png)]

查看状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPVuvi8r-1675763030981)(E:\LearnGit\static\image-20230201144744112.png)]

(1)手动修改再添加到暂存区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cfvpnhE4-1675763030981)(E:\LearnGit\static\image-20230201144152696.png)]

(2)丢弃工作区

使用git checkout -- readme.mdgit checkout -- readme.txt意思就是,把readme.md文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.md自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePvUznMs-1675763030981)(E:\LearnGit\static\image-20230201144835961.png)]

一种是readme.md已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SlXGYSaG-1675763030982)(E:\LearnGit\static\image-20230201145037818.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJVJVc1m-1675763030982)(E:\LearnGit\static\image-20230201145325443.png)]

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令

(3)销毁暂存区

使用git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区。git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RpwwUUJF-1675763030982)(E:\LearnGit\static\image-20230201150113619.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z2mHNjAo-1675763030982)(E:\LearnGit\static\image-20230201150407003.png)]

四、远程仓库

1.创建远程仓库

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPLem3xh-1675763030982)(E:\LearnGit\static\image-20230201155849858.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pbPj7Kob-1675763030982)(E:\LearnGit\static\image-20230201155926498.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D889lgQJ-1675763030982)(E:\LearnGit\static\image-20230201160039053.png)]

生成SSH后,新建仓库即可

2.关联仓库

  • 方法一:

将添加远程仓库,并起一个别名

$ git remote add origin git@github.com:KongQingzhi/learngit.git

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E2vukBxP-1675763030983)(E:\LearnGit\static\image-20230201155546190.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wF3qjRrX-1675763030983)(E:\LearnGit\static\image-20230201155620749.png)]

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以是其他的

使用git push -u origin master把本地库的所有内容推送到远程库上:

  • 方法二:

将添加远程仓库,并起一个别名

$ git remote add origin https://github.com/KongQingzhi/learngit.git

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7WL0l6C-1675763030983)(E:\LearnGit\static\image-20230201163153180.png)]

git push命令,把本地库的内容推送到远程,由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

从现在起,只要本地作了提交,就可以通过命令

$ git push origin master

把本地master分支的最新修改推送至GitHub

3.删除远程仓库

使用git remote rm 命令就可以删除远程仓库啦

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4M7I9Qit-1675763030983)(E:\LearnGit\static\image-20230201164316531.png)]

4.从远程仓库克隆

  • 方法一:
$ git clone git@github.com:KongQingzhi/learngit.git
  • 方法二:
$ git clone https://github.com/michaelliao/gitskills.git

五、分支管理

1.分支的操作

  • 创建dev分支
$ git branch dev
  • 切换分支
$ git checkout dev

也可以简写

$ git checkout -b dev

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vuydmhGc-1675763030983)(E:\LearnGit\static\image-20230201170956837.png)]

  • 查看分支

使用git branch可以查看分支,当前分支会进行标星*

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yEDaaDmE-1675763030983)(E:\LearnGit\static\image-20230201171133450.png)]

  • 修改分支内容

比如对readme.txt做个修改,加上一行:

Creating a new branch is quick.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M40kRkzz-1675763030983)(E:\LearnGit\static\image-20230201171344104.png)]

提交

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udxgj7SE-1675763030984)(E:\LearnGit\static\image-20230201171513439.png)]

切换回master分支

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lGW5doO9-1675763030984)(E:\LearnGit\static\image-20230201171602063.png)]

查看readme.md文件,还是原来的样子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ThGgMod5-1675763030984)(E:\LearnGit\static\image-20230201171652719.png)]

因为那个提交是在dev分支上,而master分支此刻的提交点并没有变

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uXaXbYj0-1675763030984)(E:\LearnGit\static\0)]

  • 合并分支

git merge命令用于合并指定分支到当前分支,合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

$ git merge dev

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-snnB3jc1-1675763030984)(E:\LearnGit\static\image-20230201172112997.png)]

  • 删除分支

使用git branch -d对分支进行删除

$ git branch -d dev

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ytnjEPYl-1675763030984)(E:\LearnGit\static\image-20230201172346951.png)]

  • switch

我们注意到切换分支使用git checkout <branch>,而前面讲过的撤销修改则是git checkout -- <file>,同一个命令,有两种作用,确实有点令人迷惑。

实际上,切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的git switch命令来切换分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfq6s7tc-1675763030984)(E:\LearnGit\static\image-20230201172524704.png)]

创建并切换到新的dev分支,可以使用:

$ git switch -c dev

直接切换到已有的master分支,可以使用:

$ git switch master

2.分支冲突

创建一个新的分支feature,并切换到新的分支,对readme.md进行修改,并且提交

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJl4B6PZ-1675763030984)(E:\LearnGit\static\image-20230201173214877.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYt7xKyH-1675763030985)(E:\LearnGit\static\image-20230201173954368.png)]

对master分支的readme.md进行修改,并且提交

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rAkhvpYz-1675763030985)(E:\LearnGit\static\image-20230201173528974.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QbbCnIgO-1675763030985)(E:\LearnGit\static\image-20230201174333102.png)]

使用git merge合并两个分支,存在冲突,无法合并

$ git merge feature

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8FWHWIAo-1675763030985)(E:\LearnGit\static\image-20230201174501896.png)]

!Git告诉我们,readme.md文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Y7Mnazj-1675763030985)(E:\LearnGit\static\image-20230201174607072.png)]

打开readme.md文件,进行手动合并

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-atiy5sEQ-1675763030985)(E:\LearnGit\static\image-20230201174733669.png)]

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后保存:

image-20230201175020163

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMwljg9E-1675763030985)(E:\LearnGit\static\image-20230201174922977.png)]

用带参数的git log也可以看到分支的合并情况:

git log --graph命令可以看到分支合并图。

$ git log --graph --pretty=oneline --abbrev-commit

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pUO1tJ01-1675763030986)(E:\LearnGit\static\image-20230201175132879.png)]

最后删除feature分支

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MNNABiLg-1675763030986)(E:\LearnGit\static\image-20230201175256327.png)]

3.分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

实战一下--no-ff方式的git merge

创建dev分支并切换到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MQQaj8jl-1675763030986)(E:\LearnGit\static\image-20230202091102481.png)]

修改readme.md文件,并提交一个新的commit:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t1n6YTml-1675763030986)(E:\LearnGit\static\image-20230202091351627.png)]

现在,我们切换回master,准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sgbj1lKd-1675763030986)(E:\LearnGit\static\image-20230202091627907.png)]

查看历史记录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-csIHXUjK-1675763030986)(E:\LearnGit\static\image-20230202091822952.png)]

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uqwLm0Ai-1675763030987)(E:\LearnGit\static\1)]

4.Bug分支*

产生Bug后不想提交项目,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

$ git stash

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sEdEVRRM-1675763030987)(E:\LearnGit\static\image-20230202094043017.png)]

现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qe7rv0MT-1675763030987)(E:\LearnGit\static\image-20230202094109057.png)]

5.feature分支

添加新功能时最好要新建一个feature分支进行添加新的功能,新功能添加完成后,再删除该分支

新建feature分支,并添加新的文件/功能

$ git switch -c feature-1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-65UR347G-1675763030987)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230202100337385.png)]

切回master,准备合并:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qoHhXCoT-1675763030987)(E:\LearnGit\static\image-20230202100621138.png)]

就在此时,接到上级命令,因经费不足,新功能必须取消!

虽然白干了,但是这个包含机密资料的分支还是必须就地销毁:

$ git branch -d feature-1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LbvG0YOz-1675763030988)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230202100729892.png)]

销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。。

$ git branch -D feature-1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t1kFyQfq-1675763030988)(E:\LearnGit\static\image-20230202100802173.png)]

6.多人协作

当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin

要查看远程库的信息,用git remote

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQpoHrW3-1675763030988)(E:\LearnGit\static\image-20230202100915079.png)]

git remote -v显示更详细的信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpeJ2ksS-1675763030988)(E:\LearnGit\static\image-20230202100939470.png)]

上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

7.推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:

$ git push origin master

如果要推送其他分支,比如dev,就改成:

$ git push origin dev

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sQ7LN7iy-1675763030989)(E:\LearnGit\static\image-20230202101129477.png)]

  • master分支是主分支,因此要时刻与远程同步;
  • dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
  • bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
  • feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

8.抓取分支

你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送:推送失败。因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GXDrcOuw-1675763030989)(E:\LearnGit\static\image-20230202101526542.png)]

git pull也失败了,原因是没有指定本地分支与远程origin/xxx分支的链接,根据提示,设置链接:

使用git fetch更新查看远程仓库的分支信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2U07z6yn-1675763030989)(E:\LearnGit\static\image-20230202102641246.png)]

然后链接分支

$ git branch --set-upstream-to=origin/dev dev

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXl25grh-1675763030989)(E:\LearnGit\static\image-20230202102905604.png)]

然后进行git pull,当前分支与远程分支不对应时也会失败

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YFniYPcd-1675763030990)(E:\LearnGit\static\image-20230202103249168.png)]

切换分支,并重新git pull

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OteIPPCQ-1675763030990)(E:\LearnGit\static\image-20230202103334030.png)]

因此,多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

9.Rebase

多人在同一个分支上协作时,很容易出现冲突。即使没有冲突,后push的童鞋不得不先pull,在本地合并,然后才能push成功。

每次合并再push后,分支变成了这样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDAD1CXa-1675763030990)(E:\LearnGit\static\image-20230202103655167.png)]

看上去很乱,Git有一种称为rebase的操作,有人把它翻译成“变基”,可以将提交历史变成一条干净的直线。

rebase操作可以把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。

六、标签管理

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

1.创建标签

在Git中打标签非常简单,首先,切换到需要打标签的分支上:

然后,敲命令git tag <name>就可以打一个新标签:

$ git tag v1.0

可以用命令git tag查看所有标签:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SJiJmQiP-1675763030990)(E:\LearnGit\static\image-20230202104635378.png)]

默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?

方法是找到历史提交的commit id,然后打上就可以了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0TCdlmq-1675763030991)(E:\LearnGit\static\image-20230202104802765.png)]

比方说要对add merge这次提交打标签,它对应的commit id是1aa66a7,敲入命令:

$ git tag v0.9 1aa66a7

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPHyiZF3-1675763030991)(E:\LearnGit\static\image-20230202104919885.png)]

注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0zCNzJOf-1675763030991)(E:\LearnGit\static\image-20230202105046488.png)]

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

$ git tag -a v0.1 -m "version 0.1 released" 1094adb

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UaEP0X1O-1675763030991)(E:\LearnGit\static\image-20230202105303194.png)]

2.操作标签

如果标签打错了,也可以删除:

$ git tag -d v0.1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HW9mkKje-1675763030991)(E:\LearnGit\static\image-20230202105438469.png)]

如果要推送某个标签到远程,使用命令git push origin <tagname>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yH7t1mNN-1675763030992)(E:\LearnGit\static\image-20230202105532643.png)]

一次性推送全部尚未推送到远程的本地标签:

$ git push origin --tags

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3tP924p1-1675763030992)(E:\LearnGit\static\image-20230202105635827.png)]

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

$ git tag -d v0.9

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TINWSjnd-1675763030992)(E:\LearnGit\static\image-20230202105731262.png)]

然后,从远程删除。删除命令也是push,但是格式如下:

$ git push origin :refs/tags/v0.9

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBzVw9Fa-1675763030992)(E:\LearnGit\static\image-20230202105823751.png)]

要看看是否真的从远程库删除了标签,可以登陆GitHub查看。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJrLKWH1-1675763030993)(E:\LearnGit\static\image-20230202110034278.png)]

七、git常用命令表

命令描述
git config --global user.name “用户名”配置用户名
git config --global user.email “git注册邮箱”配置邮箱
git init初始化仓库
git add 文件名将文件添加到暂存区
git commit -m “描述”提交暂存区的文件到仓库
git status查看状态
git diff查看修改
git rm 文件名移除文件
git log查看历史记录
git reflog查看历史版本记录
git log --pretty=oneline一行显示历史记录
git reset --hard HEAD^返回上一个版本
git reset --hard HEAD^^返回上上一个版本
git reset --hard 提交id返回指定提交id的版本
git diff HEAD – 文件名对比仓库和版本区的某个文件的区别
git checkout – 文件名把文件在工作区的修改全部撤销
git reset HEAD 文件名销毁暂存区
ssh-keygen -t rsa -C “邮箱”创建SSH Key
git remote add origin SSH地址关联仓库
git remote add origin 仓库地址关联仓库
git remote查看远程仓库信息
git remote -v查看远程仓库的详细信息
git remote rm 仓库名删除远程仓库
git clone SSH地址克隆仓库
git clone 仓库地址仓库地址
git branch查看分支
git branch 分支名创建分支
git checkout 分支名切换分支
git switch 分支名切换分支
git checkout -b 分支名创建并切换到分支
git switch -c 分支名创建并切换到分支
git merge 分支名将分支与当前分支合并
git branch -d 分支名删除分支
git log --graph查看分支合并图
git log --graph --pretty=oneline --abbrev-commit查看单行分支合并图
git merge --no-ff -m “描述” 分支名禁用Fast Forward模式进行合并分支
git stash储藏工作区
git push origin master推送分支(将master推送到origin)
git pull抓取分支
git branch --set-upstream-to=origin/远程分支 本地分支本地仓库分支链接远程仓库分支
git fetch更新远程仓库的信息
git rebase提交历史变成一条干净的直线
git tag查看所有标签
git tag 标签名新建标签
git tag 标签名 提交id为指定的提交创建标签
git show 标签名查看指定标签名的信息
git tag -a 标签名 -m “描述信息” 提交id为指定的提交创建带有说明的标签
git push origin 标签名推送标签到远程
git push origin --tags一次性推送全部标签到远程
git tag -d 标签名删除本地标签
git push origin :refs/tags/标签名删除远程标签
  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值