文章目录
- 前言
- Git简介:
- Git的诞生:
- 集中式和分布式
- 安装Git:
- 创建版本库
- 时光穿梭机(*)
- 版本回退
- 撤销修改
- 删除文件
- 远程仓库:
- 添加远程仓库:
- 删除远程库与本地库的链接:
- 从远程库克隆(*)
- 使用GitHub
前言
日常需要,但又因为用的少,所以一些命令不太熟,所以根据自己的记忆需求整理成文。整理的资料对象:《廖雪峰的Git教程》,定位:拿手即用,字典查询。
Git简介:
Git:不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以。这样,你就结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪。
Git的诞生:
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。
集中式和分布式
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
安装Git:
- Linux、MacOS、Windows通用安装教程
- 安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
创建版本库
什么是版本库呢?英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
在空目录下使用命令git init
将该目录变成git可管理的仓库。此时当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
$ git init
Initialized empty Git repository in XXX/.git/
使用版本库:
把大象放到冰箱需要3步相比,把一个文件放到Git仓库只需要两步。
-
用命令
git add
告诉Git,把文件添加到暂存区:$ git add XXX
-
用命令
git commit
告诉Git,把文件提交到仓库:$ git commit -m "wrote a readme file" [master (root-commit) eaadf4e] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 XXX
git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。为什么Git添加文件需要
add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件。
时光穿梭机(*)
常用命令:
git status
命令可以让我们时刻掌握仓库当前的状态git diff XXX
查看文件最近修改的内容git log
命令显示从最近到最远的提交日志,加上--pretty=oneline
可以简化输出信息。git diff HEAD -- XXX
查看工作区中的XXX文件与最近一次提交的XXX文件的修改
版本回退
HEAD
表示当前版本,第前K
个版本,就是HEAD~K
,
- 首先使用
git log
确定回退到哪个版本,假设回到第前K
个版本,其对应的commit id
的前几位是1094adb...
。 - 使用命令指定回到过去/未来的某个版本:
$ git reset --hard HEAD~K(or 1094ad)
git reflog
用来记录你的每一次commit
和reset
。
撤销修改
之前提到,把文件放到Git仓库只需两步,所以撤销修改也对应几种情况:
- 只在工作区作了修改尚未
git add
时使用:git restore <file>
- 只有
git add
尚未git commit
时使用:
回到情况1,然后使用git restore --staged <file>
git restore <file>
处理。 - 执行了
git commit
尚未git push
:
使用版本回退$ git reset --hard HEAD~K(or 1094ad)
删除文件
在Git中,删除操作也是一个修改
具体操作流程:
- 在工作区删除某个文件:
rm XXX
- 分情况:
- 确定删除:使用命令将本次操作提交到暂存区并且提交
git add/rm <file> git commit -m "delete XXX"
- 误删操作:进行恢复操作:
git restore <file>
- 确定删除:使用命令将本次操作提交到暂存区并且提交
远程仓库:
Git的杀手级功能之一(注意是之一,也就是后面还有之二,之三……):远程仓库。
找一台电脑充当服务器(GitHub)的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
前置条件:
- 注册一个GitHub账号
- 由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要一点设置:
- 创建SSH Key:
$ ssh-keygen -t rsa -C "youremail"
- 第2步:登陆
GitHub --> Settings --> SSH Keys
页面,点击New SSH Keys
,然后在Key
文本框里粘贴/Users/XXX/.ssh/id_rsa.pub
文件的内容,从而在GitHub设置中添加自己机器的身份。因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
- 创建SSH Key:
添加远程仓库:
-
首先,登陆
GitHub
,然后,在右上角找到“New repository
”按钮,创建一个新的仓库: -
在
Repository name
中填入仓库名,其他保持默认设置后,点击Create repository
后就成功地创建了一个新的Git仓库。 -
现在,在本地仓库目录下运行命令:
$ git remote add origin git@github.com:username/XXX.git
添加后,远程库的名字就是
origin
,这是Git
默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。 -
可以把本地库的所有内容推送到远程库上:
git push -u origin main
由于远程库是空的,我们第一次推送main分支时,加上了-u参数,Git不但会把本地的main分支内容推送的远程新的main分支,还会把本地的main分支和远程的main分支关联起来,在以后的推送或者拉取时就可以简化命令使用
$ git push origin main
。删除远程库与本地库的链接:
- 建议使用
$ git remote -v
查看一下远程库的信息$ git remote -v origin git@github.com:username/XXX.git (fetch) origin git@github.com:username/XXX.git (push)
- 根据名字删除,比如删除
origin
,此处的删除其实是解除本地和远程的绑定关系,并不是物理上删除了远程库。$ git remote rm origin
- 建议使用
从远程库克隆(*)
简单粗暴,使用命令
$ git clone git@github.com:username/XXX.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
使用GitHub
如何参与一个开源项目呢?
- 在
GitHub
上,可以任意Fork
开源仓库; - 从自己的账号下
clone
,因为自己拥有Fork
后的仓库的读写权限:git clone git@github.com:michaelliao/bootstrap.git
- 如果你希望
bootstrap
的官方库能接受你的修改,你就可以在GitHub
上发起一个pull request
。当然,对方是否接受你pull request
就不一定了。
其他方面用到再更…