本文共 7706 字,大约阅读时间需要 25 分钟。
Git学习笔记----廖雪峰的git教程
Git的基本介绍
- Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一)
- 什么是版本控制系统? 一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
- 版本控制系统的分类?
- 本地版本控制系统
本地版本控制系统就是在一台机器上,记录版本的不同变化,保证内容不丢失,缺点是没法协同
- 集中式版本控制系統
集中式版本控制系统都有一个单一的集中管理的服务器(中央服务器),保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新,缺点是需要和依赖中央服务器,且依赖于网络环境进行连接
- 分布式版本控制系統
分布式版本控制系统的客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份,每个人的电脑上都是一个完整的版本库。
- git安装(本人使用的是windows系统) git官网上下载 ,下载后会有一个Git Bash的命令行工具,用这个工具使用git
Git的使用流程
安装完成后,还需要最后一步设置,在命令行输入:
git config --global
git config --globaluser.name
“your name”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
参数:
30aa11232b40ec38d8fa86184b3052d091deb759 (HEAD -> master) add 2 eb627817424fdc32e2b3d7e89eae0c9fa5c1cb9a add 1
$
git log --pretty=oneline
ps:其中30aa11...
是commit id
(版本号),add 2
是提交的说明(-m)
2.git log
和git 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 commit
或git add
时的状态。
用命令git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区
删除文件
在Git中,删除也是一个修改操作,其操作步骤是:
- 把文件添加(
add
),并且提交(commit
)- 如果需要需要删除文件,可以直接在文件管理器中删除,或者使用命令
rm
+文件名来删除工作区的文件(使得版本库和工作区不一致),可通过git status
查看- 进行两种选择:
- 版本库的删除:使用
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文本框在github
的Account settings
的SSH 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严格来说不是指向提交,而是指向master,master才是指向提交的,所以,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 switch
命令来切换分支: - 创建并且切换到
dev
分支git switch -c dev
- 直接切换到已有的分支:
git swtch dev
解决冲突
出现的情况:
- 当你使用
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
。 - 然后在
master
分支上面,在进行修改文件内容,使用add
命令和commit
命令进行提交- 基本原理图:
- 然后使用
git merge dev
命令进行合并。git会告诉我们无法执行“快速合并”,只能试图把各自的修改合并起来,必须手动解决冲突后再提交。可自行尝试会发生什么 - 使用
git status
告诉我们冲突的文件是什么。查看文件内容后会发现,Git用<<<<<<<,=======,>>>>>>>
标记出不同分支的内容。我们可以进行修改(选择一个分支的内容),然后使用add
和commit
进行提交- 基本原理图:
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
来查看工作现场,现在有俩种方式进行恢复:
- 使用命令
git stash apply
恢复,但是stash
内容并不删除,你需要用git stash drop
来删除,可以多次stash,恢复的时候,先用git stash list
查看,然后用命令git stash apply stash@{number}
恢复指定的stash,其中number是序列号 - 用
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>
查看标签信息。
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
从远程删除
一些之前看过的网站
- 网站
转载地址:https://blog.csdn.net/weixin_46563862/article/details/104988032 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!