Git学习笔记----廖雪峰的git教程
发布日期:2022-02-12 16:06:53 浏览次数:8 分类:技术文章

本文共 7706 字,大约阅读时间需要 25 分钟。

Git学习笔记----廖雪峰的git教程

Git的基本介绍

  1. Git是什么?
      Git是目前世界上最先进的分布式版本控制系统(没有之一)
  2. 什么是版本控制系统
      一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
  3. 版本控制系统的分类?
    • 本地版本控制系统

      本地版本控制系统就是在一台机器上,记录版本的不同变化,保证内容不丢失,缺点是没法协同

    • 集中式版本控制系統

      集中式版本控制系统都有一个单一的集中管理的服务器(中央服务器),保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新,缺点是需要和依赖中央服务器,且依赖于网络环境进行连接

    • 分布式版本控制系統

      分布式版本控制系统的客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份,每个人的电脑上都是一个完整的版本库。

  4. git安装(本人使用的是windows系统)
      git官网上下载 ,下载后会有一个Git Bash的命令行工具,用这个工具使用git

Git的使用流程

安装完成后,还需要最后一步设置,在命令行输入:

git config --global user.name “your name”

git config --global user.email “your email”

ps:每个机器都必须自报家门:你的名字和Email地址

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


创建版本库

1.什么是版本库–reppsitory

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

2.如何创建?

第一步:选择一个合适的地方,创建一个空目录,打开git bash 输入:

mkdir learngit

cd learngit
pwm

pwd命令用于显示当前目录。如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文

第二步:通过git init命令把这个目录变成Git可以管理的仓库.

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

若没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见

3.添加文件进入版本库–文件必须保存在leangit目录(子目录)

   所有的版本控制系统,都只能追踪文本文件的改动,比如TXT文件,网页,程序代码等等。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道。

推荐的编辑器:

Visual Studio Code : https://code.visualstudio.com/

Notepad(默认编码:UTF-8 without BOM) : https://notepad-plus-plus.org/

ps: 为什么不使用自带的记事本呢,因为Microsoft开发记事本的团队在每个文件(UTF-8编码的文件)开头添加了0xefbbbf的字符,所以会发生一些’有趣’的问题。

文件放到Git仓库

1.使用编辑器保存一个txt文件放入目录下(内容自己填写)
2.用命令git add告诉Git,把文件添加到仓库:

git add read.txt

3.用命令git commit告诉Git,把文件提交到仓库:

git commit -m ‘add read.txt’

ps:-m后面输入的是本次提交的说明,可以输入任意内容,这样你就能从历史记录里方便地找到改动记录,执行git commit是 可以一次性把暂存区的所有修改提交到分支


进行文件处理

1.使用git status命令掌握仓库的当前状态–包括未暂存,未提交的文件等信息

git status

2.使用git diff命令加文件名,可以查看具体修改了什么内容。

git diff —是工作区(work dict)和暂存区(stage)的比较

git diff --cached —是暂存区(stage)和分支(master)的比较
git diff HEAD —查看工作区和版本库里面最新版本的区别


版本查看

1.使用git log命令显示从最近到最远的提交日志

git log

如果嫌输出信息太多,可以加上--pretty=oneline参数:

$ git log --pretty=oneline

30aa11232b40ec38d8fa86184b3052d091deb759 (HEAD -> master) add 2
eb627817424fdc32e2b3d7e89eae0c9fa5c1cb9a add 1

ps:其中30aa11...commit id(版本号),add 2是提交的说明(-m)

2.git loggit reflog命令的区别

git log可以显示从最近到最远的提交日志,但是不包括已经被删除的 commit 记录和 reset 的操作

git reflog是显示所有的操作记录,包括提交,回退的操作。一般用来找出操作记录中的版本号,进行回退。git reflog常用于恢复本地的错误操作。


版本回退

1.使用git reset命令:

  • git reset --hard 版本号

    删除末次提交,并清空所有基与版本号这次commit的修改.可能会造成数据丢失.

  • git reset --mixed 版本号-(git reset 的默认设定)

    删除某次提交,回到add之前的状态,再次提交先add 在commit

  • git reset --soft 版本号

    只是删除某次提交,再次提交直接commit就可以了

ps:可使用git reset --hard HEAD^返回上一个版本


工作区和版本库

工作区

它就是你在电脑目录上看到的目录,比如之前创建的文件夹就是工作区。

版本库

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

版本库上面有**暂存区(stage)**和分支(自动创建的第一个分支master)以及指向master的一个指针叫HEAD


管理和撤销修改

1.管理和追踪修改

每次修改,如果不用git add到暂存区,那就不会加入到commit中,你可以尝试在git add后再修改工作区文件,再git commit比较差别

2.撤销修改

使用git checkout --file可以丢弃工作区的修改:–最新版本使用git restore

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

2)一种是文件已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态。
ps:就是让这个文件回到最近一次git commitgit add时的状态。

用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区


删除文件

在Git中,删除也是一个修改操作,其操作步骤是:

  1. 把文件添加(add),并且提交(commit)
  2. 如果需要需要删除文件,可以直接在文件管理器中删除,或者使用命令rm+文件名来删除工作区的文件(使得版本库和工作区不一致),可通过git status查看
  3. 进行两种选择:
    • 版本库的删除:使用git rm 文件名命令后,进行提交
    • 使用版本库恢复工作区文件: 使用git checkout --文件

远程仓库

前面的学完后可以说再也不用担心文件备份或者丢失的问题了,下面我们就来进行学习使用Github进行Git仓库的托管和创建自己的Git远程仓库

Github : https://github.com/

实现安全传输

注册完后,使用ssh加密,来实现本地git仓库和github仓库之间的安全传输,步骤如下:

使用命令: ssh-keygen -t rsa -C “youremail” 一路回车

在用户主目录.ssh目录找到id_rsa(私钥)和id_rsa.pub(公钥)俩个文件
id_rsa.pub的内容复制到ssh_key文本框上(名字随意)—ssh_key文本框在githubAccount settingsSSH Keys页面添加进去

ps:github可以添加多个key,从而实现多个电脑向自己的github发推送

添加远程库

1.在github创建git的仓库(repository)–github有新手的教程有说

2.本地仓库关联远程仓库

git remote add origin git@github.com:zhengchaoxuan/one.git

其中zhengchaoxuan换成你的用户名,one缓存你写的项目名字,因为使用了ssh,使用只有必须保证ssh公钥在自己的账户才能连接,origin是远程仓库的名字

3.关联完后,可以使用git push命令进行把本地分支推送给远程

git push -u origin master

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

使用git clone 命令克隆一个本地库

git clone git@github.com:zhengchaoxuan/one.git

然后可以进入文件管理器进行查看克隆的文件

ssh警告

当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告.这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了(可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致)

分支管理

基本思路

在版本回退里,每次提交,Git都把它们串成一条时间线.这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

一开始,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

Git创建一个分支除了增加一个dev指针,改HEAD的指向,工作区的文件都没有任何变化!从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

假如在dev上的工作完成了,就可以把dev合并到master上。最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

命令实现

1.创建dev分支,切换到dev分支:

git checkout -b dev

其表示两条命令:git branch dev创建dev分支,git checkout dev切换到dev分支
使用git branch查看当前分支

可切换到dev分支修改文件,在切换会master分支进行查看,会发现修改的文件内容没变,这就是因为master分支的提交点没有改变.

2.合并某分支到当前分支

git merge dev命令合并到master分支上面(默认使用fast-forward模式–直接把master指向dev的当前提交)

3.删除branch分支

git brancn -d dev

dev分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令git branch -D dev

删除后可以使用git branch命令进行查看分支信息

4.附加switch命令

最新版本的Git提供了新的git switch命令来切换分支:

  • 创建并且切换到dev分支

    git switch -c dev

  • 直接切换到已有的分支:

    git swtch dev


解决冲突

出现的情况:

  1. 当你使用git checkout -b dev 创建并且切换到dev分支上面后,进行修改文件内容,并且,进行add(添加)和commit(提交)后。使用git checkout master返回到master分支后,Git还会自动提示我们当前master分支比远程的master分支要超前1个提交-Your branch is ahead of 'origin/master' by 1 commit
  2. 然后在master分支上面,在进行修改文件内容,使用add命令和commit命令进行提交
    • 基本原理图:
  3. 然后使用git merge dev命令进行合并。git会告诉我们无法执行“快速合并”,只能试图把各自的修改合并起来,必须手动解决冲突后再提交。可自行尝试会发生什么
  4. 使用git status告诉我们冲突的文件是什么。查看文件内容后会发现,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。我们可以进行修改(选择一个分支的内容),然后使用addcommit进行提交
    • 基本原理图:

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

git log --gragh --pretty=oneline --abbrev-commit

6.最后删除分支

git brancn -d dev


合并模式

1.合并分支默认使用--ff模式(faster forward),其实git merge命令有三种模式,其效果简述如下:

git merge dev :如果删除分支,则会丢失merge分支信息

git merge --squash dev :不提交、不移动HEA.需要一条额外的commit命令。其效果相当于将another分支上的多个commit合并成一个,放在当前分支上,原来的commit历史则没有拿过来。
git merge --no-ff dev :表示禁用–ff模式,会创建一个merge的commit信息,然后合并的和master分支

ps:附带我之前看到简单文章 :


隐藏’工作现场’

当你在进行一个分支处理时,你突然收到一个任务要创建另外一个分支进行处理。但是你在当前dev分支进行的工作还没完成,你使用git status会提示你需要进行提交,但是不想提交,这个时候就需要进行把当前的"工作现场"进行隐藏,等以后恢复现场在继续现在的工作

git stash

使用后你可以通过git status命令进行查看,发现工作区非常的干净(除非有没有被git管理的文件),你就可以安心去别的分支进行别的处理了


恢复’工作现处’

当工作完成后,切换回之前隐藏工作现场的dev分支,然后使用命令git stash list来查看工作现场,现在有俩种方式进行恢复:

  1. 使用命令git stash apply恢复,但是stash内容并不删除,你需要用git stash drop来删除,可以多次stash,恢复的时候,先用git stash list查看,然后用命令git stash apply stash@{number}恢复指定的stash,其中number是序列号
  2. git stash pop,恢复的同时把stash内容也删了

多人协同

1.本地库和远程库关联后,查看远程库信息:

git remote :简单信息

git remote -v :更具体一点的信息

2.抓取分支

多人协作时,大家都会往master和dev分支上推送各自的修改。当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支(默认分支)。要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:

git checkout -b dev origin/dev

这样就可以使用git push发推送到远程了。

3.如果你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送,就会出现推送失败的情况(你的小伙伴的最新提交和你试图推送的提交有冲突)。这时你就可以先git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送,不过要进行指定连接命令git branch --set-upstream dev origin/dev,这样在pull在本地手动解决冲突,在git push上去就好了


添加标签(更好的管理文件)

1.因为commit id有点长,添加标签更好的管理文件,使用方式:

git tag v0.1 :这样就给当前分支打上标签

2.使用git tag查看所有标签,也可以使用git show <tagname>查看标签信息。

3.如果想要给之前的commit打上标签,可以使用查看commit id,然后使用:

git tag v0.2 commitID

4.删除标签

git tag -d <tagname>

5.推送一个本地标签

git push origin <tagname>

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

git push origin --tags

7.删除远程标签

git tag -d <tagname> 先删除本地标签

git push origin :refs/tags/v0.1 从远程删除


一些之前看过的网站

  1. 网站

转载地址:https://blog.csdn.net/weixin_46563862/article/details/104988032 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:高阶组件的定义与示例--HOC
下一篇:Markdomn语法基础

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月15日 09时18分06秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章