<架构师必修课>-git

Git

1 git概述

git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型地各种项目

git占用资源小,具有廉价地本地库,性能优于CVS、等版本控制工具

版本控制是一种记录文件内容变化,以便能够查阅任意版本

公司内部需要版本控制,个人开发过渡到团队开发

集中式版本控制工具

缺点:中央服务器单点故障

分布式版本控制工具

远程服务器宕机,也不会影响代码本地地版本控制

git历史

git和linux都是linux开发的,linux开发成功后就开源了,开源后的linux受到了很多软件开发者的青睐,很多大牛都贡献了自己的代码,在1991年到2002年这十余年时间里,linux本人都是手动合并代码,但是随着linux用户的日益增加,代码越来越多,linux本人的精力有限,2002年bitkeeper授权给linux社区免费使用,bitkeeper是商业软件,由于人道主义精神,授予linux社区免费使用三年,并且明确指出在使用期间不允许对软件进行破解,但是程序员都有很强的好奇心,bitkeeper这个版本控制这么好用,不由得让一些程序员想研究他的底层代码,终于有一天linux社区的一位大牛破解了这个软件,破解就破解了,还在各大论坛上说自己破解了bitkeeper,搞得bitkeeper收回了使用权。

linux想了想,自己不能受制于人,于是花了两周的时候开发了git,一个月后,linux操作系统的版本控制由git进行管理。

林大神就是如此牛逼,让晚辈佩服的五体投地。

git 工作机制

工作区 : 存放代码的文件夹

git add

暂存区: 工作区代码添加到暂存区

git commit

本地库: 暂存区代码提交到本地库

git代码托管中心

代码托管中心是基于网络服务器的远程代码仓库,远程库

  • 局域网
    • GitLab
  • 互联网
    • GitHub
    • Gitee

2 git安装

git官网下载指定位数的安装包

3 git常用命令

查看版本

 $ git --version
git version 2.28.0.windows.1

设置用户签名

git config --global user.name myusername 
git config --global user.email myemail

签名的作用是区分不同的用户,用户的签名信息在每一个版本的信息中能够看到,通过签名信息确定本次提交是谁做的,git首次安装必须设置一下用户签名,否则无法提交代码。

用户签名与github等远程库的账号没有任何关系。

设置完成之后,在C盘下的Users下面的用户目录下,有一个.gitconfig文件夹,里面会出现相应的用户签名信息。

在这里插入图片描述

初始化本地库

在一个目录内使用git init 初始化本地库

git init 

查看本地库状态

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git status
On branch master (当前分支)

No commits yet (当前还没有提交任何东西)

nothing to commit (create/copy files and use "git add" to track)  (没有东西可以提交)

本地库新建一个文件

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ vim 1.txt

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ cat 1.txt
hello world

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        1.txt 

nothing added to commit but untracked files present (use "git add" to track)

本地文件添加到暂存区,开始版本控制

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git add 1.txt
warning: LF will be replaced by CRLF in 1.txt.
The file will have its original line endings in your working directory

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   1.txt

删除暂存区文件,不会删除本地库

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git rm --cached 1.txt
rm '1.txt'
z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        1.txt

nothing added to commit but untracked files present (use "git add" to track)

只是删除暂存区,并不会删除本地工作区内的文件

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ ll -a
total 9
drwxr-xr-x 1 z004abwh 1049089  0 Nov 24 20:33 ./
drwxr-xr-x 1 z004abwh 1049089  0 Nov 24 20:30 ../
drwxr-xr-x 1 z004abwh 1049089  0 Nov 24 20:38 .git/
-rw-r--r-- 1 z004abwh 1049089 12 Nov 24 20:33 1.txt

提交本地库,暂存区到本地库

git commit -m "日志信息" afilename 
z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git commit -m "first" 1.txt 
warning: LF will be replaced by CRLF in 1.txt.
The file will have its original line endings in your working directory
[master (root-commit) 4cc4211] first
 1 file changed, 1 insertion(+)
 create mode 100644 1.txt  (100644是git版本号)

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git status
On branch master
nothing to commit, working tree clean

查看提交的详细信息和精简信息

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git reflog
4cc4211 (HEAD -> master) HEAD@{0}: commit (initial): first

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git log
commit 4cc4211363f2ea507712903ee54d9108f2f0b6fb (HEAD -> master)
Author: zhaojianfei0820 <1032162439@qq.com>
Date:   Wed Nov 24 20:41:38 2021 +0800

    first


修改工作区文件

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ vim 1.txt

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   1.txt

no changes added to commit (use "git add" and/or "git commit -a")

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ vim 1.txt  修改文件

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git status 
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   1.txt

no changes added to commit (use "git add" and/or "git commit -a")

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git add 1.txt
warning: LF will be replaced by CRLF in 1.txt.
The file will have its original line endings in your working directory

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git commit -m "second" 1.txt
warning: LF will be replaced by CRLF in 1.txt.
The file will have its original line endings in your working directory
[master 551a67a] second
 1 file changed, 1 insertion(+), 1 deletion(-)

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git reflog
551a67a (HEAD -> master) HEAD@{0}: commit: second
4cc4211 HEAD@{1}: commit (initial): first

穿越回历史版本

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git reflog
551a67a (HEAD -> master) HEAD@{0}: commit: second
4cc4211 HEAD@{1}: commit (initial): first

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git reset --hard 4cc4211
HEAD is now at 4cc4211 first

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git reflog
4cc4211 (HEAD -> master) HEAD@{0}: reset: moving to 4cc4211
551a67a HEAD@{1}: commit: second
4cc4211 (HEAD -> master) HEAD@{2}: commit (initial): first

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ cat 1.txt
hello world

通过reflog命令查看历史版本号,通过reset命令回退到历史版本。

git reset --hard “版本号” 可以穿梭到前一个版本或者后一个版本。

git版本穿梭,底层就是移动head指针。

4 git分支操作

在版本控制中,同时推进多个任务,为每个任务可以创建每个任务的单独分支,使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行,分支可以简单理解为副本,一个分支就是一个单独的副本,分支的底层实现是指针的引用。

在这里插入图片描述

同时并行推进多个功能开发,提高开发效率。

各个分支在开发过程中,如果一个分支开发失败,不会对其他分支有任何影响,失败的话就直接删除掉。

查看分支

$ git branch -v
* master 4cc4211 first

创建分支

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git branch hot-fix

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git branch -v
  hot-fix 4cc4211 first
* master  4cc4211 first

切换分支

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (hot-fix)
$ git branch -v
* hot-fix 4cc4211 first
  master  4cc4211 first

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (hot-fix)
$ vim 1.txt

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (hot-fix)
$ git status
On branch hot-fix
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   1.txt

no changes added to commit (use "git add" and/or "git commit -a")

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (hot-fix)
$ git add 1.txt

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (hot-fix)
$ git commit -m "hot-fix first" 1.txt
[hot-fix ef4f32d] hot-fix first
 1 file changed, 1 insertion(+), 1 deletion(-)

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (hot-fix)
$ cat 1.txt
hello world  12345

把指定分支合并到当前分支上

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (hot-fix)
$ git checkout master
Switched to branch 'master'

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git merge hot-fix
Updating 4cc4211..ef4f32d
Fast-forward
 1.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ cat 1.txt
hello world  12345

代码冲突合并

当两个不同的分支分别修改同一文件,因为代码冲突,所以git是不会自动合并的,需要手动合并代码。

# 在主分支下修改1.txt 
git checkout master

vim 1.txt # 修改完成后保存

# 主分支提交暂存区
git add 1.txt 

# 提交本地库
git commit -m "master test" 1.txt

# 切换到hot-fix分支
git checkout hot-fix 

# hot-fix分支下修改1.txt 
vim 1.txt  # 修改完成后保存
# hot-fix分支下提交到暂存区
git add 1.txt 
# 提交到本地库
git commit -m "hot-fix test" 1.txt


这时候切换回主分支

git checkout master 
# 在master分支上合并hot-fix分支代码
git merge hot-fix 
#Auto-merging 1.txt
#CONFLICT (content): Merge conflict in 1.txt
#Automatic merge failed; fix conflicts and then commit the result.
# git提示有冲突


这时候要手动解决冲突,在主分支下修改1.txt

hello world  12345
<<<<<<< HEAD  # 主分支
test master h


=======       # 主分支结束位置
hot-fix h    
>>>>>>> hot-fix # hot-fix分支

手动编辑文件,删除相应的标记和想要保存的代码

$ cat 1.txt
hello world  12345
test master h
hot-fix h

修改后在主分支再次提交到暂存区

git add 1.txt 
z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master|MERGING)
git commit -m "final test" 1.txt
fatal: cannot do a partial commit during a merge.
# 提交本地库时不能添加文件名 
git commit -m "final test" 

# 这时切换回hot-fix分支发现不会变更
z004abwh@md1wj4bc MINGW64 /d/coder/git demo (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (hot-fix)
$ cat 1.txt
hello world  12345
hot-fix h

5 git团队协作机制

5.1 本团队协作

5.2 跨团队协作

在这里插入图片描述

6 Github操作

Github网址:https://github.com/

全球最大的同性交友网站。新世界大门

创建远程仓库

使用github用户名密码登录github,创建仓库即可,这里不做过多声明

创建远程仓库别名

一般远程地址都是一个比较长的url,很难记忆,可以给远程地址起一个别名。

git remote -v # 查看当前所有远程地址别名
git remote add 别名 远程地址 # 给远程地址创建别名

本地仓库代码推送到远程仓库

git push 别名/url 分支名

拉取远程库到本地库

git pull 别名/url 分支名

克隆远程仓库到本地

git clone url 
# 1 拉取代码
# 2 初始化本地库
# 3 创建别名

邀请开发者

打开github代码仓库,添加协作开发者。如果不添加开发者,就不能往仓库push代码。

多团队协作开发

团队A:创建一个仓库git-demo

团队B:fork这个仓库到团队B的git-demo

团队B:修改代码并提出pull request

团队A:收到request ,检查代码,如果代码没有问题,执行merge操作

SSH免密登录

z004abwh@md1wj4bc MINGW64 /d/coder/git demo (hot-fix)
$ ssh-keygen -t rsa -C 1032162439@qq.com
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/z004abwh/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/z004abwh/.ssh/id_rsa
Your public key has been saved in /c/Users/z004abwh/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:QjglGGEMeMBF/bXrZO72GuZJurCM7FfuRIMjPNNFdpE 1032162439@qq.com
The key's randomart image is:
+---[RSA 3072]----+
|=+**o .o oo      |
|.o+  =o .E       |
| .  o o.. .      |
|  . .oo. .       |
|   = +.oS .      |
|    + oo.+       |
|     .o.=+       |
|  . o.+.=+o      |
|  .+.o.++=o.     |
+----[SHA256]-----+

将公钥添加到github账号中

使用ssh链接测试pull和push

7 GitLab

官网地址: about.gitlab.com

安装gitlab

参考官网

自定义安装脚本 vim gitlab-install.sh

sudo rpm -ivh /opt/module/gitlab-ce-13.10.2-ce.0.e17.x86_64.rpm

sudo yum install -y curl policycoreutils-python openssh-server cronie

sudo lokkit -s http -s ssh 

sudo yum install -y postfix 

sudo chkconfig postfix on 

curl https://package.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash 

sudo EXTERNA_URL="http://gitlab.example.com" yum -y install gitlab-ce 

给脚本增加执行权限

chmod +x gitlab-install.sh

初始化gitlab服务

gitlab-ctl reconfigure

启动gitlab服务

gitlab-ctl start 

# 如需停止
gitlab-ctl stop 


通过浏览器登录gitlab

gitlab默认使用root密码,先修改密码,然后登录,主界面与github大致相同,可以创建远程仓库

8 Pycharm Idea 集成git

IDE具有集成git功能,也可以集成github,gitee,gitlab等

由于天朝网络原因,国内建议使用gitee。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kobe_OKOK_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值