git

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git相关的知识,希望对你有一定的参考价值。

三种版本控制系统
三种版本的的区别
git (是个软件) 是一种工具

githud (网站) 全球最火的代码库  上传所有代码 开源  权限控制不自由

gitlad(网站)  权限控制上更灵活(可公开,可不公开)不收费 共有仓库 专门储存代码

什么是集中式?
集中式开发:是将项目集中存放在中央服务器中,在工作的时候,大家只在自己电脑上操作,从同一个地方下载最新版本,然后开始工作,做完的工作再提交给中央服务器保存。这种方式需要联网,现在云开发就是这样的处理方式。
       缺点:1.如果网络出现异常或者很卡,直接影响工作效率。如果是中央服务器挂了,那就集体喝茶去了。
2.还有一种情况,各自电脑中操作的所有软件工具,都存放在一个中央服务器上(现在流行叫云服务器),只需要用各自电脑登陆连接到云服务器上,(一般服务 器都是用linux),比如用ps工具,大家其实用的是云服务器中的同一个ps 软件,在使用率高的情况下,ps会出现异常,当用ps筛选颜色的时候,已经混乱,无法正常选择颜色,这个情况是我在开发中遇到的。以前我们是每个人用各自 安装的ps,但是在这样的环境下用的是同一个ps软件的时候就会有bug。
3.安全度不高,重要的东西都放在一个中央服务器中,如果被黑,那损失就大了。
优点:1.减少了硬件和软件成本,硬件不用说了,现在流行盒子,一个小盒子只要连上中央服务器即可,以前都是一个个主机箱,那成本大多了。如果用到工具软件需要收费,只需买一套正版就OK了。

技术分享图片

什么是分布式?
分布式开发:只要提供一台电脑作为版本集中存的服务器放就够了,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它也一样干活,只是交换修改不方便而已。而每一台电脑有各自独立的开发环境,不需要联网,本地直接运行,相对集中式安全系数高很多。
技术分享图片
  

git部署
技术分享图片
环境:
centos7u4
vm20 192.168.245.139 充当中央服务器
vm21 192.168.245.249

安装:所有机器都安装

yum install git -y

# git --version
git version 1.8.3.1

准备:
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

git config --global user.email "[email protected]"

# git config --global user.name "wing"

版本库:
又名仓库,英文名repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”.

1.创建一个空目录:在vm20上创建
[[email protected] /]# mkdir gittest
[[email protected] /]# cd gittest/=

2.通过git init命令把这个目录变成Git可以管理的仓库:
方式1.创建本地库:
这样创建的库其他机器可以clone,但是没办法push
[[email protected] gittest]# git init
初始化空的 Git 版本库于 /gittest/.git/

创建完成后查看库目录:
[[email protected] gittest]# ls -a
. .. .git

git相关概念

1.现有源文件:
[[email protected] gittest]# cat a.txt
friday
monday

2.第一次修改:添加一行tuesday
[[email protected] gittest]# cat a.txt
friday
monday
tuesday

3.执行add:
[[email protected] gittest]# git add a.txt

4.第二次修改:添加一行wednesday
[[email protected] gittest]# cat a.txt
friday
monday
tuesday
wednesday

5.不做add,直接提交:
[[email protected] gittest]# git commit -m "看看第二次修改有没有被commit"
[master 0e14810] 看看第二次修改有没有被commit
1 file changed, 1 insertion(+)
[[email protected] gittest]# git status

位于分支 master

尚未暂存以备提交的变更:

(使用 "git add <file>..." 更新要提交的内容)

(使用 "git checkout -- <file>..." 丢弃工作区的改动)

#

修改: a.txt

#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

注意:如果第二修改也被add了不会出现上面的提示

6.查看当前版本和a.txt文件内容的区别(有输出内容,说明现在版本库和文件a.txt内容有区别,也就是第二次修改并没有被提交):
[[email protected] gittest]# git diff HEAD -- a.txt
diff --git a/a.txt b/a.txt
index 1091166..adfd1e9 100644
--- a/a.txt
+++ b/a.txt
@@ -1,3 +1,4 @@
friday
monday
tuesday
+wednesday

7.再次add后,发现工作区干净了,而且当前版本库HEAD和a.txt没有任何区别了:
[[email protected] gittest]# git add a.txt
[[email protected] gittest]# git commit -m "再看第二次修改有没有被commit"
[master fe18903] 再看第二次修改有没有被commit
1 file changed, 1 insertion(+)

[[email protected] gittest]# git status
# 位于分支 master
无文件要提交,干净的工作区

[[email protected] gittest]# git diff HEAD -- a.txt
[[email protected] gittest]# 

撤销修改

撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,
就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,使用版本回退,不过前提是没有推送到远程库。(见下节)

场景1: 源文件添加了一行thursday,还没有add到stage(前提:之前提交过此文件)
[[email protected] gittest]# cat a.txt
wednesday
thursday

撤销刚才的修改:
[[email protected] gittest]# git checkout -- a.txt
[[email protected] gittest]# cat a.txt
wednesday

场景2:源文件添加了一行thursday,并且add到了stage(前提:之前提交过此文件)
[[email protected] gittest]# cat a.txt
wednesday
thursday
[[email protected] gittest]# git add a.txt
[[email protected] gittest]# git status

位于分支 master

要提交的变更:

(使用 "git reset HEAD <file>..." 撤出暂存区)

#

修改: a.txt

#

[[email protected] gittest]# git reset HEAD a.txt
重置后撤出暂存区的变更:
M a.txt
[[email protected] gittest]# cat a.txt
wednesday
thursday

[[email protected] gittest]# git checkout -- a.txt

[[email protected] gittest]# cat a.txt
wednesday

版本回退

场景3:已经提交到版本库
查看现在的版本:
[[email protected] gittest]# git log
commit 898a61cb50da77daeda51453bef38c98fecd46a0
Author: wing <[email protected]>
Date: Sun Feb 25 18:04:27 2018 +0800
test1
commit d75411fb17e661cefc1900a09c8a784e8aa0d79a
Author: wing <[email protected]>
Date: Sun Feb 25 17:56:45 2018 +0800
test1

版本回退(切换):
在Git中,上一个版本就HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

回到上一个版本:
[[email protected] gittest]# git reset --hard HEAD^
HEAD 现在位于 83f6e8d Signed-off-by: [email protected] <tom>

回到指定的版本(根据版本号):
[[email protected] gittest]#git reset --hard 6fe5b9a2

消失的ID号:
回到早期的版本后再查看git log会发现最近的版本消失,可以使用reflog查看消失的版本ID,用于回退到消失的版本
[[email protected] gittest]# git reflog
32c31f5 [email protected]{0}: reset: moving to 32c31f54c1
6fe5b9a [email protected]{1}: reset: moving to 6fe5b9a2
928ab9e [email protected]{2}: reset: moving to HEAD^^
83f6e8d [email protected]{3}: reset: moving to HEAD^
6fe5b9a [email protected]{5}: commit: 这个能写中文
83f6e8d [email protected]{6}: commit: Signed-off-by: [email protected] <tom>
32c31f5 [email protected]{7}: commit: add a line monday
928ab9e [email protected]{8}: commit (amend): this is a new file test
bee2ba0 [email protected]{9}: commit: this is a new file test
c8e6b87 [email protected]{10}: commit: 添了两个
fbecfa3 [email protected]{11}: commit: add haha
7e99d94 [email protected]{12}: commit: 添加hello一行
addd750 [email protected]{13}: commit (initial): test

然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

删除文件

删除文件:
从工作区删除a.txt,并且从版本库一起删除
[[email protected] gittest]# rm -rf a.txt
[[email protected] gittest]# git status

位于分支 master

尚未暂存以备提交的变更:

(使用 "git add/rm <file>..." 更新要提交的内容)

(使用 "git checkout -- <file>..." 丢弃工作区的改动)

#

删除: a.txt

#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[[email protected] gittest]# git rm a.txt
rm ‘a.txt‘

[[email protected] gittest]# git commit -m "删除文件a.txt"
[master 4bb90a4] 删除文件a.txt
1 file changed, 4 deletions(-)
delete mode 100644 a.txt

[[email protected] gittest]# git status
#位于分支 master
无文件要提交,干净的工作区

删除了文件readme.txt之后又后悔了,恢复回来
[[email protected] gittest]# ls
readme.txt
[[email protected] gittest]# rm -rf readme.txt
[[email protected] gittest]# git checkout -- readme.txt
[[email protected] gittest]# ls
readme.txt

部署远程仓库

部署远程仓库
远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。
GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。

搭建Git服务器需要准备一台运行Linux的机器
第一步,安装git:
#yum install git

第二步,创建一个git用户,用来运行git服务:
#adduser git
#passwd git(设置密码)

第三步,创建证书登录: 在 客户端做
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
#ssh- keygen
开发者:做秘钥对(私钥) 传公钥给主库上的账户 ssh-copy-id -i 用户@id
主库 :/home/git/.ssh/authorized_keys

第四步,初始化Git仓库:
选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

git init --bare sample.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

chown -R git:git sample.git (设置该所属组) (不能在ROOT下,不然克隆路径不对,权限不够)

第五步,禁用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 [email protected]:/srv/sample.git

Cloning into ‘sample‘...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。

在客户端添加你的名字和Email地址

git config --global user.email "[email protected]"

# git config --global user.name "wing"

第七步 推送 推送之后才能在仓库查看 (客户端)
[[email protected] gittest4]# git push -u origin master
[email protected]‘s password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 213 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/gittest3/teslaProject.git

  • [new branch] master -> master
    分支 master 设置为跟踪来自 origin 的远程分支 master。

第八步 在仓库端 创建一个目录克隆下来就可以查看了
#git clone [email protected](可以主机名):/srv/sample.git

以上是关于git的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段15——git命令操作一个完整流程

如何管理在每个 git 版本中添加私有代码片段?

使用 Git 来管理 Xcode 中的代码片段

markdown Git代码片段

GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段

GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段