版本管理工具 Git

一切开始的地方
作为目前最流行的分布式版本管理工具,git从诞生伊始就备受关注。虽然这与它的作者Linus(大名鼎鼎的Linux操作系统的作者)的个人影响力有一定的关系,
但更重要的是,git无论是在设计理念、性能、安全性还是易用性等方面都有着传统的版本管理工具无可比拟的优势。除此之外,它还是完全开源和免费的。
很多对Git完全不了解的同学可能会误以为Git和Github是一个概念,但其实两者有着本质的区别:
前者是一个版本管理工具,而后者是一个项目托管平台。在英文中hub的意思是“中心,核心”,
所以Github意为它是以Git作为版本管理工具的项目托管平台

git Basic

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 1.获得git仓库
git init:执行之后 仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面
git clone <url>:克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地,而不是取某一个特定版本,所以用clone而不是checkout

# 2.git中版本的保存:
记录版本信息的方式主要有两种:记录文件每个版本的快照/
记录文件每个版本之间的差异:Subversion和Perforce等版本控制系统都是记录文件每个版本之间的差异,这就需要对比文件两版本之间的具体差异
记录文件每个版本的快照:git:不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,
(实现方法:而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和)
(实现原理:当一个文件被改变时,它的校验和一定会被改变(理论上存在两个文件校验和相同,但机率小到可以忽略不计),GIT就以此判断文件是否被修改,及以些记录不同版本
(文件状态概念的引入:在工作目录的文件可以处于不同的状态,比如说新添加了一个文件,GIT发觉了这个文件,但这个文件是否要纳入GIT的版本控制还是要由我们自己决定,比如编译生成的中间文件,不想纳入版本控制 所以引入文件状态

# 3.1 git 的三个工作区:
git directory::本地数据(仓库)目录:就是我们的本地仓库.git目录,里面保存了所有的版本信息等内容
working driectory::工作目录:就是我们的工作目录,其中包括未跟踪文件及已跟踪文件,而已跟踪文件都是从git directory取出来的文件的某一个版本或新跟踪的文件。
staging area::暂存区:不对应一个具体目录,其时只是git directory中的一个特殊文件
当我们修改了一些文件后,要将其放入暂存区然后才能提交,每次提交时其实都是提交暂存区的文件-->git仓库,然后清除暂存区。
而checkout某一版本时,这一版本的文件就从git仓库取出来-->我们的工作目录。

3.2 git文件操作
版本控制就是对文件的版本控制,对于Linux来说,设备,目录等全是文件,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上
工作目录中的文件被分为两种状态,一种是已跟踪状态(tracked),另一种是未跟踪状态(untracked):只有处于已跟踪状态的文件才被纳入GIT的版本控制
git add <file> : 跟踪文件::当我们往工作目录添加一个文件的时候,这个文件默认是未跟踪状态的,不希望编译生成的一大堆临时文件默认被跟踪每次手动将这些文件清除出去。

staged状态:在输出每个文件状态的同时还说明了怎么操作,像上图就有怎么暂存、怎么跟踪文件、怎么取消暂存的说明。
git status : 文档状态查看::当前工作目录中所有文件目前的状态::哪些文件已被暂存::有哪些未跟踪的文件::哪些文件被修改了::
changes to be committed:已被暂存
Untracked files:未跟踪
changes not staged for commit:暂存此文件时,暂存的是那一文件当时的版本,当暂存后再次修改了这个文件后就会提示这个文件暂存后的修改是未被暂存的
git add <file>... :暂存文件:use "git add <file>..." to update what will be committed
(可以使用glob模式匹配,比如"file[ab]",也可以使用"git add ."添加当前目录下的所有文件。)
git reset HEAD <file>... :取消暂存文件
git checkout -- <file>... :修改了一个文件想还原修改
git diff : ---a表示修改之前的文件,+++b表示修改后的文件 ::显示的是文件修改后还没有暂存起来的内容
git diff --cached:---/dev/null:之前没有提交过这一个文件,这是将是第一次提交:比较暂存区的文件与之前已经提交过的文件:提交的是暂存区的内容
git diff --staged:与上面操作等效(GIT的版本要大于1.6.1)
再次执行"git add"将覆盖暂存区的内容----------???

# 4.git提交和提交历史:
提交:
git commit:第一行填简单说明,隔一行填写详细说明
git commit -a:跳过暂存区直接提交修改的文件,可以使用"-a"参数,但要慎重,别一不小心提交了不想提交的文件
git commit -m 'commit message':需要快捷地填写提交说明可使用"-m"参数
查看提交历史:
git log:显示commit的哈希编码/作者ID/时间Date/第几次提交
git log -1:显示最新的一次提交
git log -n:
git log --pretty=oneline --addrev-commit: 显示简单的SHA-1值与简单提交说明 (oneline仅显示提交的第一行)
git log --graph:以图形化的方式显示提交历史的关系,这就可以方便地查看提交历史的分支信息,当然是控制台用字符画出来的图形

git 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
git status 									查看事实文件的状态--是否修改
git diff 打印修改的内容
git add xxx.sh 把修改后的文件暂存到仓库
git add . 把当前目录修改后的所有文件暂存到仓库
git commit -m 'modify hook' 记录修改的内容
git commit --amend 提交到上次的修改 / 修改上次提交的注释
git commit --amend -C HEAD
git push origin HEAD:refs/for/develop 提交最新版本 develop:分支名
git branch 在哪个分支
git log 历史修改记录
git reflog 几乎所有本地仓库的改变
git checkout:
git HEAD:
git reset --hard HEAD~1 返回上一个HEAD
git reset --hard origin/develop Your branch and 'origin/develop' have diverged,
and have 2 and 2 different commits each, respectively.解决方式
git clone ssh://luna.xiong@review.source.unisoc.com:29418/scm/bin/jen -b develop 克隆某个仓库的某个分支到本地当前文件夹
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 luna.xiong@rev iew.source.unisoc.com:hooks/commit-msg ${gitdir}/hooks/commit-msg
git commit --amend 删除所有hook后---缺少change-ID 时的解决方案
git pull --rebase 与服务器上的最新版本自动合并
git rebase --abort 取消当前合并操作

repo sync

1
2
3
更新服务器最新版本的文件到本地
chmod g=rx hello.sh 设置 同组人权限
chmod 0755 hello.sh 设置文件可执行权限

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2024 HELLO WORLD All Rights Reserved.

UV : | PV :