title: Git使用简述
date: 2021-03-16 09:08:04
top: 21
tags:
- git
- gitee
categories: - git
关于git
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
安装
git包下载
ps: 如果网速不行,可选择版本号为Git-2.30.1-64-bit
git安装
这里就不赘述了,一直点就完事了。
git配置
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
打开git bash
单击鼠标右键>>点击git bash here
注意:默认在工作路径为当前位置,可以在目标文件夹进行打开,也可以通过命令切换到目标路径。
git bash命令行下可使用Linux系统的常用指令,相当于在windows系统嵌入一个shell bash
查看git版本,确认是否安装成功
git --version
配置个人信息
git config --global user.name "用户名"
git config --global user.email "邮件地址"
查看配置信息
git config -l
git工作流程
git概念: 工作区、暂存区和版本库
- **工作区:**就是你在电脑里能看到的目录。
- **暂存区:**英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- **版本库:**工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
git基本操作
初始化本地git仓库
git init
该命令是用来初始化git仓库的,是git使用的第一个命令。在执行完成 git init
命令后,Git 仓库会在当前目录生成一个 .git
目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。
git init <newrepo>
newrepo
为项目仓库文件夹名。初始化后,会在 newrepo
目录下会出现一个名为.git
的目录,所有 Git 需要的数据和资源都存放在这个目录中。
git remote 添加远程仓库
# 命令格式
git remote add [shortname] [url]
git remote add balbums git@39.105.7.83:/root/repositories/albums
##############
git remote -v # 显示所有远程仓库
git remote show [remote] # 显示某个远程仓库的信息
git remote rm name # 删除远程仓库
git remote rename old_name new_name # 修改仓库名
git add 添加文件到git暂存区
git add [file1] [file2] ... # 添加一个或多个文件(包括子目录)到暂存区
git add . # 添加当前目录下的所有文件到暂存区
git status # 命令用于查看在你上次提交之后,是否有对文件进行再次修改
git commit 提交暂存区到本地仓库
git commit -m "info" # 提交暂存区到本地仓库中;info是一些备注信息
git commit [file1] [file2] ... -m "info"
git commit --amend -m "info" # 修改上一次提交的info信息
*********************
git commit -a # -a 参数设置修改文件后不需要执行 git add 命令,直接来提交;不推荐使用。
git push 推送本地仓库文件
# 从将本地的分支版本上传到远程并合并 命令
git push [-f] [--set-upstream] <远程主机名> <本地分支名>:<远程分支名>
-f 表示强制覆盖(覆盖远端)
--set-upstream 推送到远端的同时建立起和远端分支的关联关系;如果当前分支已经和远端分支关联,则可以省略分支名和远端分支名 // 需远端分支名已存在
-u <=> --set-upstream
###########
git push balbums master:master # 分支名相同,;master可省略
-----------
git push --set-upstream balbums master
git push
从现有 Git 仓库中拷贝项目
git clone <repo> <directory> # 首次从远程仓库拉取代码
git pull [remote name] [brach name] # 下载远程代码并合并
git clone
从现有 Git 仓库中拷贝项目。directory
可以省略,默认当前文件夹。repo
为拷贝仓库的地址,如果是链接自己的仓库,这里可以使用ssh密钥来拷贝远程仓库。
git rm 删除文件操作
git rm <-f> <file> # 暂存区和工作区删除文件file; f>>force
git rm --cached <file> # 保留工作区文件,删除暂存区
git reset 回退版本
git reset [--soft | --mixed | --hard] [HEAD]
-----------
git reset --hard HEAD~3 # 回退上上上一个版本
git reset –hard bae128 # 回退到某个版本回退点之前的所有信息。
git reset --hard origin/master # 将本地的状态回退到和远程的一样
-----------
# --mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变
git reset HEAD^ # 回退所有内容到上一个版本
git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
git reset 052e # 回退到指定版本
--------------
# --soft 参数用于回退到某个版本, 只进行对commit操作的回退,不影响工作区的文件
git reset --soft HEAD~3 # 回退上上上一个版本
--------------
# --hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
# 会对当前工作文件进行回退
$ git reset --hard HEAD~3 # 回退上上上一个版本
$ git reset --hard bae128 # 回退到某个版本回退点之前的所有信息。
$ git reset --hard origin/master # 将本地的状态回退到和远程的一样
---------------
可以使用 ~数字表示
HEAD~0 表示当前版本
HEAD~1 上一个版本
HEAD^2 上上一个版本
HEAD^3 上上上一个版本
git tag 添加版本标签
# 如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 `git tag` 给它打上标签。
# 比如说,我们想为我们的项目发布一个"1.0"版本,可以用 `git tag -a v1.0 `命令给最新一次提交打上(HEAD)"v1.0"的标签。
git tag -a v1.0 # -a 选项意为"创建一个带注解的标签"
git tag -a <tagname> -m "info" # 指定标签信息命令
git 其他操作
git mv [file] [newfile] # 移动或重命名工作区文件
-----------
git diff [file] # 比较文件的不同,即暂存区和工作区的差异
# 尚未缓存的改动:git diff
# 查看已缓存的改动: git diff --cached
# 查看已缓存的与未缓存的所有改动:git diff HEAD
# 显示摘要而非整个 diff:git diff --stat
git diff <file> # 比较当前文件和暂存区文件差异 git diff
git diff <id1><id1><id2> # 比较两次提交之间的差异
git diff <branch1> <branch2> # 在两个分支之间比较
git diff --staged # 比较暂存区和版本库差异
git diff --cached # 比较暂存区和版本库差异
git diff --stat # 仅仅比较统计信息
------------
git fetch [remote name] [brach name] # 从远程获取代码库,抓取更新但不合并
git 分支管理
开发中分支使用原则与流程
在开发中,一般有如下分支使用原则与流程:
-
master(生产)分支
线上分支,主分支,中小规模项目作为线上运行的应用对应分支;
-
develop(开发)分支
从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要合并到master分支,准备上线;
-
feature分支
从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支;
-
hotfix分支
从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master,develop,test分支;
-
其他分支,如test分支(用于代码测试),pre分支(预上线分支)
分支操作命令
创建分支命令:
git branch <branchName>
# git branch 创建新分支,需要在master分支正式建立后,才能进行,也即第一次git commit操作后
----------------------
git branch dev # 创建dev分支
git branch -d dev # 删除dev分支
git branch -D dev # 强制删除dev分支,一般在未进行merge操作的前提下删除分支,会需要-D确认删除
---------------------
git branch -vv # 查看本地分支与远端分支的绑定关系
-------------------
git branch <branchName> <oldBranchName> # 在oldBranchName分支上新建分支branchName
git checkout 切换分支命令:
git checkout (branchname)
-------------------
git checkout -b dev # 创建并切换到dev分支
git checkout -b dev master # 在master分支上创建并切换到dev分支
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
git merge 合并分支命令:
git merge
# 一般合并操作的合并到master分支上
# 合并操作的流程为:切换到master分支,合并
git checkout master
git merge dev # 将分支dev合并到当前分支中,自动进行新的提交
git merge --no-commit maint # 将分支maint合并到当前分支中,但不要自动进行新的提交
列出分支基本命令
git branch # (没有参数时,`git branch` 会列出你在本地的分支):
删除分支命令:
git branch -d (branchname) # 删除本地分支
git branch -D (branchname) # 强制删除本地分支
git push origin --delete (branchname) # 删除远程分支
git 日志
使用git log
查看历史操作日志
查看日志命令:
git blame <file> # 以列表形式查看指定文件的历史修改记录
git log
# 以单行图形化形式查看详细日志信息
git log --oneline --all --graph --abbrev-commit
git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
# 如果不带任何参数,它会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明
# 如果记录过多,则按Page Up、Page Down、↓、↑来控制显示
--------------
# 按q退出历史记录列表
-p:按补丁显示每个更新间的差异,比下一条- -stat命令信息更全
--stat:显示每次更新的修改文件的统计信息,每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计
--shortstat:只显示--stat中最后的行数添加修改删除统计
--name-only:尽在已修改的提交信息后显示文件清单
--name-status:显示新增、修改和删除的文件清单
--abbrev-commit:仅显示SHA-1的前几个字符,而非所有的40个字符
--relative-date:使用较短的相对时间显示(例如:"two weeks ago")
--graph:显示ASCII图形表示的分支合并历史
—pretty=:使用其他格式显示历史提交信息,可选项有:oneline,short,medium,full,fuller,email,raw以及format:<string>,默认为medium,如:
--pretty=oneline:一行显示,只显示哈希值和提交说明(--online本身也可以作为单独的属性)
--pretty=format:” ":控制显示的记录格式,如:
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
作者和提交者的区别不知道是啥?
作者与提交者的关系:作者是程序的修改者,提交者是代码提交人
(自己的修改不提交是怎么能让别人拉下来再提交的?)
其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。
当你为某个项目发布补丁,某个核心成员将你的补丁并入项目,你就是作者,而那个核心成员就是提交者
%ce 提交者的电子邮件地址
%cd 提交日期(可以用 -date= 选项定制格式)
%cr 提交日期,按多久以前的方式显示
%s 提交说明
带颜色的--pretty=format:” ",这个另外写出来分析
以这句为例:%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>
先断句:[%Cred%h][%Creset -][%C(yellow)%d ][%Cblue%s][%Cgreen(%cd)][%C(bold blue)<%an>]
然后就是很明显能得到的规律了
一个颜色+一个内容
颜色以%C开头,后边接几种颜色,还可以设置字体,如果要设置字体的话,要一块加个括号
能设置的颜色值包括:reset(默认的灰色),normal, black, red, green, yellow, blue, magenta, cyan, white.
字体属性则有bold, dim, ul, blink, reverse.
内容可以是占位元字符,也可以是直接显示的普通字符
--------------------------------------------------------
-------------------------------------------------
--date= (relative|local|default|iso|rfc|short|raw):定制后边如果出现%ad或%cd时的日期格式
有几个默认选项
--date=relative:shows dates relative to the current time, e.g. "2 hours ago".
--date=local:shows timestamps in user’s local timezone.
--date=iso (or --date=iso8601):shows timestamps in ISO 8601 format.
--date=rfc (or --date=rfc2822):shows timestamps in RFC 2822 format,often found in E-mail messages.
--date=short:shows only date but not time, in YYYY-MM-DD format.这个挺好用
--date=raw:shows the date in the internal raw git format %s %z format.
--date=default:shows timestamps in the original timezone (either committer’s or author’s).
也可以自定义格式(需要git版本2.6.0以上),比如--date=format:'%Y-%m-%d %H:%M:%S' 会格式化成:2016-01-13 11:32:13,其他的格式化占位符如下:
%a:Abbreviated weekday name
%A:Full weekday name
%b:Abbreviated month name
%B:Full month name
%c:Date and time representation appropriate for locale
%d:Day of month as decimal number (01 – 31)
%H: Hour in 24-hour format (00 – 23)
%I:Hour in 12-hour format (01 – 12)
%j:Day of year as decimal number (001 – 366)
%m:Month as decimal number (01 – 12)
%M:Minute as decimal number (00 – 59)
%p:Current locale's A.M./P.M. indicator for 12-hour clock
%S:Second as decimal number (00 – 59)
%U:Week of year as decimal number, with Sunday as first day of week (00 – 53)
%w:Weekday as decimal number (0 – 6; Sunday is 0)
%W:Week of year as decimal number, with Monday as first day of week (00 – 53)
%x:Date representation for current locale
%X:Time representation for current locale
%y:Year without century, as decimal number (00 – 99)
%Y:Year with century, as decimal number
%z, %Z:Either the time-zone name or time zone abbreviation, depending on registry settings; no characters if time zone is unknown
%%:Percent sign
按数量
-n:显示前n条log
按日期
--after=
比如git log --after="2014-7-1”,显示2014年7月1号之后的commit(包含7月1号)
后边的日期还可以用相对时间表示,比如"1 week ago"和”yesterday",比如git log --after="yesterday"
这里的格式可以是什么?
--before=
同上
另外这两条命令可以同时使用表示时间段,比如git log --after="2014-7-1" --before="2014-7-4"
另外--since --until和 --after --before是一个意思,都可以用
按作者
--author=
比如git log --author=“John",显示John贡献的commit
注意:作者名不需要精确匹配,只需要包含就行了
而且:可以使用正则表达式,比如git log --author="John|Mary”,搜索Marry和John贡献的commit
而且:这个--author不仅包含名还包含email, 所以你可以用这个搜索email
按commit描述
--grep=
比如:git log --grep="JRA-224"
而且:可以传入-i用来忽略大小写
注意:如果想同时使用--grep和--author,必须在附加一个--all-match参数
按文件
- -(空格)或[没有]
有时你可能只对某个文件的修改感兴趣, 你只想查看跟某个文件相关的历史信息, 你只需要插入你感兴趣文件的路径[对,是路径,所以经常是不太好用]就可以了
比如:git log -- foo.py bar.py ,只返回和foo.py或bar.py相关的commit
这里的--是告诉Git后面的参数是文件路径而不是branch的名字. 如果后面的文件路径不会和某个branch产生混淆, 你可以省略- -,比如git log foo.py
另外,后边的路径还支持正则,比如:git log *install.md 是,指定项目路径下的所有以install.md结尾的文件的提交历史
另外,文件名应该放到参数的最后位置,通常在前面加上--并用空格隔开表示是文件
另外,git log file/ 查看file文件夹下所有文件的提交记录
按分支
- -
--branchName branchName为任意一个分支名字,查看某个分支上的提交记录
需要放到参数中的最后位置处
如果分支名与文件名相同,系统会提示错 误,可通过--选项来指定给定的参数是分支名还是文件名
比如:在当前分支中有一个名为v1的文件,同时还存在一个名为v1的分支
git log v1 -- 此时的v1代表的是分支名字(--后边是空的)
git log -- v1 此时的v1代表的是名为v1的文件
git log v1 -- v1 代表v1分支下的v1文件
按内容
-S"<string>"、-G"<string>"
有时你想搜索和新增或删除某行代码相关的commit. 可以使用这条命令
假设你想知道Hello, World!这句话是什么时候加入到项目里去的,可以用:git log -S"Hello,World!"
另外:如果你想使用正则表达式去匹配而不是字符串, 那么你可以使用-G代替-S.
这是一个非常有用的debug工具, 使用他你可以定位所有跟某行代码相关的commit. 甚至可以查看某行是什么时候被copy的, 什么时候移到另外一个文件中去的
注:-S后没有"=",与查询内容之间也没有空格符
按范围
git log <since>..<until>
这个命令可以查看某个范围的commit
这个命令非常有用当你使用branch做为range参数的时候. 能很方便的显示2个branch之间的不同
比如:git log master..feature,master..feature这个range包含了在feature有而在master没有的所有commit,同样,如果是feature..master包含所有master有但是feature没有的commit
另外,如果是三个点,表示或的意思:git log master...test 查询master或test分支中的提交记录
过滤掉merge commit
--no-merges
默认情况下git log会输出merge commit. 你可以通过--no-merges标记来过滤掉merge commit,git log --no-merges
另外,如果你只对merge commit感兴趣可以使用—merges,git log --merges
按标签tag
git log v1.0
直接这样是查询标签之前的commit
加两个点git log v1.0.. 查询从v1.0以后的提交历史记录(不包含v1.0)
按commit
git log commit :查询commit之前的记录,包含commit
git log commit1 commit2:查询commit1与commit2之间的记录,包括commit1和commit2
git log commit1..commit2:同上,但是不包括commit1
其中,commit可以是提交哈希值的简写模式,也可以使用HEAD代替
HEAD代表最后一次提交,HEAD^为最后一个提交的父提交,等同于HEAD~1
HEAD~2代表倒数第二次提交
git reflog 查看HEAD和分支引用在过去指向的位置记录
git reflog show [branchname]
git shortlog 日志汇总
# -s 参数省略每次 commit 的注释,仅仅返回一个简单的统计。
# -n 参数按照 commit 数量从多到少的顺利对用户进行排序
git shortlog -s -n
git submodule
其他操作
git config 配置git操作信息
# 配置git命令(以别名的形式,配置现有的git操作集)
# --add 添加配置项
git config [--local|--global|--system] --add section.key value
# --local 默认项,本地配置,配置文件位置 .git/config
# --global 当前用户全局配置,配置文件位置 ~/.gitconfig
# --system 所有用户全局配置,配置文件位置 /etc/gitconfig
# --add 可省略,默认
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git lg # 替代后面一长串
# 全局配置文件修改情况:
# [alias]
# lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
---
git config alias.llg "log --oneline --all --graph --abbrev-commit"
-----------------------------
# --unset 删除配置信息
git config [--local|--global|--system] --unset section.key
git config --global -–unset alias.lg
# 全局配置文件中该结点信息会被删除
-------------------------------------
-------------------------------------
-------------------------------------
# alias别名设置方式:
# 1. 通过git config配置 (推荐)
# 2. 直接按照格式修改配置文件
# 3. 修改 .bashrc文件
gitee(码云)
如果你知道github
的话,把gitee
看成国内版本就好了。gitee地址
Gitee 提供免费的 Git 仓库,还集成了代码质量检测、项目演示等功能。对于团队协作开发,Gitee 还提供了项目管理、代码托管、文档管理的服务,5 人以下小团队免费。
gitee 新建仓库
登陆网站>>注册账号>>点击右上头像边的+
>>新建仓库
然后,该点的点,该填的填。
这里最后创建
上面有个导入已有仓库
,可以通过这个位置,把github
上的仓库给导入进来。github
访问慢的同学,可以通过这样的方式去下载 。
SSH与gitee
查看系统中是否存在.ssh
文件夹(Everything搜吧,一般在C盘的用户目录下,如果不存在:
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
连续回车键,生成文件。打开.ssh
文件夹下的id_rsa.pub
,全选复制
打开gitee的设置界面>>SSH公钥>>粘贴进公钥对应的框>>确定
远程仓库与本地仓库连接
git clone <SSH>
<SSH>
为项目地址,可从gitee对应仓库中复制获取。
第一次使用该命令可能会出现:
输入yes
后回车
PS:如果是之前存在.ssh
文件夹报错,建议删了按步骤来一遍。
个人git服务器搭建
–bare “裸仓库”
git init 与 git init --bare
差异对比
git init albums
tree -aL 2 albums
#####################
albums
└── .git
├── branches
├── config
├── description
├── HEAD
├── hooks
├── info
├── objects
└── refs
######################
git init --bare albums.git
tree -aL 2 albums.git
#####################
albums.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags
功能差异
--bare
参数创建的仓库(albums.git
)一般叫“裸仓库”,里面没有工作区的概念,不能直接在仓库里进行正常的git命令操作; 该仓库可以推送的项目文件,但无法对文件进行任何操作。albums
仓库 可以直接在上面进行git操作 ,推送(git push
)会报错- 一般,默认git仓库目录命为
directoryName.git
;在系统中创建用户名为git
的用户,并关闭该用户的bash
权限,作为服务器仓库连接用户。
搭建git服务器
设你已经有sudo
权限的用户账号,下面,正式开始安装。
无法在root用户下创建git仓库
第一步,安装git
:
$ sudo apt-get install git
第二步,创建一个git
用户,用来运行git
服务:
$ sudo adduser git
第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub
文件,把所有公钥导入到/home/git/.ssh/authorized_keys
文件里,一行一个。
第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git
,在/srv
目录下输入命令:
$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git
结尾。然后,把owner改为git
:
$ sudo chown -R git:git sample.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd
文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git
用户可以正常通过ssh使用git,但无法登录shell,因为我们为git
用户指定的git-shell
每次一登录就自动退出。
第六步,克隆远程仓库:
现在,可以通过git clone
命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。
参考文献
[1] Git 教程
[2] The authenticity of host can’t be established.
[3] 黑马程序员Git全套教程
[4] 搭建Git服务器
[5] Git教程
[6] git log命令全解析