git操作

一 版本控制器

"""
完成 协同开发 项目,帮助程序员整合代码

软件:SVN 、 GIT

git:集群化、多分支
"""

1 工作流程图

2 空文件夹无法完成映射的解决方案:

或者

3 git本地工作逻辑:

可视化软件编辑代码或直接删除文件增加文件--》工作区(增删改的记录)--》暂存区--》版本库--》云端

1 工作区增加了一行代码,有了增加一行代码的记录--》提交到暂存区(工作区就没有这个增加的记录了)

2 暂存区有了增加了一行代码的记录--》提交到版本库(暂存区就没有这个增加一行代码的记录了)

3 版本库产生了一个新的版本(版本库最新的版本代表了该版本所有文件,以及文件内代码)

如果在工作区删除了这个装有刚才那行代码的文件--》并不影响版本库里面的最新版本的代码。

那么如何让版本库也删除那个装有哪行代码的文件呢?

1 工作区有删除的记录--》提交到暂存区(工作区就没有这个删除的记录了)

2 暂存区有删除一个文件的记录--》提交到了版本库(暂存区就没有这个删除代码的记录了)

3 版本库产生了一个新的版本(版本库最新的版本现在才删除了这个文件)

二 搭建本地git仓库

安装git

"""
1.下载对应版本:https://git-scm.com/download
2.安装git:在选取安装路径的下一步选取 Use a TrueType font in all console windows 选项
"""

将已有的文件夹作为git仓库

"""
>: cd 目标文件夹内部
>: git init
"""

在指定目录下创建git仓库

"""
>: cd 目标目录
>: git init 仓库名
"""

三 配置操作git的用户信息

1 当前仓库:局部

ps:局部如果有用户信息优先使用局部的

"""
>: git config user.name '用户名'
	-- 用户名
>: git config user.email '用户邮箱'
	-- 用户邮箱
	
注:在当前仓库下的config新建用户信息,只能在当前仓库下使用
"""

2 所有仓库:全局

"""
>: git config --global user.name '用户名'
>: git config --global user.email '用户邮箱'

注:在全局文件 C:\Users\用户文件夹\.gitconfig新建用户信息,在所有仓库下都可以使用
"""

四 常用指令(重点看)

1 查看仓库状态

"""
# 当仓库中有文件增加、删除、修改,都可以在仓库状态中查看
>: git status  
	-- 查看仓库状态
>: git status -s  
	-- 查看仓库状态的简约显示
"""

2 工作区操作

# 通过任何方式完成的文件删与改
# 空文件夹不会被git记录(解决方案见 标题 一.2)

3 工作区操作(撤销):改、删

对比的是版本库里的最新版本的基础上如果是原有文件的改 删 有效。

如果是该文件没有提交过版本的改 删 增则无效。

"""
>: git checkout .
	-- 撤销所有暂存区的提交
>: git checkout 文件名
	-- 撤销某一文件的暂存区提交
"""

4 工作区内容提交到暂存区

"""
>: git add .  
	-- 添加项目中所有文件
>: git add 文件名  
	-- 添加指定文件
"""

5 暂存区提交(撤销):add的逆运算

"""
>: git reset HEAD .
	-- 撤销所有暂存区的提交
>: git reset 文件名
	-- 撤销某一文件的暂存区提交
"""

6 提交暂存区内容到版本库

# git commit -m "版本描述信息"

五 回滚

1 撤销版本库提交:commit的逆运算

"""
注意!!!:先commit()再回滚,时刻关注线上线下的版本是否同步。如果开发着开发着崩了,那就先把这个崩了的版本commit()但是不push,然后回滚到线上最新的版本。
回滚暂存区已经提交到版本库的操作:
    查看历史版本:
        >: git log
        >: git reflog
    查看时间点之前|之后的日志:
        >: git log --after 2018-6-1
        >: git log --before 2018-6-1
        >: git reflog --after 2018-6-1
        >: git reflog --before 2018-6-1
    查看指定开发者日志
        >: git log --author author_name
        >: git reflog --author author_name
    回滚到指定版本:
        回滚到上一个版本:
            >: git reset --hard HEAD^
            >: git reset --hard HEAD~1
        回滚到上三个版本:
            >: git reset --hard HEAD^^^
            >: git reset --hard HEAD~3
        回滚到指定版本号的版本:
            >: git reset --hard 版本号
            >: eg: git reset --hard 35cb292
            
   ps:比如回滚到a版本意味着
   版本库新增一个a版本,a版本是最新版本git
   
   
"""

2 回滚的两种情况:

1) 完全回滚(推荐)

  • 没有新建文件的情况一定完全回滚(无论工作区还是暂存区的内容都会被清空)
  • 新建了文件但是commit了版本的情况也会完全回滚(推荐)

完全回滚就意味着工作区代码以及代码库完全恢复到回滚的版本(一点不差)

2) 不完全回滚

  • 只有新建了文件,没有提交过的情况才会发生不完全回滚,会保留该文件。

六 过滤文件

# .gitignore 文件
# 1)在仓库根目录下创建该文件
# 2)文件与文件夹均可以被过滤
# 3)文件过滤语法

""" 过滤文件内容
文件或文件夹名:代表所有目录下的文件或文件夹都被过滤
/文件或文件夹名:代表仓库根目录下的文件或文件夹被过滤
例如:
/z.txt  跟目录下的z.txt 过滤掉
/n   跟目录下的n文件或文件夹都过滤掉
z.txt 所有的z.txt 都过滤掉
n  所有的n 都过滤掉
/n/z.txt 根目录下的z.txt 过滤掉
n/z.txt  所有的n目录下的z.txt都过滤掉

"""

"""
.DS_Store # mac系统应该屏蔽掉的
.idea     # 屏蔽掉的
scripts
。。。尽可能多的写

"""

pycharm使用git

七 线上线下协同操作

1 源操作

"""
查看所有源
>: git remote

查看源信息
>: git remote -v

添加源
>: git remote add 源名 源地址
>: git remote add origin https://gitee.com/doctor_owen/luffy.git

删除源
>: git remote remove 源名
>: git remote remove origin
"""

2 选择线上仓库

"""
1.注册码云账号并登录:https://gitee.com/
2.创建仓库(课堂截图)
3.本地与服务器仓库建立连接
"""
"""
1)本地配置线上的账号与邮箱
>: git config --global user.name "doctor_owen"
>: git config --global user.email "doctor_owen@163.com"

2)在本地初始化仓库(git init),并完成项目的初步搭建(项目架构)(一般都是项目负责人完成项目启动)
# 这个过程就是git的基础部分的本地操作

3)采用 https协议 或 ssh协议 与远程git仓库通信提交提交代码(一般都是项目负责人完成)
	i) https协议方式,无需配置,但是第一次提交会验证管理员账号密码
	>: git remote add origin https://gitee.com/doctor_owen/luffy.git  # 配置远程源
	>: git push -u origin master  # 提交本地仓库到远程源
	
	ii) ssh协议,需要配置,配置完成之后就可以正常提交代码
	>: git remote add origin git@gitee.com:doctor_owen/luffy.git  # 配置远程源
	>: git push -u origin master  # 提交本地仓库到远程源
	
	iii)查看源及源链接信息
	>: git remote
	>: git remote -v
	
	iv)删除源链接
	>: git remote remove 源名字 
	
注:origin远程源的源名,可以自定义;master是分支名,是默认的主分支
"""

3 生成公钥(ssh协议方式)

"""
1.参考帮助文档:https://gitee.com/help/ 
	-- 仓库管理 => 公钥管理 => 生成/添加SSH公钥
	
>: ssh-keygen -t rsa -C "owen@163.com"
"""

然后该电脑就可以基于ssh协议对该库进行操作了

4 多分支开发

分支操作
分支与分支之间文件不通,创建分区的时候会复制当前的分区。
"""
1.创建分支
>: git branch 分支名

2.查看分支
>: git branch

3.切换分支
>: git checkout 分支名

4.创建并切换到分支,会复制当前的分支
>: git checkout -b 分支名

5.删除分支
>: git branch -d 分支名

6.查看远程分支
>: git branch -a

7.指定分支clone
>: git clone -b 分支名 https://git.xxx.net/xxx.git
"""

5 提交的时候

"""
第一次提交的分支就是远程的默认分支,clone的时候clone的就是该分支,所以一个空的仓库第一次提交的时候要提交master分支。这样master就是默认分支。

git push origin dev 代表本地的dev:远程的dev  如果提交的时候服务器没有dev分支 会创建一个dev分支
git push origin maseter 代表本地的master:远程的master

git push origin dev:master 不推荐这么使用
"""

合并分支(看公司需要,可以不看记得比较乱)

其实还是要自己线下审核

最后会有个合并分支和扁平化合并分支

扁平化会把每一次的commit的版本记录都保留,合并分支是直接合并出来一个大的版本。

建议扁平化合并分支

八 git团队开发流程

注意:第一次被提交的仓库是默认仓库

###### 基于ssh协议
"""
管理员
1.管理员配置与线上账号密码系统的本地全局账号密码
>: git config --global user.name "doctor_owen"
>: git config --global user.email "doctor_owen@163.com"

2.本地初始化git仓库(可以建立一个项目架构)
	1)创建项目
	2)进入项目目录初始化仓库:
		>: git init
	3)提交代码到本地版本库
3.创建一个远程空仓库(码云)
4.将本地版本库同步到远程仓库
	1)在本地仓库内添加远程仓库源,源名默认就采用origin,就采用https协议即可
		>: git remote add origin https://gitee.com/doctor_owen/luffy.git
	2)将本地版本库提交到远程版本库,需要远程仓库账号密码
		>: git push -u origin master

开发者
5.要参与开发的成员配置本地全局账号密码
>: git config --global user.name "owen"
>: git config --global user.email "owen@163.com"

6.生成本机的SSH公钥提供给管理员
>: ssh-keygen -t rsa -C "owen@163.com"

管理员
7.添加开发者提供的公钥到 个人公钥 并非是 公钥,并给开发者提供远程仓库SSH地址
	仓库 => 管理 => 添加公钥 => 添加个人公钥
	SSH地址:git@gitee.com:doctor_owen/luffy.git
    
开发者
8.在本机任意合适位置clone远程仓库到本地
>: git clone git@gitee.com:doctor_owen/luffy.git

9.进入本地项目仓库进行开发,可以查看远程源
>: cd luffy
>: git remote -v
注:origin  git@gitee.com:doctor_owen/luffy.git (fetch) & (push)

10.开发过程中要提交新功能时,一定要遵循先拉取(pull),在提交(push)
	1)提交新功能(先提交,提交后拉取,可能就会出现冲突)
		>: git add .
		>: git commit -m '提交新功能的信息说明'
	2)拉取远程仓库(不管本地是否已经和远程同步,每一次提交前都必须拉取)
		>: git pull 源名 分支名 => git pull origin master
	3)提交到远程仓库(现在是主分支)
		>:git push 源名 分支名 => git push origin master
"""

###### 基于http协议
"""
 ...
1 开发者只需要提供git邮箱
2 直接查询开发者邮箱添加进来就行
 ...
"""

九 团队开发冲突(重点)

1 冲突最底层逻辑

1 无冲突:要保证服务器有的版本我全有,我有的服务器没有。

2 冲突:冲突是,服务器的版本比我高(也就是服务器有的版本我并没有全有)。

2 普通冲突。

# 没有先pull就直接push产生的冲突.
# ps:pull的时候(无论结果是冲突还是不冲突),都会拿到服务器的最新的版本。

大前提

本地提交git时候必须要比服务器的版本高,基于服务器的版本做更新就不会报错。

"""
版本线:          旧-------》-------新

1 服务器版本线:	a        b        c

2 你本地的版本:	a        b        x(提交失败)

3 你本地的版本:   a        b        c       x(提交成功)  

4 服务器版本线:   a        b        c       x


"""

这就会产生冲突:你是基于服务器的b版本开发出来了x版本想要提交。但是服务器已经由b更新到了c版本。所以服务器最新的c版本你没有就会冲突,也就意味着你必须要基于服务器最新的c版本提交x,才能保证你比服务器的版本要新。

所以要先pull一下得到服务器的最新版本,然后你再提交。

3 修改了同一个文件同一个位置产生的冲突(重点)

"""
版本线:      旧-------》--------》------》---------------新

1 服务器版本: a        b        c

2 tom的版本: a        b        c       y(提交成功)

3 jack的版本:a        b        c       x(pull冲突)     yx(解决掉冲突,再pull和提交,提交成功)

4 服务器版本: a        b        c       y               yx          

"""

情景分析:

1)jack和tom都在基于服务器的c版本开发,并且他俩都修改同一个文件dev.txt 修改的都是同一行。

【jack修改的内容见下图,jack基于c版本,编辑了dev.txt】

【tom修改的内容见下图,tom基于此版本,编辑了dev.txt】

2) tom先开发完了y版本想要提交(先pull了一下成功,因为服务器依然是c版本),接着又push成功。

3) jackx版本准备提交的时候,为了拿到服务器最新版本(pull了一下冲突了,你会看到冲突的文件位置,并且提示jack修改冲突)

ps:pull冲突的时候会显示冲突的文件,jack,pull即使冲突了但是jack也拥有了服务器的最新版本,只是以冲突的形式展现。

4) jack打开文件看到冲突的位置,这个时候jack需要线下和tom进行沟通解决。

通常合并冲突的解决方案:

1 如果jack的代码完全包含了tom的代码,直接删掉tom的代码。

2 如果tom的代码完全包含了jack的代码,直接删掉tom的代码。

3 如果tom的代码和你的代码都耦合在了一起,如果两方都有意义,那么可以进行代码的逻辑上的合并出新代码。然后删除你俩的代码。

4 如果jack的代码和tom的不想关,只是在同一个文件同一个位置产生了冲突。那么jack可以上下挪动一下代码(这种就不用沟通了),两方代码都保留。

ps:对于本次情景很明显这个冲突是只是在同一行产生了问题,两个函数并没有逻辑上的冲突。所以直接都保留调整一下位置就行。

5) jack沟通商定后解决冲突

6) jack解决冲突后需要再次提交处理冲突后版本

十 现在你是项目经理

思路

1 别人写好了本地dev 传到了远程dev上,你也写好了本地dev传到了远程dev上

2 你从远程的dev上pull下来了代码到本地的dev上,你把远程的master也pull到了本地的master上

3 你在本地的master上merge本地的dev 看是否有问题,如果没有问题就push到远程的master上

dev 合并 master

假如此时你在master分支上,master即将上线,因此轻易不要动master上的东西,最好新建一个分支上提交代码进行测试
目前在master分支上
可以查看分支

git branch
//代表当前分支在master上
*master

此时创建一个dev分支 (dev是分支的名字,随便命名)

git branch dev

切换到dev分支上

git checkout dev

就可以开发了,开发完之后

git add .

git commit -m '注释'

git push -u origin dev

这样就提交到dev分支上了,对master代码没有任何影响

如果测试完,没有任何问题的话,就可以把dev分支合并到master上
首先切换到dev分支上

git branch master

如果是多人开发的话,最好把远程仓库地址的代码拉下来,以防别人提交了代码。如果是自己独立开发就不需要了。

git pull origin dev

在master上合并分支dev

git merge dev

然后把本地master上的代码push到远程master上

十一 linux git保存密码

1. cd .git
2  vim config
3  在文件输入

[credential]
	helper= store
git push origin master
posted @ 2019-12-10 14:36  张明岩  阅读(346)  评论(0编辑  收藏  举报