git基本操作
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/
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头像,再点击设置
点击new ssh key
向 GitHub 添加秘钥
点击 New SSH key 按钮,添加上面生成的 id_rsa.pub 公钥内容。
然后就能使用ssh链接直接拉取代码文件了。
git clone git@github.com:wuzimo666/demo.git
cd demo
// 拉取到本地后,假如你新提交了文件,这时文件还在本地
touch zimo.zimo.com
git add .
git commit -m 'test'
// 当你想提交给远程,此时需要使用:
git push
此时发现远程仓库中多了刚才提交的文件
本地版本使用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分支
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服务器