赞
踩
Git是一个分布式版本控制系统,由Linus Torvalds为Linux内核开发而创建。它允许开发者跟踪和管理代码的变更,并支持多人协作。作为服务系统,Git被广泛使用于各种软件开发项目中,其中最著名的应用实例就是GitHub平台。
Git的主要功能包括:
Git专注于文件的整体变化,并将每次提交的文件保存为快照,使用SHA-1算法确保数据完整性。其主要操作包括:
GitHub是一个以Git为基础的开源及私有软件项目托管平台。它为用户提供了创建和管理Git仓库的空间,是全球最大的开源代码社区之一,拥有超过140万开发者用户。GitHub的特色在于简化了项目分叉(fork)和代码贡献(pull request)的过程,使得为项目贡献代码变得异常简单。
GitLab是一个基于Git的开源项目管理软件,它不仅提供代码管理功能,还构建了完整的Web服务平台。GitLab支持在群组(group)和项目(project)两个层级上管理代码和文档,其中群组可以包含多个项目,而每个项目又可包含多个分支。作为一个一站式DevOps平台,GitLab旨在加速和优化软件开发的整个生命周期。
总结而言,Git作为一个强大的分布式版本控制系统,为软件开发提供了坚实的基础。而GitHub和GitLab等平台则进一步拓展了Git的功能,为全球开发者社区提供了便捷的代码托管、协作和管理服务。
集中式版本控制系统,例如SVN(Subversion),将代码库存储在单一的中央服务器上。团队成员通过客户端连接到这个中央服务器来获取代码和提交更改。这种方式使得所有开发者都在同一个代码库上工作,且必须与服务器通信才能访问历史记录和获取当前代码。因此,任何服务器故障或网络中断都可能导致数据丢失和开发工作中断。
分布式版本控制系统,如Git,会在每个开发者的本地计算机上创建完整的代码库副本。这使得每个开发者都能在无网络连接的情况下继续工作,并能在本地执行代码的修改和提交。随后,这些更改可以被推送到其他开发者的副本中。在DVCS中,每个客户端同时充当服务器的角色,拥有自己的代码库和历史记录,允许独立工作和多分支开发。尽管没有固定的版本号,但每个提交都有一个唯一的哈希ID,用于回滚操作。此外,存在一个主仓库(例如master),其版本号只在合并时迭代。
在Linux系统中,可以通过简单的命令来安装Git。例如,在基于Red Hat的系统中,可以使用以下命令安装Git:
yum -y install git
安装完成后,通过输入`git`命令,可以查看到Git的选项和参数,这表明Git已成功安装并可以使用。
接下来,我们需要对Git环境进行基本配置,主要包括用户名和邮箱的配置,这样可以标识每次提交的作者信息:
git config --global user.name "admin" # 配置用户名
git config --global user.email "WYY123456@qq.com" # 配置邮箱
这里使用了`--global`参数,表示这些配置将应用于该用户的所有Git仓库。
1. 首先,在工作目录(工作区)中修改文件。
2. 修改完成后,使用`git add .`命令将已修改文件快照保存到暂存区域。
3. 通过`git commit -m ""`命令将保存在暂存区的文件快照提交到版本库。
4. 使用`git log`命令可以查看提交历史。
具体操作示例
首先创建一个空目录,然后在空目录中初始化(init)一个新的Git仓库:
mkdir /test # 创建一个空目录
cd /test # 进入目录
git init # 初始化为Git仓库
ls -a # 查看包括隐藏文件在内的所有文件,可以看到.git目录已创建
接下来,我们创建一个新文件,并将其添加到本地仓库:
touch test.c # 创建一个新的文件
git add test.c # 将文件添加到缓存区
git commit -m "add new file 'test.c'" # 提交文件到仓库,-m 参数用于添加提交信息
提交完成后,使用`git log`可以查看提交的历史记录,每次提交都会生成一个唯一的40位哈希ID,作为提交的标识。
1. 工作目录:这是开发者直接操作的目录,可以包含各种文件和子目录。在这个目录中进行文件的添加、修改和删除操作。
2. 暂存区:这是工作目录和版本库之间的一个中间状态。执行`git add`命令后,已修改的文件会被添加到暂存区,等待被提交。
3. 版本库:这是实际存储所有提交历史记录的地方。每当执行`git commit`命令时,暂存区的内容会被提交到版本库,形成一个新的提交记录。版本库维护着项目的完整历史,允许开发者回溯和检查历史版本。
在Git中,分支是指向提交的指针,这些提交被组织成一条时间线。默认情况下,Git有一个主分支,通常被称为`master`分支。在Git中,`HEAD`指针实际上指向当前分支的最新提交,而这个分支(如`master`)则指向具体的提交对象。因此,`HEAD`指向当前分支,确定了代码的当前状态和位置。
1. 确认当前分支: 首先确保你在主分支上工作,通常是`master`或`main`。可以通过以下命令切换回主分支:
cd /test # 进入到你的项目目录
git checkout master # 确保在主分支上
git branch feature-branch # 创建名为"feature-branch"的新分支
git checkout feature-branch # 切换到"feature-branch"分支
使用`git branch`命令可以查看当前所有分支及当前所在的分支(前面带有*号)。
或者,可以使用单一命令创建并切换到新分支:
git checkout -b feature-branch # 创建并切换到新分支
git checkout master # 切换回主分支
git merge feature-branch # 将"feature-branch"合并到主分支
如果合并过程中出现冲突,Git会在文件中标记出来,需要手动解决这些冲突后重新提交。
git branch -d feature-branch # 删除"feature-branch"分支
强制删除未合并的分支(谨慎使用):
git branch -D feature-branch
当在Git中合并两个分支时,如果这些分支对同一个文件的同一部分进行了不同的更改,就可能会出现分支冲突。解决这种冲突需要一些手动干预和对Git命令的熟练运用。
git checkout -b y123
vim test.c
git add test.c
git commit -m "yy"
3. 切换回主分支并进行更改: 接下来,切换回主分支(通常是`master`),在主分支上进行不同的更改并提交:
git checkout master
vim test.c
git add test.c
git commit -m "hh"
git merge y123
这会提示`自动合并失败,修正冲突然后提交修正的结果`。
<<<<<<< HEAD
(主分支的内容)
=======
(新分支的内容)
>>>>>>> y123
你需要决定保留哪些更改,删除Git添加的标记,然后保存文件。
git add test.c
git commit -m "zuizhong"
git branch -d y123
如果要强制删除尚未合并的分支,可以使用`-D`参数代替`-d`。
在开发过程中,经常需要在多台机器之间同步代码库。这里我们以两台主机WYY1和WYY2为例,演示如何从WYY1拉取代码库到WYY2。
首先,在WYY2上生成SSH密钥对,并将公钥发送到WYY1,以便进行无密码访问。
[root@WYY2 ~] # ssh-keygen
[root@WYY2 ~] # ssh-copy-id root@192.168.33.11
安装Git软件,并准备一个目录用于存放克隆的代码库。
[root@WYY2 ~] # yum -y install git
[root@WYY2 ~] # mkdir /WYY2
[root@WYY2 ~] # cd /WYY2/
[root@WYY2 WYY2] # git init
使用`git clone`命令从WYY1上的仓库克隆到WYY2。
[root@WYY2 WYY2] # git clone 192.168.33.11:/test/.git
这将在WYY2的`/WYY2`目录下创建一个名为`test`的文件夹,里面包含从WYY1克隆过来的代码。
GitLab是一个基于Git的代码托管平台,可以为开发团队提供代码存储、版本控制和协作功能。以下是在WYY1上部署GitLab的基本步骤:
更新系统并安装所需的软件包,包括Git和其依赖环境。
[root@WYY1 ~] # yum -y install git curl openssh-server postfix cronie policycoreutils-python
下载GitLab的RPM安装包并安装。
[root@WYY1 ~] # wget --content-disposition https://some-gitlab-mirror/gitlab-ce-X.Y.Z.el8.x86_64.rpm
[root@WYY1 ~] # rpm -ivh gitlab-ce-X.Y.Z.el8.x86_64.rpm
运行GitLab的配置脚本,并等待脚本执行完成,启动GitLab服务。
[root@WYY1 ~] # gitlab-ctl reconfigure
在浏览器中输入服务器地址(如:http://192.168.33.11),设置初始密码后登录。
登录后,在GitLab界面创建新项目,并在项目中创建主分支,添加文件,提交更改。
通过创建新的分支并进行更改,之后通过GitLab界面发起合并请求,将更改合并到主分支。
在WYY2上,通过Git命令克隆WYY1上GitLab中创建的项目。
[root@WYY2 ~] # git clone http://192.168.33.11/root/test.git
克隆操作完成后,可以查看项目内容,确保所有文件都已正确同步。
#!/bin/bash
# 系统性能监控脚本
# 时间
Time=$(date +"%Y-%m-%d %H:%M:%S")
# IP地址
ip=$(ifconfig ens32 | grep -w inet | awk '{print $2 }')
# 内存剩余空间
a=$(cat /proc/meminfo | grep -i avai | awk '{print $2 }')
free_mem=$(($a / 1024))
# 磁盘剩余空间
b=$(df | grep "/ $" | awk '{print $4 }')
free_disk=$(($b / 1024 / 1024))
# 已登录用户
users=$(who | wc -l)
# 当前进程数
procs=$(ps aux | wc -l)
warn="/root/warning"
mkdir -p $warn
if [ $free_mem -lt 1024 ];then
echo -e "${Time},内存剩余不足 1G!
当前内存剩余:
${free_mem}
主机 IP:${ip}" >> ${warn}/mem_warning
else
echo "${Time},内存剩余容量正常" >> ${warn}/mem_warning
fi
if [ $free_disk -lt 10 ];then
echo -e "${Time},磁盘剩余不足 10G!
当前磁盘剩余:
${free_disk}
主机 IP:${ip}" >> ${warn}/disk_warning
else
echo "${Time},磁盘剩余容量正常" >> ${warn}/disk_warning
fi
if [ $users -gt 3 ];then
echo -e "${Time},当前用户登录过多!
当前用户数:${users}
主机 IP:${ip}" >> ${warn}/user_warning
else
echo "${Time},登录用户正常" >> ${warn}/user_warning
fi
if [ $procs -gt 500 ];then
echo -e "${Time},进程数量过多!
当前进程数:${procs}
主机 IP:${ip}" >> ${warn}/procs_warning
else
echo "${Time},进程数正常" >> ${warn}/procs_warning
fi
#!/bin/bash
g='\e[1;32m'
e='\e[0m'
prin(){
echo -e "$1"
}
cpu_red(){
cpu_processor=`grep processor /proc/cpuinfo | wc -l`
cpu_number=`cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l`
cpu_core=`cat /proc/cpuinfo | grep "cpu cores" | sed -n '1p' | awk '{print $4 }'`
cpu_info=`cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c`
}
mem_red(){
total=`free -m | grep -v "Swap" | awk '{print $2 }' | sed -n "2p"`
used=`free -m | grep -v "Swap" | sed -n '2p' | awk '{print $3 }'`
free=`free -m | grep -v "Swap" | sed -n '2p'| awk '{print $4 }'`
shared=`free -m | grep -v "Swap" | sed -n '2p' | awk '{print $5 }'`
cache=`free -m | grep -v "Swap" | sed -n '2p' | awk '{print $6 }'`
}
print_cpu(){
cpu_red
echo -e "CPU 物理数: ${g}${cpu_number}${e}
CPU 内核数: ${g}${cpu_core}${e}
CPU 型号: ${g}${cpu_info}${e}"
if [[ ${cpu_core} == ${cpu_processor} ]];then
echo -e "超线程: ${g}支持${e}"
else
echo -e "超线程: ${g}不支持${e}"
fi
}
print_mem(){
mem_red
d="当前主机内存信息 总内存: ${g}${total} MB${e} 当前已用: ${g}${used} MB${e} 当前可用: ${g}${free} MB${e} 共享占用: ${g}${shared} MB${e} 缓存占用: ${g}${cache} MB${e}"
for i in $d; do
prin "$i"
done
}
print_cpu
print_mem
#!/bin/bash
clear
echo -e "\033[33m—————————————————————————————————\033[0m"
echo -e "|\e[2;12H\033[43;30m 这里是菜单 \033[0m\t\t|"
echo -e "\033[33m—————————————————————————————————\033[0m"
echo -e "|\e[36m1. 查看网卡信息 \e[0m\t\t\t|"
echo -e "|\e[34m2. 查看内存信息 \e[0m\t\t\t|"
echo -e "|\e[35m3. 查看磁盘信息 \e[0m\t\t\t|"
echo -e "|\e[32m4. 查看 CPU 信息 \e[0m\t\t\t|"
echo -e "|\e[33m5. 查看账户信息 \e[0m\t\t\t|"
echo -e "\033[33m—————————————————————————————————\033[0m"
echo
read -p " 请输入选项 [1-5] : " key
case $key in
1 )
ens=$(ifconfig | head -1 | awk -F':' '{print $1 }')
ip=$(ifconfig | head -2 | tail -1 | awk '{print $2 }')
run=$(ifconfig ens32 | head -1 | awk -F',' '{print $3 }')
echo -e " 网卡名称: $ens
IP 地址: $ip
启动状态: $run "
;;
2 )
a=$(free | grep Mem | tr -s " " | cut -d" " -f7)
mem=$(echo "scale=2; $a / 1024" | bc -l)
echo " 当前内存剩余容量: ${mem} M"
;;
3 )
b=$(df | grep / $ | tr -s " " | cut -d" " -f4)
disk=$(echo "scale=2; $b / 1024" | bc -l)
echo " 当前磁盘剩余容量: ${disk} M"
;;
4 )
cpu=$(uptime | tr -s " " | cut -d" " -f12)
echo " 本机 CPU 的 15 分钟的平均负载为: $cpu "
;;
5 )
login_num=$(who | wc -l)
total_num=$(cat /etc/passwd | wc -l)
echo " 当前系统登录账户: $USER "
echo " 当前登陆系统的账户数量为: $login_num "
echo " 当前系统中总用户数量为: $total_num "
;;
*)
echo " 您输入的序号有误,请重新输入! "
exit 1
;;
esac
#!/bin/bash
nginx="/usr/local/nginx"
pid="/usr/local/nginx/logs/nginx.pid"
case $1 in
start )
if [ -f $pid ];then
echo -e "\033[91mNginx 运行中...\033[0m"
exit 1
else
$nginx && echo -e "\033[32mNginx 已启动~\033[0m"
fi
;;
stop )
if [ ! -f $pid ];then
echo -e "\033[91mNginx 未运行!\033[0m"
exit 2
else
$nginx -s stop && echo -e "\033[32mNginx已停止!\033[0m"
fi
;;
restart )
if [ ! -f $pid ];then
echo -e "\033[91mNginx 未运行!\033[0m"
echo -e "\033[91m 请先启动 Nginx!
\033[0m"
exit 3
else
$nginx -s stop && $nginx && echo -e "\033[32mNginx 已重启!\033[0m"
fi
;;
status)
if [ -f $pid ];then
echo -e "\033[32mNginx 运行中...\033[0m"
else
echo -e "\033[91mNginx 未运行!\033[0m"
fi
;;
reload)
if [ ! -f $pid ];then
echo -e "\033[91mNginx 未运行!\033[0m"
exit 4
else
$nginx -s reload && echo -e "\033[32mNginx配置文件已重新载入 ...\033[0m"
fi
;;
*)
echo " 输入错误!格式: $0 [start|stop|restart|status|reload]"
;;
esac
#!/bin/bash
computer=$[RANDOM %3 + 1 ]
g='\e[1;32m'
e='\e[0m'
clear
echo -e " ${g} ————————————————————————————————— ${e} "
echo -e " ${g} #\t 石头剪刀布游戏 \t\t# ${e} "
echo -e " ${g} ————————————————————————————————— ${e} "
echo -e " ${g} # ${e} 请输入对应序号出拳 \t ${g} # ${e} "
echo -e " ${g} ————————————————————————————————— ${e} "
echo -e " ${g} # ${e} \t\033[33m1. 剪刀 \033[0m\t\t\t ${g} # ${e} "
echo -e " ${g} # ${e} \t\033[35m2. 石头 \033[0m\t\t\t ${g} # ${e} "
echo -e " ${g} # ${e} \t\033[31m3. 布 \033[0m\t\t\t ${g} # ${e} "
echo -e " ${g} ————————————————————————————————— ${e} "
echo
read -p " 请输入序号 [1-3] : " person
case $person in
1 )
if [[ $computer == 1 ]];then
echo -e " ${g} ————————————————————————————————— ${e} "
echo -e " ${g} |\t 您出:剪刀 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机:石头 \t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机赢! \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
elif [[ $computer == 2 ]];then
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 您出:剪刀 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机:剪刀 \t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 平局 ~\t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
elif [[ $computer == 3 ]];then
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 您出:剪刀 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机:布 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 恭喜,您获胜! \t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
fi ;;
2 )
if [[ $computer == 1 ]];then
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 您出:石头 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机:石头 \t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 平局 ~\t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
elif [[ $computer == 2 ]];then
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 您出:石头 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机:剪刀 \t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 恭喜,您获胜! \t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
elif [[ $computer == 3 ]];then
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 您出:石头 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机:布 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机赢! \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
fi ;;
3 )
if [[ $computer == 1 ]];then
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 您出:布 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机:石头 \t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 恭喜,您获胜! \t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
elif [[ $computer == 2 ]];then
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 您出:布 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机:剪刀 \t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机胜! \t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
elif [[ $computer == 3 ]];then
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 您出:布 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 计算机:布 \t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
echo -e " ${g} |\t 平局 ~\t\t| ${e} "
echo -e " ${g}
————————————————————————————————— ${e} "
fi ;;
*)
echo " 请正确输入出拳序号! "
exit 1
;;
esac
#!/bin/bash
RED_COL='\033[91m'
BLUE_COL='\033[34m'
NONE_COL='\033[0m'
red_balls=()
while true; do
clear
echo "--机选双色球 ---"
tmp=$[RANDOM %33 + 1]
if [[ " ${red_balls[*]} " =~ (^|[[:space:]])$tmp([[:space:]]|$) ]]; then
continue
fi
red_balls+=("$tmp")
echo -en " $RED_COL${red_balls[*]}$NONE_COL"
word=${#red_balls[@]}
if [ $word -eq 6 ]; then
blue_ball=$[RANDOM %16 + 1]
echo -e " $BLUE_COL $blue_ball$NONE_COL"
break
fi
sleep 0.5
done
clear
echo "红球号码:"
for i in {1..6}; do select_red_ball; done
echo "蓝球号码:"
select_blue_ball
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。