git基本操作

学习来源https://doc.houdunren.com/git/1%20%E6%8E%8C%E6%8F%A1GIT.html#%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE

安装git

官网:https://git-scm.com/https://gitforwindows.org/

安装过程略过,百度一堆

安装后通过以下命令查看,如果显示版本号那就是安装成功了

git --version

配置作者信息

桌面单击右键选择 Git Bash Here,

cd回车到根目录

cd  //回到根目录

新建 git文件夹

mkdir git

使用cd 切换到git目录

cd git

配置自己的信息

邮箱和名称

git config --global user.email "12345678@qq.com"
git config --global user.name "zimo"

接着回到根目录(Ctrl+L键是清理屏幕)

cd 

查看配置成功与否

(前提是已经安装Sublime Text软件,且配置了系统变量)

subl .gitconfig

回到git目录,新建一个edu文件夹,并且进入

mkdir edu
cd edu

查看当前路径

pwd

查看目录下文件

ls
仅罗列出当前目录下的文件名或目录名

ls

ls -a
列出目录下的所有文件,包括以 . 开头的隐含文件。

ls -a

ls -l (等价于ll)
列出文件的详细信息。

ls -al (等价于ll -a)
显示当前目录下的所有文件及文件夹包括隐藏的.和…等的详细信息

回退指令

返回上一层目录

cd ..

cd -返回到上一次的工作目录。

基础流程

创建仓库

git init  //在任意目录下创建仓库

克隆仓库

在git目录下

git clone xxxxxxxx.xxx (github地址)

git流水线分析

git就是一个仓库,例如现实中一个服装厂仓库,我们把做好的服装放到仓库里。

现实中:【做好的服装】	=====> 【工人用手放到推车】 ====> 【 用推车放到 】  ====>【服装仓库】
程序员:【写好的代码】 =====> 【   git add    】 ====> 【 git commit】  ====>【git仓库】

有时候需要改动服装(文件),那么就需要查看生产车间的状态是怎么样的 ===> 使用git status 查看状态	
ps:小推车在git中也叫做暂存区

练习git流水线

git目录下新建一个文件夹hd

mkdir hd		 // 创建hd文件夹
cd hd			 // 切换目录到cd
git init  		 // 初始化空的仓库

使用touch命令新建空白文件

touch a.php      		 	 // 新建空白文件
git status 		 		 	 // 查看状态,发现 a.php文件是未跟踪状态,即没有被版本库提交过
git add 		 		 	 // 放到小推车里
git commit -m 'xxx' 		 // 推送到本地仓库并且添加描述
此时 git status没有异常, 生产车间状态和仓库的文件是一摸一样的,不需要再把车间文件放到仓库

多个文件一并提交

git add . 	// 会将未跟踪的所有文件提交到暂存区(推车里)

.gitignore详解控制版本库文件管理

git下新建目录 shop

mkdir shop
cd shop
subl .gitignore 		// 使用subl 新建.gitignore文件并打开,这里面能够配置哪些文件需要提交
touch a.txt 			// 使用touch 新建文件
git status				// 此时可以看到 .gitignore 和 a.txt文件未提交到暂存区
在.gitignore文件中 写入 *.txt // 此时看不到 a.txt文件未提交到暂存区
mkdir vendor 			
git status				// 发现未跟踪列表没有vendor文件夹(因为不会跟踪空白文件)

.gitignore 文件如下

# 该文件是存放不提交到仓库的文件

# 所有txt文件都检测不到 除了a.txt
*.txt
!a.txt

# 提交时检测不到vendor文件夹及子文件夹所有的php文件
/vendor/**/*.php

# 提交时检测不到该文件夹下所有内容
# /vendor

从版本库中删除资源的技巧

git下新建目录 bbs

mkdir bbs
cd bbs
git init
touch a.txt
git status
git add .
git commit -m '版本1'
git rm a.txt 			// 会同时删除版本库和本地的文件
touch readme.txt
git add .
git commit -m '版本2'	

有时候有很多文件放到版本库,其实没有必要,也就是本地需要保留,版本库不需要放入
git rm --cached readme.txt    // 移除的是版本库的文件,本地该文件依然保留着

从版本库中修改资料名称

touch c.php
git add .
git commit -m '版本1'
git mv c.php zimo.php  		// 改名
git status
git commit -m 'c.php 改名为 zimo.php'
git status
git log --name-only

使用log日志查看历史操作行为

git下新建目录 hd

mkdir hd
cd hd
git init
touch a.php 
git add .
git commit -m '提交a.php版本1'
touch b.php
vim a.php			// 打开vim编辑器 按i 输入文字
输入zimo.com 文字
cat a.php 			// 查看编辑的内容
git add .
git commit -m '将新增b文件和更新后a文件提交'
git log				// 查看日志 (包含每次提交的唯一哈希值、作者、时间、描述等)
git log -p 			// 查看详细日志(包含更新的内容)
git log -p -1   	// 查看最近的一次提交
git log --oneline	// 查看简短日志 (git log --oneline -p等同于git log -p)
git log --name-only 	// 查看文件发生的变化
git log --name-status 	//查看文件具体发生了什么类型(新增,删除等)变化

使用amend修改最新一次提交事件

git下新建目录 zz

mkdir zz
cd zz
git init
git log
touch a.php
git add .
git commit -m '第一次提交a.php'
git log 		// 发现描述不具体
git commit --amend		// 打开vim编辑器,修改刚才的描述 zimo的第一次提交a.php
git log
touch b.php 		// 有时候想将另一个文件也放到这次提交里面
git add .
git status
git commit --amend		// 添加一行描述 增加b.php a.php
git status 				
git log --name-only 	// 看到新提交了两个文件

管理暂存区中的文件

git下新建目录 xj

mkdir xj
cd xj
git init
ls -a
touch a.php					// 文件放入暂存区
git add .
git rm --cached a.php		// 撤销文件放入暂存区
vim a.php 					// 编辑一下a.php文件
git status
git add a.php				
git status 	// 此时发现文件已经在暂存区了,此时如果后悔和之前第一次不一样
git reset Head a.php		// 这样可以取消放入
cat a.php					// 查看文件内容 里边的内容还是之前编辑那样
git checkout a.php 			// 恢复到仓库提交的初始状态
cat a.php					// 此时文件内没有内容

alias命令别名提高操作效率

之前敲提交需要:
git add . git commit-m '' 每次都比较麻烦
git config --global alias.a add  // 以后git a . 等价于 ait add .
subl .gitconfig				// 在根目录执行 查看全局配置文件 可以看到[alias]下有 a = add ,此时可以直接在这里编辑想改的代码

// 比如我改成如下
[alias]
	a = add . 
	c = commit
	l = log
	s = status

// 回到xj仓库目录
touch z.php
git s
git a
git s
git c			// 会打开vim 第一行写上描述保存退出即可
git l

Git分支

详解Git分支Branch存在的意义

[ ]是提交的版本

	  其他功能分支a ---[ ]---[ ]
	 /						 \
	/						  \
---[ ]---[ ]---[ ]--- master主分支---------->
	\							   /
     \							  /
	 其他功能分支b ---[ ]---[ ]---[ ]

实例讲解分支branch基本管理操作

git下新建目录 fz

mkdir fz
cd fz
git init
git branch 		// 此时查看分支是查看不到任何分支
touch xj.php
git add .
git commit -m '提交xj.php'
git branch			// 此时会看到一个主分支 * master,*星号代表当前所在的分支
git branch ask  	// 创建一个ask分支
git branch			// 此时可以看到主分支 *master和branch 分支
git checkout ask 	//切换分支到ask
touch ask.html
git add .
git commit -m '提交ask.html'
ls					// 可以看到俩文件 ask.html 和 xj.php
git checkout master 
ls 					// 此时切换分支回master后仅看到 xi.php

git checkout -b bbs  // 创建并且切换到bbs分支

分支的合并与删除

git checkout master     // 假如当前产品问答功能已经做好,需要切换到主分支
git merge ask  			// 将ask分支的所有提交合并到主分支上
git branch -d ask		// 删除分支

分支冲突实例解决

一个资源被不同的分支所共同修改了,在合并的时候会产生冲突

git下新建目录 ct

mkdir ct
cd ct
git init
vim xj.php    		 // 使用vim任意新建一个文件,内容冒号 :
git commit -m 'master提交xj.php'  
git branch ask		 // 创建ask分支
git checkout -b bbs  // 创建并切换到bbs分支
ls 			// 能够看到包含了之前master提交的xj.php文件(因为是从主分支的提交点后创建的ask和bbs分支,因此也拥有主分支提交的文件)
vim xj.php   // 此时内容是 : 将其改为bbs
git add .
git commit -m 'bbs提交xj.php'
git checkout ask
vim xj.php	// 此时内容是 : 将其改为ask
git add .
git commit -m 'ask提交的xj.php'

git checkout master // 切换回主分支
git merge bbs		// 合并bbs分支
cat xj.php 	   		// 可以看到内容是 bbs
git merge ask 		// 此时合并ask分支将会报错 Merge conflict in xj.php

subl xj.php		   // 打开xj.php,可以看到结构如下

<<<<<<< HEAD
bbs
=======
ask
>>>>>>> ask

// 直接将内容改为这样保存
bbs
ask

git add .  			// 此时再提交即可
git commit -m '修复合并提交xj.php'

分支管理merged及分支强制删除

git branch --merged 	// 查看已经合并的分支
git checkout -b test	// 新建并切换到分支test 
git checkout master 	// 切换到主分支
git branch --merged 	// 可以看到ask、bbs已经和master分支合并
git checkout test
touch mm.php	
git a
git commit -m 'test提交mm.php'
git checkout master
git branch --no-merged		// 查看没有合并的分支
git branch -d test			// 删除分支 test 会有提示
git branch -D test    		// 直接删除分支

标准的分支操作工作流

master 被称为:稳定分支
	一般从master分出develop分支
		然后从develop分出ask分支
		此时我和张三是ask分支新增模块的开发者,就将这个分支拉到本地
		假如我负责登录页面,然后我可以在本地创建ui或者其他分支,等写好功能后合并到ask
		假如张三负责后台页面,他可能会本地创建ht或者其他分支,等写好功能后合并到ask
			然后将ask分支合并到develop分支
			

stash临时存储区实例讲解

主要解决:临时需要切换分支,但是当前分支不想提交,我们可以将其暂时存储起来

mkdir ns
cd ns
git init
touch master.php
git add .
git commit -m '提交master.php'
git branch ask
git branch bbs
git checkout ask
git branch
可以看到当前有三个分支
		* ask
 		  bbs
		  master
touch ask.php
git add .
git commit -m 'ask提交ask.php'
vim ask.php
	 // 内容里添加ask.php 保存退出,注意该文件已经commit一次了
git add .
git status   // 可以看到添加暂存区成功
	On branch ask
	Changes to be committed:
  	(use "git restore --staged <file>..." to unstage)
        modified:   asd.php
// 此时想切换到bbs分支将会提示
git checkout bbs
// error: Your local changes to the following files would be overwritten by checkout:
        asd.php
// Please commit your changes or stash them before you switch branches.
Aborting
// 会提示如果切换分支会覆盖文件,因此不允许切换其他分支
// 因此可以把当前文件放到临时存储区
git stash
git stash list   // 可以查看临时存储区的列表
git checkout bbs // 然后可以切换分支
git checkout ask	// bbs分支忙完后切换回ask
git stash apply 	// 恢复临时存储区的文件
git stash list   	// 当然临时存储区里文件依然存在的
git stash drop stash@{0}  // 不想要的话可以删除
git stash list		// 此时临时存储区为空
git stash			// 再来放到临时存储区暂存一下

// 如果想把临时存储区直接删除为空可以使用:
git stash pop

// 将文件库提交一次
git add .
git commit -m '提交asd,master'

touch xj.php      
// 因为还没有放进暂存区,此时执行临时存储区是不会操作的
git stash		//No local changes to save
git add .
git stash		// 需要文件放入暂存区后再执行
touch ns.php	// 再新增一个
git add .
git stash
git stash apply stash@{1} // 可以恢复第一个文件
git stash apply stash@{2} // 可以恢复第二个文件

使用TAG标签声明项目阶段版本

git tag  // 显示当前TAG列表
git tag v1.0

生成zip代码发布压缩包

mkdir TAG
cd TAG
git init
touch tag.txt
git add .
git commit -m 'test'
			// 'tagcms/'表示压缩之后的文件叫'tagcms'
git archive master --prefix='tagcms/' --forma=zip > tagcms.zip

使用系统别名定义git全局指令

cd  // 回到根目录
ls -a   // 找到.bash_profile ,我没找到新建了一个

// 使用subl打开该文件
subl .bash_profile

// 输入以下内容
alias gs="git status"
alias gc="git commit -m "
alias gl="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
alias gb="git branch"
alias ga="git add ."
alias go="git checkout"

// 关闭当前git窗口,重新打开一个git窗口就可以使用刚才配置的命令

合并分支产生的实际问题演示

mkdir ys
cd ys
git init
touch master.php
ga
gc 'master提交master.php'
go -b ask
gb				// 此时已经在ask分支上
touch ask.php
ga
gc 'ask提交ask.php'
gl  		// 查看到文件的提交信息
go master	// 切换分支
git merge ask  // 合并ask,可以看到Fast-forward快速合并关键词
gl 			  // 查看日志 
 * a9c1c63 - (HEAD -> master, ask) ask提交ask.php (5 minutes ago) <2022zimo>
 * 1ac517b - master提交master.php (17 minutes ago) <2022zimo>

//当前分支如下
	 			                ask分支-[提交ask.php]
	 			     		   /		       \
				    		  /			        \
--master主分支--[提交master.php] ---------------[合并]>
	 

// 另一种情况
cd ..
mkdir ys2
cd ys2
git init
touch master.php
ga
gc 'master commit'
gl   	 // 查看日志 看到是初次提交
* 12e27d9 - (HEAD -> master) master commit (5 seconds ago) <2022zimo>

go -b ask
touch ask.php
ga
gc 'ask commit'
go master // 切换到master
touch m2.php
ga
gc 'm2 commit'
git merge ask  	  // 合并描述任意打字

gl 				  // 查看日志 如下:
*   42cf081 - (HEAD -> master) zimo Merge branch 'ask' (2 minutes ago) <2022zimo>
|\
| * b9dff47 - (ask) ask commit (20 hours ago) <2022zimo>
* | 7f0e6fe - m2 commit (20 hours ago) <2022zimo>
|/
* 12e27d9 - master commit (20 hours ago) <2022zimo>


//当前分支如下
--master主分支--[提交master.php]--[提交m2.php]--[合并]--->				   			\					   /
	  						 \					 /		 
	 						 ask分支-[提交ask.php] 

rebase合理的优化分支合并

// 以上可知,主分支提交一个文件后,并分出去一个分支后,如果没有新的提交没有commit记录,在合并分支时候就不会有合并的记录
// rebase就是先将子分支提交记录存起来看不见,然后将子分支的提交点移动到主分支最新的提交点,然后将子分支的动作恢复与主分支进行合并
// 如果在其他开源项目提交一些操作的时候先走一下rebase

cd ..
mkdir re
cd re
git init
// 主分支提交一次
touch master.php
ga
gc 'master commit'
gl
* 691006b - (HEAD -> master) master commit (3 seconds ago) <2022zimo>
// 然后切换到子分支 ask,创建文件提交一次
go -b 'ask'
touch ask.php
ga
gc 'ask commit'
gl  		// 此时子分支能看到俩条记录
* f83df17 - (HEAD -> ask) ask commit (9 seconds ago) <2022zimo>
* 691006b - (master) master commit (3 minutes ago) <2022zimo>

// 回到主分支 
go master
touch m2.php
ga
gc 'm2 commit'

// 此时因为主分支往前走了一个提交,如果合并分支会产生合并记录
go ask
gl
git rebase master
gl				// 可以看到将子分支的提交( ask commit)放到主分支最新提交( m2 commit)的后边了
* 6a89788 - (HEAD -> ask) ask commit (14 seconds ago) <2022zimo>
* 9d3435c - (master) m2 commit (3 minutes ago) <2022zimo>
* 691006b - master commit (9 minutes ago) <2022zimo>
go master
gl
git merge ask
gl				// 日志非常干净
* 6a89788 - (HEAD -> master, ask) ask commit (4 minutes ago) <2022zimo>
* 9d3435c - m2.php (7 minutes ago) <2022zimo>
* 691006b - master commit (12 minutes ago) <2022zimo>

国内与国外项目托管平台介绍

使用github创建仓库
https://github.com/

xEAHJO.png

SSH与GITHUB远程无密码连接

生成秘钥
使用 ssh 连接 Github 发送指令更加安全可靠,也可以免掉每次输入密码的困扰。

在命令行中输入以下代码(windows 用户使用 Git Bash)
// ssh-keygen -t rsa
一直按回车键直到结束。系统会在~/.ssh 目录中生成 id_rsa和id_rsa.pub,即密钥id_rsa和公钥id_rsa.pub。

打开 id_rsa.pub,复制密钥,点击github头像,再点击设置

xEALSe.png

点击new ssh key

xEEmT0.jpg

向 GitHub 添加秘钥
点击 New SSH key 按钮,添加上面生成的 id_rsa.pub 公钥内容。

然后就能使用ssh链接直接拉取代码文件了。

xEAbWD.png

git clone git@github.com:wuzimo666/demo.git
cd demo

// 拉取到本地后,假如你新提交了文件,这时文件还在本地
touch zimo.zimo.com
git add .
git commit -m 'test'
// 当你想提交给远程,此时需要使用:
git push

xEEewq.png

xEAxeI.png

此时发现远程仓库中多了刚才提交的文件

本地版本使用remote与GITHUB关联

// github新建一个仓库zimo

mkdir test
cd test
git init
subl README.MD  // 内容随意
git add .
git commit -m 'first commit'
subl README.MD // 打开readme将以下代码写入
git remote add origin git@github.com:wuzimo666/zimo.git 
// 添加远程仓库与远程进行关联,可以像服务器推送代码
git remote add origin git@github.com:wuzimo666/zimo.git (自己的ssh仓库地址)
git remote -v // 查看远程仓库
git push -u origin master // 推送数据到远程仓库

// 此时刷新github仓库可以看到有README.MD文件

本地分支与github远程分支同步

// 接上边,当前能够看到仓库只有一个master分支

xEAjOA.png

git branch -a  // 查看远程分支,远程分支会用红色表示出来

// 在本地新建一个分支并切换  ask
git checkout -b ask
touch ask.html
git add .
git commit -m 'ask commit' 
git push // 此时会出现错误 (大意是:当前的分支没有与远程的分支进行关联) 可以使用以下代码:
git push --set-upstream origin ask  // 此时仓库中能够看到多了一个ask分支

新入职员工参与项目开发时分支使用

// 场景:公司当前项目有个功能正在开发,新建了一个ask分支,我新来公司,经理也把我归纳到该开发小组里。所以我需要将代码拉到我的电脑里

// 来到根目录 克隆仓库里代码
git clone git@github.com:wuzimo666/zimo.git
cd zimo
git branch				 // 可以看到当前在且仅有master分支
git branch -a
git pull origin ask:ask  // 请求远程,把ask分支请求到本地里,因为本地目前是master分支
git checkout ask		// 此时就把需要开发的ask分支拉取到本地了

// 模拟开发工作
// 创建文件
touch index.php
touch hello.asp
git add .
git commit -m 'zimo first commit' 
git push // 此时会出现错误 (大意是:当前的分支没有与远程的分支进行关联) 可以使用以下代码:
git push --set-upstream origin ask  // 此时仓库中ask分支能够看到多了俩文件: index.php hello.asp

github远程分支的合并

// 当前功能开发完成,线上需要把ask分支合并到master,然后删除ask分支
git checkout master 
git pull 		    // 把master更改成最新的状态
git checkout ask
git rebase master   // 将ask分支的起始点移动到master的最新点上 
git checkout master
git merge ask
git push 			// 推送到远程
git branch --merged // 查看合并的分支

远程分支删除操作

// 接上方 直接使用
git push origin --delete ask
git branch -a
git branch -d ask 		// 删除本地的ask分支
git branch

自动部署之流程分析与创建WEB站点

github服务器  --------	 运行网站代码的服务器   
	\
	  \		
	   本地生产的代码	

GITHUB自动部署到WEB服务器