Git使用
发布日期:2022-03-18 08:27:36 浏览次数:32 分类:技术文章

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

Git使用

请参考:

安装

下载

,安装。

  • which git
    获取git安装的位置。
  • git --version
    获取git的版本

配置

  • git config --global user.name "Your name" 配置用户名
  • git config --global user.email "emial@xxx.com" 配置email
  • git config --list 显示配置列表
  • git config user.name 显示配置的用户名
  • git config user.email 显示配置的email

使用

创建新仓库

创建新文件夹,打开,然后执行 :

git init

以创建新的 git 仓库。

如下的例子,在learngit文件夹下,使用git init后,文件夹下有隐藏的.git目录
.git
在其中添加一个readme.txt的文件,内容如下:

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

使用git status,显示结果如下:

git status

添加和提交

你可以提出更改(把它们添加到暂存区),使用如下命令:

git add 
git add *

这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:

git commit -m "代码提交信息"

现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

git status可以查看状态

git log可以显示提交的log

时光机穿梭

如果修改上面readme.txt文件的内容为:

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

运行git status命令

git status
readme.txt被修改了,使用git diff readme.txt可以查看具体修改的区别
git diff

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个distributed单词。

版本回退

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

git log
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
--pretty=oneline

d118b493c536f509cbb33c4ba9cd0cf8586dbfbecommit id

readme.txt回退到上一个版本,也就是add distributed的那个版本

git reset --hard HEAD^

git reset

HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^

git log再看看现在版本库的状态

git log
如果想再回到append GPL的版本该怎么?git reset --hard d118b

git reset

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL

┌────┐│HEAD│└────┘   │   └──> ○ append GPL        │        ○ add distributed        │        ○ wrote a readme file

改为指向add distributed:

┌────┐│HEAD│└────┘   │   │    ○ append GPL   │    │   └──> ○ add distributed        │        ○ wrote a readme file

Git提供了一个命令git reflog用来记录你的每一次命令:

git relog

工作区和暂存区

工作区(Working Directory)- 电脑里能看到的目录,比如learngit就是一个工作区

版本库(Repository) - 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

工作区和暂存区

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

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

管理修改

Git跟踪并管理的是修改,而非文件

如果不用git add到暂存区,那就不会加入到commit

撤销修改

1.工作区的文件修改后,此时git status效果如下:

git status
提示使用git restore <file>...来丢弃working directory中的改变(文章)(教程中提示使用git checkout -- <file>...

git restore 是git 2.23版本新增的命令,用来代替身兼数职的git checkout。功能是一样的。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

使用git restore readme.txt后,工作区的修改就回复为原来的样子了

2.工作区的文件修改后,被提交了到暂存区(使用git add readme.txt

庆幸的是,在commit之前,你发现了这个问题。用git status查看一下,修改只是添加到了暂存区,还没有提交:
,此时git status效果如下:
git status

教程中提示的是git reset HEAD <file>可以把暂存区的修改撤销掉(unstage)

使用git restore --staged readme.txt,再使用git status获取状态

git status
然后再使用步骤1中的命令,就可以将工作区恢复为原来的样子了

3.假设你不但改错了东西,还从暂存区提交到了版本库,该怎么办?

可参考版本回退

删除文件

新添加一个test.txt

test.txt
如果使用rm test.txt,删除了文件,使用git status查看状态
git status
现在就用两种情况:
1.确实要从版本库中删除该文件
那就用命令git rm删掉,并且git commit

命令git rm用于删除一个文件

xxxxxxxx learngit % git rm test.txtrm 'test.txt'xxxxxxxx learngit % git commit -m "remove test.txt"[master 2c659b0] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt

现在,文件就从版本库中被删除了。

2.另一种情况是,不想删除,删错了,可参考撤销修改章节,使用git restore test.txt

远程仓库

先看下用户主目录下有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件

没有的话,就创建SSH Key

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

然后在Github上配置SSH,创建一个repo

repo
在本地的learngit仓库下运行命令:

git remote add origin git@github.com:winfredzen/learngit.git

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

把本地库的所有内容推送到远程库上

xxxxxx learngit % git push -u origin masterThe authenticity of host 'github.com (140.82.114.4)' can't be established.RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.Are you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added 'github.com,140.82.114.4' (RSA) to the list of known hosts.Enumerating objects: 24, done.Counting objects: 100% (24/24), done.Delta compression using up to 12 threadsCompressing objects: 100% (19/19), done.Writing objects: 100% (24/24), 2.00 KiB | 1.00 MiB/s, done.Total 24 (delta 7), reused 0 (delta 0)remote: Resolving deltas: 100% (7/7), done.To github.com:winfredzen/learngit.git * [new branch]      master -> masterBranch 'master' set up to track remote branch 'master' from 'origin'.

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

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

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

$ git push origin master

git push 命用于从将本地的分支版本上传到远程并合并。

命令格式如下:
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>

删除远程库

如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>命令。使用前,建议先用git remote -v查看远程库信息:

$ git remote -vorigin	git@github.com:winfredzen/learngit.git (fetch)origin	git@github.com:winfredzen/learngit.git (push)

然后,根据名字删除,比如删除origin:

$ git remote rm origin

从远程库克隆

参考:

git clone git@github.com:michaelliao/gitskills.git

你也许还注意到,GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

执行如下命令以创建一个本地仓库的克隆版本:git clone /path/to/repository 如果是远端服务器上的仓库,你的命令会是这个样子:git clone username@host:/path/to/repository例如克隆Github上的项目:git clone https://github.com/xxxx/xxxx.git

分支管理

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

在这里插入图片描述
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:git-br-create
你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
在这里插入图片描述
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
在这里插入图片描述所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
在这里插入图片描述
创建dev分支,然后切换到dev分支:

$ git checkout -b devSwitched to a new branch 'dev'

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

$ git branch dev$ git checkout devSwitched to branch 'dev'

然后,用git branch命令查看当前分支:

git branch
git branch命令会列出所有分支,当前分支前面会标一个*

dev分支上对readme.txt作出修改后提交

$ git add readme.txt $ git commit -m "branch test"[dev b17d20e] branch test 1 file changed, 1 insertion(+)

切回到master分支上

$ git checkout masterSwitched to branch 'master'

在这里插入图片描述

dev分支的工作成果合并到master分支上

xxxxxx learngit % git merge devUpdating c059cdf..b85e904Fast-forward readme.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)

git merge命令用于合并指定分支到当前分支

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

删除分支

git branch -d dev

删除分支

switch

上面使用的是git checkout <branch>来切换分支,还可以使用switch

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

$ git switch -c dev

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

$ git switch master

解决冲突

创建一个feature1分支,同时在feature1master分支上,修改readme.txt

git merge feature1

合并时,提示用冲突,git status命令效果如下:

git status
此时readme.txt文件内容如下:
readme.txt
合并冲突后,再提交:

xxxxxx learngit % git add readme.txt xxxxxx learngit % git commit -m "conflict fixed"[master a09db92] conflict fixed

现在,master分支和feature1分支变成了下图所示:

在这里插入图片描述
git log --graph命令可以看到分支合并图
git log

分支策略

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

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

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

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

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

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

在这里插入图片描述

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

上一篇:iOS第三方
下一篇:UIWebView

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年03月23日 06时36分32秒

关于作者

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

推荐文章

视频提取音频php,如何提取视频中的音频,从视频文件中提取出音频输出成MP3格式... 2019-04-21
diy.php添加验证码,织梦dedecms自定义表单中加入验证码 2019-04-21
在php脚本中 通过可以获取,在PHP中,可以使用Unix时间戳获取精确的脚本执行时间。... 2019-04-21
s2-045 php exp,S2-045-EXP.py --Struts2任意代码执行漏洞 (S2-045,CVE-2017-5638) 2019-04-21
linux sdk 窗口句柄,Venus: 针对Linux平台上,对常用的系统API进行面向对象的封装SDK。... 2019-04-21
c语言程序设计 科学出版社习题答案,C语言程序设计(科学出版社)第4章 课后习题参考答案.doc... 2019-04-21
c语言 无错 但只运行一半,求哈夫曼编码时程序运行到一半就终止了,编译无错... 2019-04-21
deepin linux 2014安装,2014.2版本的Deepin虚拟机安装浅谈(就是深度Linux) 2019-04-21
android 限速工具,Android下载器之限速篇 2019-04-21
html刷新ajax实现原理,AJAX的原理—如何做到异步和局部刷新 2019-04-21
html中列表菜单加文字请选择,html中下拉菜单 2019-04-21
读书郎平板中android,读书郎学生平板电脑怎么用 使用方法详解【图文】 2019-04-21
html5 调用摄像头 支持IE,JS调用本地摄像头拍照(兼容各大浏览器及IE8+) 2019-04-21
rust和gta5哪个吃配置_盘点4款Steam“自由度”很高的游戏,GTA5众所周知,目前最热门... 2019-04-21
es审计日志_elasticsearch 事务日志translog 2019-04-21
dw1510_超低温种子储存柜 2019-04-21
文件未找到mathpage.wll_解决MathPage.wll文件找不到的问题(找了好久的良心之作)... 2019-04-21
广州刷脸支付骗局_刷脸支付是骗局?那可能你还不了解刷脸支付 2019-04-21
java 远程调试 端口_JAVA远程调试 2019-04-21
java 使用或覆盖了已过时的api_JAVA使用或覆盖了已过时的 API 2019-04-21