mambat / blog

mambat - 博客
6 stars 0 forks source link

Welcome to Git #8

Open mambat opened 6 years ago

mambat commented 6 years ago

Git简介

Git是什么?

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

image

Linus Torvalds

  • Linux & Git
  • Talk is cheap, show me the code.
  • Software is like sex: it's better when it's free.

什么是版本控制系统(VCS)?


版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。

版本 用户 说明 日期
1 张三 删除了软件服务条款5 7/12 10:38
2 张三 增加了License人数限制 7/12 18:09
3 李四 财务部门调整了合同金额 7/13 9:51
4 张三 延长了免费升级周期 7/14 15:17

集中式vs分布式

猛戳Here

Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。

最初,只有一台机器有一个原始版本库,此后,别的机器可以“Clone”这个原始版本库,而且每台机器的版本都是一样的,没有主次之分。

然而,实际情况往往是找一台电脑充当服务器的角色,7x24小时开机,交换大家的修改。


为什么 Git 比 SVN 好

猛戳Here


Git基础

image

基本的 Git 工作流程如下:

  1. 在工作目录中修改某些文件。

  2. 将修改后的文件保存到暂存区域。

  3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。

我们可以从文件所处的位置来判断其状态:


安装Git

Baidu一下,你就知道

Google一下,你就知道的太多了


创建版本库

本地初始化版本库(从无到有)

Command Line
```
mkdir gitlab-demo
cd gitlab-demo
git init
```
Intellij IDEA

image

此方式用的不多,一般都采用克隆远程版本库的方式

克隆远程版本库(从有到多)


克隆,顾名思义,远程版本库已存在

Command Line
git clone git@gitlab.server:wanglei/gitlab-demo.git
Intellij IDEA

image


把文件添加到版本库

首先明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

Command Line

touch README.md
vi README.md
git add README.md
git commit -m "wrote a readme file"

Intellij IDEA

image

> ***一旦文件被Add to VCS,后续无需再Add: IDEA会在文件被修改后,自动进行Add*** 

image

image


查看文件状态

Command Line

git status

Intellij IDEA:

image


查看提交日志

Command Line

git log --pretty=oneline

Intellij IDEA

image


查看文件变化

Command Line

Intellij IDEA


撤销修改

Command Line

Intellij IDEA

Note: IDEA会自动Add(stage)

image


版本回退

Command Line

Intellij IDEA

Note: 注意HEAD、master、origin master指针的变化

image

image

To Commit 中输入回退目标版本号,默认为HEAD image


删除文件

Command Line

Intellij IDEA

Note: IDEA只支持本地工作目录和版本库同时删除

本地删除file,然后Commit Changes

image


Ignore Files

版本库根目录下创建文件: .gitignore

```
target
.DS_Store
.idea
*.iml
```

Git分支

几乎每一种版本控制系统都以某种形式支持分支。

使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作,开发完成后,再一次性合并到开发主线上。

在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间。

但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!

image

Git 的开发者都喜欢以这种方式来开展工作:


创建与合并分支

Git默认只有一个分支,交主分支,即master分支。所有向master分支的提交可以串成一条时间线,如下:

image

Command Line

Intellij IDEA


Stash & Unstash

开发新功能的过程中,如果需要及时解决线上的一个Bug,但是目前新开发的代码又不能提交,该怎么办?

将当前工作目录保存下来,以备后续恢复后继续工作

Command Line

git stash

Intellij IDEA

image

基于master创建bug修复分支issue-001

git checkout master
git checkout -b issue-001
...
git add -A
git commit -m "fix bug 001"

恢复工作目录(假设之前的工作分支为dev)

Command Line
git checkout dev
git stash list
git stash apply stash@{0}
git stash drop stash@{0}

Note: git stash pop恢复至最近一次stash,同时将该stash删除

Intellij IDEA

image


远程版本库

团队开发中,为了方便的交换大家的代码,通常需要搭建一个Git服务器,团队所有人都可以7x24访问。

服务器上创建的版本库,我们称之为远程版本库,所有人将本地版本库的修改推送至远程版本库。

Git服务器

Git服务器需要提供用户注册、权限管理、版本库管理、代码预览、issue跟踪等功能,常见的Git服务器如下:

Git服务器创建版本库

很简单,可以去GitHub练练手。

添加远程版本库

Note: 通过Clone方式创建的本地版本库,不需要此步骤。

git remote add origin git@gitlab.server:wanglei/gitlab-demo.git

IDEA Git不支持add remote repository,需要在命令行中进行处理。


推送分支

Command Line

Note:通过Clone方式创建的本地版本库 无需指定-u参数、将本地分支与远程分支关联起来

git push -u origin master

Intellij IDEA


若远程库是空的,第一次推送时需指定具体的分支:

image

image


抓取分支

当你的小伙伴已经向远程分支推送了他的提交,而碰巧你也对同样的文件作了修改,那么你再推送时会失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突。

那么此时你就需要将远程最新的提交抓取下来,然后再本地合并,解决冲突再提交。

Command Line

Intellij IDEA


Merge Request

通常,版本库的master分支只有少数人能够直接推送,其他人只能通过创建Feature分支、像Master分支提交Merge Request的方式来提交代码。

提交Merge Request时,可以指定受理人,受理人会收到相应的Merge Request邮件,然后进行处理:

更新远程仓库数据

Command Line

git fetch origin

Intellij IDEA

image

查看Merge Request的修改记录

Command Line

git log master..origin/feature1

Intellij IDEA

image

如若接受Merge Request,则在本地进行合并

Command Line
git checkout master
git merge origin/feature1
###### 如果合并后测试有问题,则进行回退
git reset --hard HEAD^ 或 master@{1} 
###### 推送远程
git push
Intellij IDEA

image

Note:

  • Merge Changes前最好对当前本地的修改进行commit或者stash。
  • Command Line环境下,如果本地存在未提交的变更,则无法进行后续的Merge操作。
  • IDEA中,则提供了Smart Merge功能,原理就是自动帮你Stash & UnStash
  • 也可以在Branch视图中,选择对应的Remote Branch,进行Merge操作。

选中要合并的分支,执行合并

image

合并完成后,推送远程

Note:

  • 需要到Git服务器提供的Web界面进行Merge Request的发起和关闭。
  • Merge Request可以保证代码Review

加入GitLab

注册

协议

GitLab支持Http和SSH两种传输协议:

SSH协议

与GitLab建立互信的步骤如下:

Enjoy the Git