git实战教程2-基本用法(上)

Git 基本用法 基本用法 目录基本用法Git的三种主要状态Git项目的三个主要部分Git的基本工作流程Git 设置Git文件的生命周期暂存区的内容查看文件状态忽略文件详细查看staged及unstaged的改变提交跳过Staging area移除文件移动文件浏览提交历史过滤日志输出撤销操作HEAD detached(分离的HEAD)远程工作标签checkout 发生了什么分支与合并远程分支版本选择 Git的三种主要状态 modified 文件被修改,但还未被提交。 staged 标记了一个已修改的文件,可以进入到 阅读详情

一、实验说明

本节实验为 Git 入门第一个实验,可以帮助大家熟悉如何创建和使用 git 仓库。

二、git的初始化

在使用git进行代码管理之前,我们首先要对git进行初始化。

1.Git 配置

使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名,每次提交记录里都会包含这些信息。使用git config命令进行配置:

$ git config --global user.name "Scott Chacon"
$ git config --global user.email "schacon@gmail.com"

执行了上面的命令后,会在家目录(/home/shiyanlou)下建立一个叫.gitconfig 的文件(该文件为隐藏文件,需要使用ls -al查看到). 内容一般像下面这样,可以使用vim或cat查看文件内容:

$ cat ~/.gitconfig
[user]
        email = schacon@gmail.com
        name = Scott Chacon

上面的配置文件就是Git全局配置的文件,一般配置方法是git config --global <配置名称> <配置的值>。

如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config 命令不带 --global 选项来设置. 这会在你当前的项目目录下创建 .git/config,从而使用针对当前项目的配置。

三、获得一个Git仓库

既然我们现在把一切都设置好了,那么我们需要一个Git仓库。有两种方法可以得到它:一种是从已有的Git仓库中clone (克隆,复制);还有一种是新建一个仓库,把未进行版本控制的文件进行版本控制。

1.Clone一个仓库

为了得到一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL). Git能在许多协议下使用,所以Git URL可能以ssh://, http(s)://, git://. 有些仓库可以通过不只一种协议来访问。

我们在git.shiyanlou.com上提供了一个名字为gitproject的供大家测试的公有仓库,这个仓库可以使用下面方式进行clone:

$ git clone http://git.shiyanlou.com/shiyanlou/gitproject

clone操作完成后,会发现当前目录下多了一个gitproject文件夹,这个文件夹里的内容就是我们刚刚clone下来的代码。由于当前`gitproject仅是测试项目,里面仅有一个README.md文件。

$ cd gitproject/
(master)$ ls 
README.md

细心的同学可以发现在命令提示符$前面多了个(master)。这是由于实验楼的Linux使用的是zsh Shell,zsh会判断当前的目录是否有Git仓库,如果是的话则自动把目前所在的git分支显示在提示符中。Git 分支的概念我们会在稍后介绍。

2.初始化一个新的仓库

可以对一个已存在的文件夹用下面的命令让它置于Git的版本控制管理之下。

创建代码目录project:

$ cd /home/shiyanlou/
$ mkdir project

进入到代码目录,创建并初始化Git仓库:

$ cd project
$ git init

Git会输出:

Initialized empty Git repository in /home/shiyanlou/project/.git/

通过ls -la命令会发现project目录下会有一个名叫.git 的目录被创建,这意味着一个仓库被初始化了。可以进入到.git目录查看下有哪些内容。

四、正常的工作流程

1. 正常的工作流程

git的基本流程如下:

  1. 创建或修改文件
  2. 使用git add命令添加新创建或修改的文件到本地的缓存区(Index)
  3. 使用git commit命令提交到本地代码库
  4. (可选,有的时候并没有可以同步的远端代码库)使用git push命令将本地代码库同步到远端代码库

进入我们刚才建立的project目录,分别创建文件file1,file2,file3:

$ cd project
$ touch file1 file2 file3

修改文件,可以使用vim编辑内容,也可以直接echo添加测试内容。

$ echo "test" >> file1
$ echo "test" >> file2
$ echo "test" >> file3

此时可以使用git status命令查看当前git仓库的状态:

$ git status
On branch master

Initial commit

Untracked files:
   (use "git add <file>...") to include in what will be committed)

       file1
       file2
       file3
nothing added to commit but untracked files present (use "git add" to track)

可以发现,有三个文件处于untracked状态,下一步我们就需要用git add命令将他们加入到缓存区(Index)。

使用git add命令将新建的文件添加到:

$ git add file1 file2 file3

然后再次执行git status就会发现新的变化:

$ git status
On branch master

Initial commit

Changes to be committed:
    (use "git rm --cached <file>..." to unstage)

       new file: file1
       new file: file2
       new file: file3

你现在为commit做好了准备,你可以使用 git diff 命令再加上 --cached 参数,看看缓存区中哪些文件被修改了。进入到git diff --cached界面后需要输入q才可以退出:

$ git diff --cached

如果没有--cached参数,git diff 会显示当前你所有已做的但没有加入到索引里的修改。

如果你要做进一步的修改, 那就继续做, 做完后就把新修改的文件加入到缓存区中。

当所有新建,修改的文件都被添加到了缓存区,我们就要使用git commit提交到本地仓库:

$ git commit -m "add 3 files"

需要使用-m添加本次修改的注释,完成后就会记录一个新的项目版本。除了用git add 命令,我们还可以用下面的命令将所有没有加到缓存区的修改也一起提交,但-a命令不会添加新建的文件。

$ git commit -a -m "add 3 files"

再次输入git status查看状态,会发现当前的代码库已经没有待提交的文件了,缓存区已经被清空。

至此,我们完成了第一次代码提交,这次提交的代码中我们创建了三个新文件。需要注意的是如果是修改文件,也需要使用git add命令添加到缓存区才可以提交。如果是删除文件,则直接使用git rm命令删除后会自动将已删除文件的信息添加到缓存区,git commit提交后就会将本地仓库中的对应文件删除。

这个时候如果本地的仓库连接到了远程Git服务器,可以使用下面的命令将本地仓库同步到远端服务器:

$ git push origin master

这时候可能需要你输入在Git服务器上的用户名和密码。可以参考实验楼的代码库中的说明练习这个命令。

五、分支与合并

Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。

1.分支

一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫 experimental的分支:

$ git branch experimental

运行git branch命令可以查看当前的分支列表,以及目前的开发环境处在哪个分支上:

$ git branch
 experimental
* master

experimental 分支是你刚才创建的,master分支是Git系统默认创建的主分支。星号标识了你当工作在哪个分支下,输入git checkout 分支名可以切换到其他分支:

$ git checkout experimental
Switched to branch 'experimental'

切换到experimental分支,切换完成后,先编辑里面的一个文件,再提交(commit)改动,最后切换回 “master”分支:

# 修改文件file1
$ echo "update" >> file1
# 查看当前状态
$ git status
# 添加并提交file1的修改
$ git add file1
$ git commit -m "update file1"
# 查看file1的内容
$ cat file1
test
update
# 切换到master分支
$ git checkout master

查看下file1中的内容会发现刚才做的修改已经看不到了。因为刚才的修改时在experimental分支下,现在切换回了master分支,目录下的文件都是master分支上的文件了。

现在可以在master分支下再作一些不同的修改:

# 修改文件file2
$ echo "update again" >> file2
# 查看当前状态
$ git status
# 添加并提交file2的修改
$ git add file2
$ git commit -m "update file2 on master"
# 查看file2的内容
$ cat file2
test
update again

这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?

可以通过下面的git merge命令来合并experimental到主线分支master:

# 切换到master分支
$ git checkout master
# 将experimental分支合并到master
$ git merge  -m 'merge experimental branch' experimental

-m参数仍然是需要填写合并的注释信息。

由于两个branch修改了两个不同的文件,所以合并时不会有冲突,执行上面的命令后合并就完成了。

如果有冲突,比如两个分支都改了一个文件file3,则合并时会失败。首先我们在master分支上修改file3文件并提交:

# 切换到master分支
$ git checkout master
# 修改file3文件
$ echo "master: update file3" >> file3
# 提交到experimental分支
$ git commit -a -m 'update file3 on master'

然后切换到experimental,修改file3并提交:

# 切换到experimental分支
$ git checkout experimental
# 修改file3文件
$ echo "experimental: update file3" >> file3
# 提交到master分支
$ git commit -a -m 'update file3 on experimental'

切换到master进行合并:

$ git checkout master
$ git merge experimental
Auto-merging file3
CONFLICT (content): Merge conflict in file3
Automatic merge failed; fix conflicts and then commit the result.

合并失败后先用git status查看状态,会发现file3显示为both modified,查看file3内容会发现:

$ cat file3
test
<<<<<<< HEAD
master: update file3
=======
experimental: update file3
>>>>>>> experimental

上面的内容也可以使用git diff查看,先前已经提到git diff不加参数可以显示未提交到缓存区中的修改内容。

可以看到冲突的内容都被添加到了file3中,我们使用vim编辑这个文件,去掉git自动产生标志冲突的<<<<<<等符号后,根据需要只保留我们需要的内容后保存,然后使用git add file3和git commit命令来提交合并后的file3内容,这个过程是手动解决冲突的流程。

# 编辑冲突文件
$ vim file3
# 提交修改后的文件
$ git add file3
$ git commit -m 'merge file3'

当我们完成合并后,不再需要experimental时,可以使用下面的命令删除:

$ git branch -d experimental

git branch -d只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D

2.撒销一个合并

如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:

$ git reset --hard HEAD^
# 查看file3的内容,已经恢复到合并前的master上的文件内容
$ cat file3

3.快速向前合并

还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交(commit), 把两个父分支里的每一行内容都合并进来。

但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git 就会执行一个“快速向前"(fast forward)操作;git 不创建任何新的提交(commit),只是将当前分支指向合并进来的分支。

六、Git日志

1.查看日志

git log命令可以显示所有的提交(commit):

$ git log

如果提交的历史纪录很长,回车会逐步显示,输入q可以退出。

git log有很多选项,可以使用git help log查看,例如下面的命令就是找出所有从"v2.5“开始在fs目录下的所有Makefile的修改:

$ git log v2.5.. Makefile fs/

Git会根据git log命令的参数,按时间顺序显示相关的提交(commit)。

2.日志统计

如果用--stat选项使用'git log',它会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录:

$ git log --stat

3.格式化日志

你可以按你的要求来格式化日志输出。--pretty 参数可以使用若干表现格式,如oneline:

$ git log --pretty=oneline

或者你也可以使用 short 格式:

$ git log --pretty=short

你也可用medium,full,fuller,email 或raw。 如果这些格式不完全符合你的需求, 你也可以用--pretty=format参数定义格式。

--graph 选项可以可视化你的提交图(commit graph),会用ASCII字符来画出一个很漂亮的提交历史(commit history)线:

$ git log --graph --pretty=oneline

4.日志排序

日志记录可以按不同的顺序来显示。如果你要指定一个特定的顺序,可以为git log命令添加顺序参数。

按默认情况,提交会按逆时间顺序显示,可以指定--topo-order参数,让提交按拓扑顺序来显示(就是子提交在它们的父提交前显示):

$ git log --pretty=format:'%h : %s' --topo-order --graph

你也可以用 --reverse参数来逆向显示所有提交日志。

七、小结

本节讲解了几个基本命令:

  • git config:配置相关信息
  • git clone:复制仓库
  • git init:初始化仓库
  • git add:添加更新内容到索引中
  • git diff:比较内容
  • git status:获取当前项目状况
  • git commit:提交
  • git branch:分支相关
  • git checkout:切换分支
  • git merge:合并分支
  • git reset:恢复版本
  • git log:查看日志

八、练习

开通实验楼的代码库,在/home/shiyanlou/Code目录下练习一遍上述所讲的内容。


来源:https://www.shiyanlou.com/courses/4/labs/21/document

git log 用法详解 是一个极其灵活和强大的工具,能够帮助你深入理解和管理项目的版本历史。通过结合使用不同的选项和参数,你可以根据需要定制输出,从而更高效地进行开发工作。可以帮助开发者快速找到特定的提交、分析代码更改的历史、以及理解项目的发展轨迹。这会列出所有提交记录,从最近到最远排列,每条记录包含提交哈希、作者信息、日期和提交消息。是 Git 中一个非常强大的命令,它用于显示仓库的提交历史。通过不同的选项和参数,如果你希望每行只显示一次提交,并且只包括提交哈希和提交消息,可以使用。如果你想查看每个提交的具体更改,可以使用。 阅读详情

相关推荐

Git基本用法2.24

1. 下载安装git 1.1 下载(略) 1.2 安装 点击下一步开始安装。 1.3 生成SSH keys 安装完成后,打开Git Gui。 重要的第一步就是生成RSA的key密钥。2.24版本的点击 Help--帮助 > Generate SSH Key--生成SSH Key。这里我们可以生成自定义的RSA密钥,私钥自己保存,公钥发布出去。Where?生成密钥过程中,需要输入和确认密码,这个密码就是用来检验数字证书的,以后会用到须妥善保存。..

Nnnn的博客 577

Git基本用法(上) - 摘自实验楼

git 是一款非常强大的版本控制工具。一、实验说明本节实验为 Git 入门第一个实验,可以帮助大家熟悉如何创建和使用 git 仓库。二、git的初始化在使用git进行代码管理之前,我们首先要对git进行初始化。……

逆水行舟,不进则退 832

海量Embedding进行相似度查询和比较的方法

这个是在科研中的现实需求。例如每一个源代码文件,我们可以生成一个embedding,如果有超过5000万个embedding(例如用BERT生成5000万个embedding),怎么样有效地计算相似性呢(例如有5000个positive的embedding,想在5000万个中找到类似的)。 简单介绍一下我尝试的结果:如果直接用torch.cosine_similarity,我手里的数据估计至少要处理两个月。这时候就想到了用LSH -- Locality Sensitive Hashing,但是我之前并没怎

qysh123的专栏 4567

git常用命令

1)远程仓库相关命令检出仓库:$ git clone git://github.com/jQuery/jquery.git查看远程仓库:$ git remote -v 或者$git remote show [remotename]添加远程仓库:$ git remote add [name] [url]删除远程仓库:$ git remote rm [name]修改远程仓库:$ git remot...

一技旁身 564

开关电源补偿设计避坑手册:为什么你的Buck电路总在轻载时振荡?

本文深入剖析了Buck电路在轻载时发生振荡的根本原因,并提供了专业的补偿设计避坑指南。文章指出,轻载下输出滤波器Q值飙升、DCM模式切换导致的小信号模型剧变是主要诱因,并详细对比了Type II与Type III补偿网络在宽负载范围内的表现差异。通过结合LTspice仿真与工程实践,指导工程师如何优化补偿环路设计,确保电源从满载到空载的全程稳定。

hadoop5ranger的博客 675

解决win11无法安装.net framework 3.5(包括.net2.0和3.0)错误代码:0x80070005

解决win11无法安装.net framework 3.5(包括.net2.0和3.0)错误代码:0x80070005

zeng699304的博客 2万+

git clone 某个链接时候报错Initialized empty Git repository in 不能克隆

查看下是不是git是不是1.7.1版本。 使用 yum -y update 更新一下。 再使用git clone 虽然还是会提示这个报错,但是可以克隆了。亲测有效。 git版本是1.7.1 linux版本是Linux version 2.6.32-504.el6.x86_64 centos ...

qq_37347705的博客 4万+

C#读取CAD文件(dwg/dxf)并处理

项目要求识别CAD图纸(图纸内容与现实事物比例是1:1)中的内容,并提取出一些关键信息。这里的CAD图纸是指CAD文件,包含多种格式,dwg/dxf/dwf/stl/pdf等等。识别其中内容,主要指文件中的图元信息(也叫实体Entity),指线段、圆弧、矩形等图形元素。得到图元基础信息(比如长度、坐标、粗细)后,进一步做处理(如得到交点、得到线段间间隔、圆弧与线段切点等)。听起来有点难,因为作为软件工程师,对CAD相关事物并不了解,它是未知的;

三千幻想乡 1万+

Linux学习笔记_创建代码文件实例

目标 在 /home/shiyanlou 目录下创建 shiyanlou.py 文件 在文件中输入以下内容: print('hello shiyanlou') 进入 Code 目录,新建名为 test 的目录,然后将刚刚创建的 /home/shiyanlou/shiyanlou.py 文件复制到目录 /home/shiyanlou/Code/test 中 Start! 创建 shiyanlo...

pulapulahs的博客 1658

自动控制原理之控制系统的数学模型(类比神经网络学习数学模型)

控制系统的数学模型背景建模方法常用的数学模型时域数学模型的建立建立微分方程的步骤复数域模型的建立传递函数的性质系统的典型环节及传递函数比例环节惯性环节积分环节微分环节理想微分环节一阶微分环节二阶微分环节振荡环节延时环节(时滞环节) 背景 数学模型就像是真实世界的写照,它就像一个虚拟的世界,我们可以通过建模的方式了解这个真实世界的运作规律。 这一点很像强化学习,强化学习需要一个供智能体探索、学习的环境,于是,我们通常会事先建立一个虚拟的仿真环境。举个例子,对于人类来说,可能需要经过不断地尝试,甚至是生命的代价

zbp_12138的博客 6578

利用Openlayers4实现地图遮罩效果(二)

之前实现的遮罩效果,在深色背景的底图上,对要突出的区域采用半透明遮罩,以此来突出该区域。但是有时底图颜色偏白,这时候不再适合对要突出的区域采用遮罩,而是要对突出区域之外进行遮罩处理。两种效果的对比入下图: ...

此爱如少年 6399

Git实战——来自实验楼

Git诞生Git是linux社区开发的分布式版本控制系统,特点是: - 速度 - 简单的设计 - 对非线性开发模式的强力支持(允许上千个并行开发的分支) - 完全分布式 - 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)。2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等

qq_33487545的博客 340

Qt快速读取Excel文件

网上很多读取方式都是如下形式,太慢了,打开文件+读取文件要6s以上,实在是受不了! QAxObject excel("Excel.Application"); excel.setProperty("Visible", false); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_boo...

c+c++的博客 2万+

Git和Github的基本用法

简单易操作的Git和Github的基本用法

yanxiang3306 4947

【以太网硬件九】1000base-X是什么?

简要描述1000base-X物理层规范

highman110的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Git基本用法教程

Git(官网:https://git-scm.com/download/)安装之后鼠标右键会自动多出两个选项,这时就代表了安装成功。

可不期诺的博客 862

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SVN2GIT 教程

**svn2git** 是一个用于将 Subversion(SVN)仓库转换成 Git 仓库的工具。该项目由 NirvDrum 开发,旨在提供一种简单的方式将 SVN 的历史记录迁移至 Git 管理系统,同时保持原有的分支和标签结构。这对于那些希望从 SVN 迁移到 Git 的团队来说非常实用。 ## 2. 项目快速启动 ### 安装 首先确保你的系统中已经安装了 `git` 和 `ruby`...

gitblog_00026的博客 1163

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Git教程No2-基本操作命令

git、基本操作命令、学习、笔记、教程

AiQ37的博客 1519

Git Rebase 详解:原理、用法与实战案例

Git Rebase(变基)是一种重写提交历史的方式,能够让 Git 分支的提交记录保持线性,使代码库更加整洁。

YiYueHuan的专栏 2326

Git基本用法

Git基本用法

ZhuTT的博客 956

git基本用法教程(fork软件+git命令)

git基本用法教程(fork+git命令)

Enternalwiser的博客 2432

深入理解 Git Stash:功能、用法与实战示例

`git stash` 是 Git 中用于临时保存当前工作区修改的命令,主要用于在切换分支或进行其他 Git 操作时,避免未提交的修改被干扰或丢失。Stash 允许你保存当前的修改,并在需要时重新应用。

YiYueHuan的专栏 2778

GIT基本概念和用法总结

GIT基本概念和用法总结 guibin.beijing@gmail.com 在日常使用GIT过程中,经常会出错,比如无意间丢失了未提交的数据,回退版本时丢失了工作目录,等等。经过思考发现,所有这些错误都是因为对 GIT中一些基本的概念模糊而导致,因为对一些基本概念不清晰,导致对GIT每一条命令将会产生的结果不符合预期。下面我就梳理以下我经常碰到的问题相关 的基本概念。 1. Working D

665

Git基本教程

git是分布式版本控制工具,它没有中央服务器,每一台开发人员的电脑就是一台服务器,再断网情况下,依旧可以使用commit提交版本至本地库,再远程共享服务器磁盘损毁时,可以使用开发人员电脑恢复版本,这里就体现了分布式。与git相对应的集中式版本控制工具svn,它是有一台中央服务器来管理版本,必须联网才能工作,一旦中央服务器出现损坏,版本控制代码难以恢复。

qq_41619051的博客 1127

Git 教程 - Git 基本用法

Git 教程 - Git 基本用法 您的评价:        收藏该经验 Git 是当前最流行的版本控制程序之一,文本包含了 Git 的一些基本用法 创建 git 仓库 初始化 git 仓库  mkdir project  # 创建项目目录  cd project  # 进入到项目目录  git init  # 初始化 gi

javafreely的专栏 9万+
上一篇: git实战教程1-git介绍
下一篇: git实战教程3-基本用法(下)
Watson2016
博客等级 码龄11年 342粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值