Git入门基础知识

Git入门基础知识

多年开发工作以来,前前后后用过很多个版本管理工具,从最早的VSS(微软的工具,现在大概没人知道这是个什么东东了),到SVN、ClearCase、mercurial(hg),现在终于要过渡到Git了。

其实我们最近这些年一直用着hg,感觉挺好的,非常满意,没有打算换其他工具。无奈BitBucket发邮件通知,明年要切换到Git(详情请点击这里),考虑到年底事可能会比较多,乘着现在还不太忙,赶紧先学习,抓紧时间迁移。

HG和Git的基本原理和操作是相通的,都是分布式的版本管理工具。具体在某些细节上,确实有些差异。比如HG的commit操作,实际上相当于Git的add+commit两步操作。Git多了本地缓冲区的概念,在branch部分,HG和Git有很大差异。Git的本地branch和远端branch可以不一致,需要建立映射关联,而HG本地branch和远端branch总是一致的。Git当然更灵活些,而从管理角度考虑,我更喜欢HG的处理方式。

HG的branch不能被删除,只能被关闭,而Git的branch可以被删除!我觉得这是两者最大的一个差异。显然,Git更鼓励频繁地操作branch。这点我更喜欢Git,实际工作中,定位问题、出临时版本,都可以应用一些临时的branch,事后删除,版本库也干净很多。

网上的学习资料很多,我觉得廖雪峰写的教程非常详细、易懂,推荐给大家,请点击此处

在windows系统中,直接下载、安装SourceTree即可,而在Debian系统中,使用以下命令直接安装Git:

sudo apt install git

SourceTree 使用方便、直观,如果平时是工作在windows系统,用这个工具就挺好。像我很大一部分时间是工作在Debian系统上,因此掌握一些Git的命令行操作就比较重要,好在不太多,并且和HG相差不大。

以下记录一些常见的操作:

全局配置

ssh-keygen -t rsa -C "git@demo.com"

BitBucket的Git支持 SSH 和 HTTPS 两种传输方式,推荐采用SSH,并且采用证书接入,这样有两点好处:(1)防止其他人登录。账号、密码鉴权方式比较容易泄密,而SSH证书在本地保存,只要别人不能轻易获取你的密钥文件,就无法从其他计算机上登录Git服务器。(2)每次登录、操作无需输入账户密码,能省点时间吧。

上述命令就是创建SSH密钥,默认在~/.ssh 目录下创建两个文件:id_rsa以及id_rsa.pub。id_rsa.pub中记录公钥,将其内容拷贝出来,保存在BitBucket账户中即可。

git config --global user.name "git"
git config --global user.email "git@demo.com"

配置全局用户名。这个不是Git账号的登录名,只是在每次提交代码时,系统用这些参数做一些描述性信息,比如显示改动的用户是谁,诸如此类。

git config --global color.ui true

Git命令行采用彩色显示(无关紧要,只是个人的恶趣味)。

基本命令

git add xxx 将修改提交到缓冲区
git commit -m "1234"  将缓冲区提交到本地库
git restore <filename> 放弃本地的修改
git checkout -b xxx 创建本地分支xxx
git push --set-upstream origin xxx 将本地xxx分支推送到远程仓库
git checkout -b xxx --track origin/xxx 创建本地xxx分支,并关联到远程origin/xxx分支
git checkout xxx 切换到xxx分支

Branch相关命令

git branch 查询当前本地分支
git branch -a 查询所有本地和远端分支
git branch -r 查询远端分支
git merge xxx 将分支xxx合并到当前分支 
git branch -d xxx 删除本地分支xxx
git push origin -d xxx 删除远程分支xxx (注意:分支名不要带上 origin)
git remote prune origin 删除远程分支后,更新本地的远程信息
git pull 从远程仓库更新到本地仓库
git fetch --all 更新所有分支
git pull --all 拉取所有分支
git remote show origin 检查远程分支与本地分支的关系

Tag相关命令

git tag 查询所有的标签
git tag ttt 打一个标签ttt
git tag -a ttt -m "xxx" 打标签ttt,说明文字xxx
git show ttt 查看tag及其说明文字
git push origin ttt 推送标签到远程仓库
git push origin --tags 推送所有本地标签到远程仓库
git checkout tag_name 获取tag标签对应的代码(只是快照,无法更改)
git checkout -b branch_name tag_name 在tag基础上创建分支(可以进行修改)
git tag -d ttt 删除本地标签ttt (尚未推送到远程)
git push origin :refs/tags/ttt (删除远程库中的ttt标签)
Samba登录密码错误

Samba登录密码错误

在Pi上运行了Samba服务器,并创建了相应的samba用户和密码,但是从windows 7登录该samba服务器时,总是提示“用户名或者密码错误”。

可以肯定的是:用户名和密码都绝对没有错误!毕竟手写以及重新设置了无数遍,完全可以确认。

那问题出在哪里呢? 在网上搜索了一下,发现是windows 7的本地安全管理策略与samba配合有些问题,如下图所示:

修改windows本地安全策略

依次点击:控制面板 – 管理工具 – 本地安全策略 – 本地策略 – 安全选项,然后修改右侧的“网络安全 – LAN 管理器身份验证级别”项。

默认设置是“发送LM和NTLM,如果已协商,则使用NTLMv2会话安全”,需要修改为“仅发送NTLMv2响应,拒绝LM和NTLM”。

Pi3的奇怪故障

Pi3的奇怪故障

最近遇到的奇怪问题,Pi3总是无故崩溃,然后需要掉电重启才可以。后来发现是:由于自己习惯登录图形界面,只要一VNC登录到Pi的桌面,Pi就崩溃。如果仅仅是远程SSH到Pi,则没有任何问题。

对Pi不太熟悉,简单看了一些log,也没找出所以然。只好做了以下步骤:

(1)卸载vnc4server,然后重新安装vnc4server。

sudo apt remove xrdp vnc4server tightvncserver
sudo apt purge tightvncserver xrdp
sudo apt install vnc4server tightvncserver xrdp

(2)运行“sudo raspi-config”,更新,然后选择第7项“Advanced Options”,接着选择“A5 Resolution”,设置成“1280*720”。

完成这些步骤后,同时关闭了蓝牙和无线,只保留有线连接, 似乎VNC到Pi就没有问题了。

迁移系统至SSD盘

迁移系统至SSD盘

日常工作是使用一台Thinkpad T430,有点年头了,感觉各方面都已经有些吃力。很早就想着将系统转到SSD盘上,但是又不想重装系统,毕竟是正在用的工作电脑,折腾不了那么多时间。

这事就这么搁置下来了……

近日在逛知乎的时候,发现了一篇文章(请点击此处),里面介绍了免费软件可以轻松迁移系统到SSD盘上。大喜之下,从京东购买了msata接口的金士顿 SSD 盘(UV500系列,请点击此处了解),同时从文章中下载了软件,准备进行迁移。

遗憾的事情发生了,文章提到的免费软件已经不支持迁移系统,需要付费才行。后来在网上发现了其中文版本“傲梅分区助手”(请点击此处),似乎是同一厂家的软件。中文版本需要关注公众号,然后从公众号拿到注册码, 免费 ,而且功能上可以迁移系统,耗时大约两小时左右。

过程稍稍有点折腾,不过如果是三星的SSD盘的话可能就省事,因为三星提供了免费系统迁移工具,当然只对三星的SSD盘有效。

迁移过程比想象中简单多了,以前的软件多数都是安装在系统默认的C盘,因此直接就迁移过去了,非常平顺。部分软件安装在其他盘符,在新系统中调整一下盘符,或者卸载部分软件再重新安装即可。

总之,工作量不太大,过程顺利,很满意。

Pi3的不足之处

Pi3的不足之处

Pi3延续了Pi系列的特点,短小精干。从目前状况看,稳定性也不错,甚至可以说是一个基本可以商用的小系统了。经过近些年的应用,感觉还是有些不足,比如看看以下数据:

pi@raspberrypi3:~ $ uptime
15:21:51 up 44 days, 21:53, 2 users, load average: 0.81, 1.12, 1.10
pi@raspberrypi3:~ $ free -m
total used free shared buff/cache available
Mem: 927 788 34 9 104 80
Swap: 1123 250 873

连续运行44天,完成各项工作(实际工作负荷并不沉重),内存已经捉襟见肘,swap 使用了 250M 空间,系统明显变慢。当然,这可能是因为这个 Pi3 启动了图形界面,如果只是命令行方式,不会有这么多内存的需求。

考虑到 Pi4 似乎隔了很久还没发布,我倒是希望在 Pi4 中能看到以下改进:

(1)内存加到至少2G,基本能比较完善地支持图形系统了。

(2)支持5G频段的WiFi,希望无线网速越快越好。以太网接口取消算了。

(3)支持SSD。现在SD卡完全就是整个系统的瓶颈,除了体积小之外一无是处。如果能支持M.2 SSD,那就太好了。

网上有些网友也建议增加支持USB3,估计大部分这样的网友是打算用 Pi 组 NAS。我个人觉得意义不是特别大,NAS 更需要存储的完整性、一致性和稳定性,应该直接用专业的 NAS 硬件,Pi 并不适合这种场景。

2019-06-24 更新: Pi4正式发布,非常棒,内存可以选择4G,双频802.11ac!如果稳定性没问题的话,这几乎完美了。

怀孕?

怀孕?

上午过深圳湾海关去香港,带苗回学校学习乐器。在香港海关处见到一个让人很不愉快的场景。

在人工过关检验处,一位中年男性海关人员,在检查每一位女性的证件时,无论多大年龄(从小姑娘到中老年大妈),都亮出一个小纸片,上面写着“怀孕?”。相关女士回答后,这厮用粤语似乎说了些什么(听不太清楚,只是猜测),每位女士过去后似乎都一脸不快。如果被检查的是男士(或者男生),这厮也巴拉巴拉地(不知道在问什么),态度非常不友善,把通行证摔得啪啪响,甚至把一位男孩的通行证摔得掉在地上!

香港海关某些工作人员的粗鄙、无理,已经到一个新的下限了。

坦率地说,我对香港公共服务部门印象总体上很好,例如各事务处, 大部分工作人员都很专业,态度也很温和。而香港海关是我最讨厌的地方(没有之一),经常会遇到一些明目张胆地挖苦、讽刺、甚至大声辱骂大陆人的工作人员,态度倨傲, 永远都是一张臭脸。

办理回乡证(儿童篇)

办理回乡证(儿童篇)

俗称“回乡证”,实际名称是“港澳居民往来内地通行证”,在香港的中国旅行社办理。这个有点奇怪啊,大概是内地公安不能在香港处理这类事务,可能就委托旅行社接收各类材料,统一寄回大陆办理。

流程也比较简单,以前办理过,记忆有些模糊,乘这次换证的机会再重新记录一下。

预约

直接在香港中国旅行社的网站上登记预约,请点击此处。注意,要在下拉框最底下才能找到预约项,如下图所示。我当时找了半天,才找到这个入口,确实隐藏得很深。

预约回乡证
预约回乡证

前面的一些项包括下载必要的申请文件(也就是申请表)。

预约时登记原回乡证号码即可,注意,号码包括证件上的“换证次数”项。然后就是选择办理的地点,一般从深圳湾过去的话,就选择屯门的办理点即可。

材料

(1)申请表。在预约的网站中可以下载,自行填好,必须是黑色墨水笔填写!

(2)照片,要求有数码回执号码,建议直接到现场照。现场自助照相很方便,实际上是有人辅助和收费的,港币50门。

(3)大人的内地身份证,验原件,收复印件。

(4)小童的出生纸、回乡证、回港证,验原件,收复印件。

费用

港币260门,办理完成后,会有一张回执。凭(1)回执和(2)原回乡证,大约两周后自助在办理点机器上取新证即可。

路程

从深圳湾坐B3X到终点站“屯门市中心”,下车后沿着车头方向,上天桥到屯门市中心(商场),左转到屯门市场(也是一个商场),再到“杯渡”轻轨站,高架桥下面就是。

注意不要太早到,拿筹时间只允许提前30分钟,比如预约是10:40,那只能在10:10后拿筹,早到也拿不到筹。整个过程轻松愉快,大约半小时可全部办理完。

Ubuntu 19.04

Ubuntu 19.04

在虚拟机里安装并体验了一下,新界面整体上偏黑色,比以前的界面成熟些。

Ubuntu 19.04 界面截图
Ubuntu 19.04 界面截图

似乎比以前的版本更慢了,不知道是不是因为VirtualBox的原因(已启用硬件虚拟化VT-x/AMD-V),每一次点击后的反应都十分缓慢。简单体验还能忍受,但绝对无法在实际工作中接受这种速度,也许在物理机上会有更好的运行效率。

没有什么惊喜的地方,体验一下后可以删除了。

Debian 8 升级 Debian 9 (DO篇)

Debian 8 升级 Debian 9 (DO篇)

这两天升级几个Debian 8 (jessie)的droplet,屡次失败,后来参考了一篇blog(请点击此处了解),并多次尝试后才最终成功。回过头来看看,其实整个过程很简单,只是被一个点卡住,就来回折腾。本文简要记录一下操作顺序和操作要点,以备日后查看。

修改 /etc/apt/sources.list 文件

这个是通用步骤了,修改成 Debian 9 (stretch) 的源即可。

deb http://deb.debian.org/debian stretch main contrib non-free
deb http://deb.debian.org/debian stretch-updates main contrib non-free
deb http://deb.debian.org/debian stretch-proposed-updates main contrib non-free
deb http://deb.debian.org/debian stretch-backports main contrib non-free
deb http://deb.debian.org/debian-security stretch/updates main contrib non-free

deb-src http://deb.debian.org/debian stretch main contrib non-free
deb-src http://deb.debian.org/debian stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian stretch-proposed-updates main contrib non-free
deb-src http://deb.debian.org/debian stretch-backports main contrib non-free
deb-src http://deb.debian.org/debian-security stretch/updates main contrib non-free

这里也可以用 DO 自己的镜像站点的源(http://mirrors.digitalocean.com/)。考虑到我们的droplet都部署在欧洲和美国,因此速度上没太大差别,还是直接取官网的源好了。

备份 /etc/cloud 目录

使用以下命令直接备份即可。这步骤非常重要,实际上是整个升级的关键点!后面操作中,必须要还原这个目录!

cp -r /etc/cloud /etc/cloud-bak

停止所有相关的服务

这也是通用步骤,没什么细讲。有什么服务就停什么服务好了。

systemctl stop apache2
systemctl stop mysql
systemctl stop fail2ban
systemctl stop dovecot

更新并升级

需要注意的是,一般情况下,升级提示是否保留原有配置时,一般都保留原有配置,这个也是默认选项。但是对于fail2ban的jail.conf文件,建议采用系统新的文件,后面手工再改即可。

我在这个更新过程中,没有提示是否保留/etc/cloud的配置,因此后面需要手工还原备份的/etc/cloud目录,如果是系统提示了,务必要保留原有的/etc/cloud配置。

apt update
apt upgrade
apt dist-upgrade

还原 /etc/cloud 目录

完成各项更新后,先不要重启系统,务必先还原 /etc/cloud 目录。这步相当关键!如果没有还原,将采用系统新的/etc/cloud 配置,导致cloud-init 过程失败,系统无法启动!

rm /etc/cloud
cp -r /etc/cloud-bak /etc/cloud

最后,就是重启系统,完成整个升级。

关于 /etc/cloud 目录,只在 DO 的系统中有这个目录,在 Linode 等其他VPS系统没有发现。感觉是 DO 处理上一个不太完善的地方,这个目录似乎没有必要暴露给客机系统,主机系统配置即可。

和 DO 的技术支持人员简单交流了这个问题,平台相关的元数据(metadata)是保留在 /var/lib/cloud 目录下,似乎 /etc/cloud 只是上游云系统的初始化配置(根据 /var/log/cloud-init.log, 系统初始化时需要从这个目录下读取 cloud.cfg 等配置)。