[TOC]
Git 版本控制
git add . && git commit -m “wangdu” && git push origin master
D:\hundsun\git\fibncci.github.io> git add . && git commit -m "wangdu" && git push origin master [master 7ae4905] wangdu 1 file changed, 88 insertions(+), 20 deletions(-) Enumerating objects: 7, done. Counting objects: 100% (7/7), done. Delta compression using up to 16 threads Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 1.41 KiB | 1.41 MiB/s, done. Total 4 (delta 3), reused 0 (delta 0) remote: Resolving deltas: 100% (3/3), completed with 3 local objects. To https://github.com/fibncci/fibncci.github.io 8b3d5fd..7ae4905 master -> master
windows报错解决:
Microsoft Windows [版本 10.0.18363.720]
(c) 2019 Microsoft Corporation。保留所有权利。
D:\hundsun\git\fibncci.github.io>git pull origin master
出现:https://github.com/fibncci/fibncci.github.io
* branch master -> FETCH_HEAD
1、 git add .
2、git commit -m "ss"
3、git config --global user.email "pc554328955@gmail.com"
4、git config --global user.name "fibncci"
5、git push origin master
Enumerating objects: 6, done.
https://github.com/fibncci/fibncci.github.io
c0d1168..8b3d5fd master -> master
Mac配置报错1:
- error: failed to push some refs to ‘ git 同步出现如何解决
python3 -m IPython notebook
----------
vi ~/.bash_profile
source ~/.bash_profile
vi ~/.zshrc
source ~/.zshrc
--------
java -version
---------
cd /Users/tianzi/Downloads/sql/github/fibncci.github.io
git --version
git config --global user.name "fibncci"
git config --global user.email "pc554328955@gmail.com"
ssh-keygen -t rsa -C "pc554328955@gmail.com"
git remote add origin git@github.com:fibncci
cd ~/.ssh
cat id_rsa.pub
git branch -m master
Mac报错解决2:
- error: failed to push some refs to ‘ git 同步出现如何解决
git解决push错误failed to push some refs to的解决
问题是这样产生的:
error: failed to push some refs to
首先我有两个git本地仓库,其中一个git上传了一次代码,另一个git在推送时出现了这样的报错:
很明显,这是因为远程库与本地库不一致造成的,
把远程库同步到本地就可以了。
办法1:
git pull
然并卵
办法2:复位基底
git pull --rebase origin master
其实这条指令的意思是把远程仓库中的更新合并到本地库中,–rebase的作用是取消本地库中的commit,并接到新版本库中,之后在
办法2.2:
git pull origin master
办法2.3:
git push origin master
也可省略origin master.
什么是 Git
[ markdown 文件版本 ]
Git 是当今世界上最先进/最好用的分布式版本控制系统,没有之一
2. 什么是版本控制系统?
版本控制 — 《维基百科》
版本控制是一种软件工程技巧,能在软件开发的过程中,确保由不同人所编辑的同一个代码文件都得到同步. 版本控制能使项目的设计者,将项目恢复到之前任意的状态,这种选择权在设计过程中特别重要. 理论上所有的信息记录都可以加上版本控制:利用版本控制来追踪、维护源码、文件以及配置文件等等的改动
3. 版本控制发展史
3.1 文件名方式
早年的软件开发过程,代码管理以手动和邮件等形式,文件命名及保存存在问题
如图 : 文件命名方式
如图 : 毕业论文版本
3.2 集中式
包括库和工作区两部分:在工作区编码,然后上传至库的方式,完成多人协作。 问题:工作机与库机,需要联网才能控制版本,传输速度较慢。
3.2 分布式
每台电脑都有,工作区和库,可以自己控制版本。数据更加安全,有逻辑上的中心。
4. 常见版本控制系统
如图 : 版本管理器的发展史
这张图上,分成了四个时期 :
● 史前时期:1982年的RCS。现在你可能还能在Unix的发布包中找到它。
● 古典时期:1990年的CVS自身缺陷已经过时;1985年的PVCS、1992年的clearcase(费用昂贵、功能复杂沿用至今);微软VVS反人类;Perforace(广泛,谷歌内部最大代码管理器)
● 中世纪时期:SVN解决了CVS的问题,集中式领域王者。AccuRev(支持分支合并让很多公司拜托cvs和clearcase)。
● 文艺复兴:BitKeeper(SUN公司大量使用),2002年Linux内核使用BitKeeper,2005年闭源时有人试图破解BitKeeper,于是出现了Git。
Git 问世
Git的第一个版本是Linux之父Linus Torvalds亲手操刀设计和实现的(两周内 用C写完),Linus不仅仅给出一个原始设计,并在向世人介绍Git时强烈批评了CVS和SVN等,Git消除了分支和合并的恐惧。很多大型开源项目由SVN迁移至Git。
2008年GitHub也成为世界最大的SCM系统(软件配置管理),它使用的就是Git版本库的技术.从此Git成为版本控制系统的主流。
GitHub上的著名项目 : Linux内核、安卓、jQuery、Bootstrap、Ruby …
5. Git 的安装 和 基本配置
5.1 安装
Linux 安装
二进制包(在线) yum -y install git // RedHat系列 apt-get git install // Debian系列 源码包(官网下载)
Windows 安装
Git 在 Windows 使用模拟环境 msysgit 下载地址: https://git-for-windows.github.io/ 注意:如果想让 windows 作为 git 服务器则需要搭建ssh服务。
本教程使用 windows 版本来做演示 : 安装步骤: (如果你不熟悉每个选项的意思,请保持默认的选项)
- 以
管理员方式
运行安装包,选择是
安装
- 同意协议条款
- 选择安装选项: 安装Git Bash和Git GUI,创建图标(可选)
-
选择 Git 的默认编辑器 (默认为vim,可选取自己熟悉的编辑器)
-
选择:
git form the command line and also form 3rd-party software
(GIT命令行和第三方软件) -
选择: 选择 OpenSSL 传输 HTTPS 的信息
-
选择 : 换行符默认为 windows 环境为主
-
选择 : MinTTY 默认终端
-
选择 : 系统文件缓存 和 git 的管理器(需要.net v4.5.1)
-
实验选项,暂不选择
-
点击 Install 安装,开始安装
-
安装完成,选择运行
git bash
工具 -
Git 运行界面 (命令行提示的是 你电脑的用户名)
git实用
[TOC]
节目目录(table of contents)== toc
目录
https://moguss.us/register?aff=3754&code=93B80A080CD1
➜ ~ git:(master) ✗ git --version
git version 2.23.0
- ctrl+l清屏
-
未处理
-
陌生人是 https ;不可以修改;只能下载
-
自己是 ssh
- workspace 工作区,不存档的;
index 缓存区,可以恢复,购物车-还不是自己的; add
local repository (本地仓库)加入 commit; 创建版本,可以加入后悔药
remole repository push 远程仓库;
前言
目前常用的命令:
Last login: Sun Jul 21 21:50:39 on ttys000
(base) tianmini-2:~ tianzi$ ls
cd Documents
cd fibncci..github.io/
git diff
git status
git add .
git commit -m 'fibonacci'
git push origin master。上传
这个是网上的地址
![image](/images/image/non relational database.png)
这个是用typora的地址
![sss](../images/image/non relational database.png)
git的一些坑
没有十全十美的软件,或者技术,每一个技术或者软件都是有漏洞的 ;
而且背后都是一些人不可以控制的,或者因为人的控制(人的思维漏洞)出现了很多问题,严密性 啊。
git中的 上传,一旦出现了错误,都是致命的,当他在解析一个文件时候,如果解析不了,那么就会报错,他始终是通过jk来做的网页。那么就有自己的原则,自上而下的运行。
遇到问题后,解决办法,就是通过减少上传量,对于错误的重新编写。或者二分法找出错误,在问题不多的情况下。
如果太多,那就分批上传吧 。
参考2014版pro git(里面有各种语言很丰富)
https://git-scm.com/book/zh/v2
网易公开课
https://open.163.com/
git用法
版本控制器
git init 初始化该目录为版本仓库 git add 1.txt 在工具内输入以下,添加文件至版本库:
git add . 目录 git status 查看当前版本状态 git commit -m “描述” 添加文件至缓存区
git log 查看提交历史..
使用 ssh-keygen.exe -t rsa
来生成SHA256的SSH密钥(按回车确认即可)
下载— git clone git@gitee.com:feibo2011/wangdu01.git
上传— git push
- 克隆git add .
- git commit -m “o”
- git status
-
git push
- j上
- k 向下翻
1.如果想下载:
这儿提供两个方法:
1.点pdf右击,会有一个复制链接地址(https://github.com/progit/progit2-zh/releases/download/2.1.24/progit_v2.1.24.pdf),然后打开你的迅雷新建下载任务(+),ok!
2.同样复制链接地址,到网页版百度网盘,离线下载也是可以的。
注:github是远程仓库,本地有个仓库,需要把本地的推到github
然后把文件的名字改成.gitignore(注意在.前面是没有任何字符的),
并把文件放在git管理目录的根目录下。
忽略所有包含xcuserdata的文件(夹)
忽略所有文件夹中后缀是.DS_Store的文件
# git ignore
xcuserdata
.DS_Store
2.git常用
1.git初始化仓库 | git init |
2.定一个名字(定则) | git config –global user.name “feibo2011” |
2.2定一个邮箱 | git config –global user.email pc554328955@163.com |
3.git的状态:在暂存区 | git status ls(查看文件) |
3.git提交 | git diff(查看文本修改) git status(确定状态) |
4.切分支 | fetch http master:master2 (拉取-推送)(本地master2) |
5.查看分支 | git branch |
6.查看历史 | git log |
7.回滚历史 | git reset –hard HEAD^ 或者 HEAD~ |
8.暂存区提交到提交区 | git push |
9.添加 | git add . (添加所有) |
10.确定提交 | git commit -m ‘‘。m后是注释,别名 |
11.远程地址 | git remote –v 查看远程库的详细信息 |
12.推代码(我是http) | git push –u(第一次要用-u 以后不需要) origin master |
13.拉取代码 | git clone https://github.com/fibncci/fibncci.github.io 克隆 |
14.查看差异,解决 | git diff git status(确定差异) git merge合并 |
关联一个库 git remote add origin https://github.com/tugenhua0707/testgit
删除XX文件 git rm XX
3.创建版本库
-
创建版本库目录
mkdir master3 pwd 查看 ls cd master3 echo 'houhou' > s1.md vim s1.md echo 'dsdfs你很帅' >>s1.md
-
通过
git init
命令把这个目录变成Git可以管理的仓库cd master3 git init 初始化仓库 1. 将文件放到版本库目录或子目录 2. 把文件添加到 暂存区 git add 文件名 使用`git commit`把文件提交到版本库仓库(本地库) git status` 命令查看状态 git diff`命令查看修改了那些东西
4.同步远程仓库
-
在本地仓库下运行命令
$ git remote add origin git@github.com:fibncci/fibncci.github.io.git 把本地库的内容推送到远程用`git push' git push -u origin master # 第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 git push origin master SSH 警告 因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入`yes`回车即可。 The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xx.xx.xx.xx.xx. Are you sure you want to continue connecting (yes/no)? Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了: Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
5.新的
cd /Users/tianzi/Documents/GitHub/feibo2011.github.io 我的地址
git status 找差异
ls看文件
git status确定差异
git add . 添加所有
git commit 不展开 提交
git commit 不展开上传 ---失败了
git fetch 取来
git diff 差异
git merge 差异合并
git commit -m 'ceshi' 取个名测试
git config --global user.name "fibncci" 别人可以看到我的用户名
git config --global user.email pc554328955@gmail.com 看到我的邮箱联系me
git commit -m 'ceshi' 测试
(base) tianmini-2:feibo2011.github.io tianzi$ git push 前面的不是,后面上传
git fetch
git push -u 报错
cd .. 上一级文件
ls查看文件下
小乌龟 tortoise +语言包
SVN(版本控制工具)SVN abbr.(缩写) 交换式虚拟网络
对号,已经加入缓存区,可以直接上传了
感叹号,是修改过了;
git 帮助help
git fetch http master:master2 取来 拉取远程master 本地的master2
git diff master2 寻找差异
git merge master2 合并到master2主人的
git push http push会替换and上传
git status 查看差异
git add . 添加所有
git status 确定差异,然后上传
git commit -m '测试' 提交我的备注
git push http 推到我新的http的网址, 不是ssh
6.git
1版本回退
#查看日志
$ git log
//如果嫌弃输出信息太多
$ git log --pretty=oneline
➜ s91 git:(master) git log --oneline
$ git reset --hard HEAD^ //上一个版本是HEAD^ 上上个版本是HEAD^^ 上一百个是HEAD~100
2查看目前代码的修改状态
提交代码之前 首先应该检查目前所做的修改
$ git status
a) 已暂存(changes to be committed)
new file //表示新建文件
modified //表示修改文件
deleted //表示删除文件
b) 已修改(changed but not updated)
c) 未跟踪(untracked files)
3查看代码修改内容
$ git diff <file> //比较某文件与最近提交节点的差异
注意:如果该文件已缓存 那么应该使用
$ git diff -cached <file>
$ git diff <hashcode><hashcode><file> //比较某文件在提交节点a 节点b的差异
技巧:如果省略后面一个hashcode则默认表示与上一次提交节点比较(也可以使用^运算符)
提交已缓存文件
$ git commit --amend //最近一次提交 有时候提交注释书写有误或者漏提文件 可以使用次命令
$ git rm --cached <file> //停止跟踪文件 但不删除
7.git使用
-
1.初始化
- $git init
-
2.配置(config)
- git config –global user.email 邮箱
- git config –global user.name 用户名
-
3.帮助(help)
- $ git help
- $ git help add
- $ git add –help
-
4忽略文件(ignore)
- $ echo”temp/” » .gitignore
- $ echo”private_key” » .gitignore ~~~
-
5状态(status)
显示当前工作区与暂存区(Index)的粗略状态。
# 显示某些文件已修改,哪些文件已准备提交等信息
- $git status
-
6添加(add)
将文件加入缓存区
# 添加文件
- $ git add HelloWorld.java
# 添加子目录下的文件
- $ git add /path/to/file/HelloWorld.c
# 通配符方式添加多个文件
- $ git add ./*.java
# 添加工作目录下的所有文件
- $ git add -A
-
7分支(branch)
该命令用于管理分支。可以查看,修改,创建,删除分支。、
# 列出所有本质
- $ git branch -a
# 创建新分支
- $ git branch myNewBranch
# 删除分支
- $ git branch -d myBranch
# 重命名分支: git branch -m
- $ git branch -m myBranchName myNewBranchName
# 修改分支描述
- $ git branch myBranchName –edit-description
-
8提交(commit)
将缓存区(Index)中的内容提交到git仓库中
# 提交时填写说明(message)
- $ git commit -m “Added multiplyNumbers() function to HelloWorld.c”
# 提交时带数字签名(由提交者的GPG密钥生成)
- $ git commit -S -m “signed commit message”
# 自动将修改的文件加入缓存区(Index),再进行提交。
- $ git commit -a -m “Modified foo.php and removed bar.php”
# 把本次提交与最后一次提交合并(删除最后一次提交,加入合并后的提交)
- $ git commit –amend -m “Correct message”
-
9差异(diff)
显示工作目录、缓存区(Index)、当前git库版本之间的差异
# 显示工作目录与缓存区(Index)之间的差异
- $ git diff
# 显示缓存区(Index)与当前git库版本之间的差异
- $ git diff –cached
# 显示工作目录与当前git库版本之间的差异
- $ git diff HEAD
-
日志(log)
显示提交到git仓库的记录信息.
# 显示所有提交
- $ git log
# 以简化单行方式显示(每个提交)
- $ git log –oneline
-
➜ s91 git:(master) git log –oneline
# 只显示合并的提交
- $ git log –merges
# 在提交行的左侧以字符串图像的方式表示版本变化情况
- $ git log –graph
Git基础-19-09
1. Git简介
Git 是版本控制器, 专为团队管理项目代码而产生. 最大的特点在于:
- 没网, 自己玩自己的代码仓库
- 有网, 大家可以一起玩一个远程仓库, 也可以继续玩自己的仓库
Git 不是完全依赖网络的
**什么是版本控制器? **
版本控制就是游戏存档, 游戏从一开始就可以存档, 玩了一段时间, 可以再次存档 ( 时间任意, 想存就存 )
每一次的存档就是一个版本, 可以回退到之前的任意版本, 然后可以再开启一条新的分支路线, 与原先路线可能不一样. ( 我天, 开挂啊, 回退后换个打法, 再走一遍啊, 版本控制简直就是后悔药啊 )
2. 安装/配置
2.1 安装
目前支持Windows, Mac 等平台.
下载安装好之后, 可以直接在桌面右击, 有两个git选项:
- Git GUI here 图形界面模式
- Git Bash here 命令界面模式
2.2 配置
版本查看
在命令界面模式
输入命令: git --version
全局配置
全局配置代表以后无论在哪个目录, 都会使用这个配置
# 配置用户名
git config [--global] user.name "用户名"
# 配置用户邮箱, 怎么联系你的
git config [--global] user.email "邮箱"
# 查看配置
git config --list
# 其中 中括号[] 内的参数:
# --global 全局
# --local 本地
# --system 系统
# 例如:
git config --global user.name "黄磊"
git config --global user.email "hyinshaoye@163.com"
3. 创建仓库
仓库本质就是一个文件夹, 目录. 里面存放着项目. 这里介绍3种方式:
-
方式一
自己手动创建一个目录并进入, 在该目录下右击选择
Git Bash
输入初始化命令:
git init
注意: 你会看到该目录下有一个隐藏目录
.git
, 这里面含有了一些git配置等文件, 如果该.git
没了, 那么该目录也不再是仓库了. -
方式二
直接右击选择
Git Bash
, 输入初始化命令:git init 目录名
这个其余与方式一差不多, 只是方式一 是手动先创建目录再初始化. 方式二是初始化时, 顺便创建目录
-
方式三
在线克隆别人的仓库
# 克隆格式 git clone 仓库地址 # 例如: git clone https://gitee.com/leihuang_509/Demo.git
4. 基本操作
4.1 状态查看
用于查看当前状态的一些变化, 例如: 创建文件, 修改文件, 删除文件
# 格式
git status
# 例如:
touch a.txt # 创建一个文件 a.txt
git status # 查看当前状态
运行结果:
可以这么理解:
每看到 commit
就可以理解为是存档
No commit
就代表目前还没有存档
Untrack files
代表未跟踪的文件: 就是文件发生了变化却没有存档的文件
这里的 文件发生了变化 通常为: 新增文件, 修改/更新文件, 删除文件
4.2 添加到缓存区
git工作基本分为:
- 工作区间 - workspace
- 缓存区间 - index
- 本地仓库 - local repository
- 远程仓库 - remote repository
# 格式
git add . # 将所有 未跟踪的文件 全部添加到 缓存区
再次查看状态就发现不一样了
# 查看状态
git status
运行结果:
从 红色文字
变为 绿色文字
, 说明已经成功提交给缓存区
4.3 提交给本地仓库
本地仓库才是真正存放文件的地方, 缓存区只是临时的, 不然怎么叫缓存呢.
# 格式
git commit
或
git commit -m '描述'
# 例如:
git commit -m '刚刚新建的文件'
4.4 查看 存档列表
# 格式
git log # 查看所有存档(完整)
git log --oneline # 查看所有存档(简略)
git log -p # 存档的具体内容(例如: 哪些改了, 哪些删了, 加了哪些)
若存档列表较多时, 可用 j 或 k 上下翻页, q 退出
强制退出
:q!
运行结果
注意:
commit 后面的一串字符就是 存档唯一编号, 后期需要编号来回退存档
4.5 回退版本
# 格式
git checkout 版本编号/标签 # 标签后面有介绍
或
git checkout - # 代表回退到上一个版本
➜ s91 git:(485dc78) git checkout v1.0
HEAD is now at 485dc78 存档一
git reset --hard HEAD^^
# 例如
git checkout 3b8cb49c1f52eb6826a17b5b5e99e915c17b040e
4.6 查看当前版本
# 格式
git show
4.7 节点标签
市面上经常看到某软件 v1.0 v2.0 等字样, 这些其实就是大版本号, 也被我们称之为tag标签
创建标签
# 格式
git tag -a 标签名 -m '描述' # 默认最新的版本编号
或
git tag -a 标签名 -m '描述' 版本编号 # 自主指定版本编号
# 例如
git tag -a v1.0 -m 'xx小说第一部'
查看标签列表
# 格式
git tag
查看某一标签
# 格式
git show 标签名
# 例如
git show v1.0
empty for no passphrase
enter passphrase
空无密码
输入密码
使用SSH公钥可以让你在你的电脑和码云通讯的时候使用安全连接(Git的Remote要使用SSH地址)
命令
➜ s91 git:(master) git log --pretty=oneline
单行输出
➜ s91 git:(485dc78) git reflog
➜ s91 git:(485dc78) git reset --hard 14d6d11
不能随便用
HEAD is now at 14d6d11 存档3
➜ s91 git:(14d6d11) git add . && git commit -m "存档6"
HEAD detached from v2.0
➜ s91 git:(14d6d11) git remote -v
n. 远程 remote
origin https://gitee.com/feibo2011_admin/s91.git (fetch)
fetch到达 push推 pull拉 origin原点 master主人
origin https://gitee.com/feibo2011_admin/s91.git (push)
➜ s91 git:(14d6d11) git push origin master:dev
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered By Gitee.com
To https://gitee.com/feibo2011_admin/s91.git
* [new branch] master -> dev
➜ s91 git:(14d6d11) git push
fatal: You are not currently on a branch.
To push the history leading to the current (detached HEAD)
state now, use
git push origin HEAD:<name-of-remote-branch>
➜ s91 git:(14d6d11) git merge dev
merge: dev - not something we can merge
Did you mean this?
origin/dev
➜ s91 git:(14d6d11) git push origin master:dev
Everything up-to-date
➜ s91 git:(dev) git reset --hard HEAD^
#HEAD前进
#retreat后退
HEAD is now at 485dc78 存档一
➜ s91 git:(dev) git push
fatal: The current branch dev has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin dev
➜ s91 git:(dev) git add -A
➜ s91 git:(dev) git branch -a
➜ s91 git:(dev) git branch fis
➜ s91 git:(dev) git branch sec
➜ s91 git:(dev) git branch thr
➜ s91 git:(dev) git branch -a
➜ s91 git:(dev) rm 2.txt
➜ s91 git:(dev) ✗ vim 1.txt
➜ s91 git:(dev) ✗ git add . && git commit -m "存档7"
[dev b0b3818] 存档7
2 files changed, 1 insertion(+)
delete mode 100644 2.txt
➜ s91 git:(dev) git diff HEAD
➜ s91 git:(dev) git diff -cached
➜ s91 git:(dev)
多个分支,先切换到主分支;
然后增删改查
➜ s91 git:(dev) git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
➜ s91 git:(master) vim 1.txt
➜ s91 git:(master) ✗ git add . && git commit -m "存档8"
[master a33eb2b] 存档8
1 file changed, 19 insertions(+)
➜ s91 git:(master) git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 6 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 367 bytes | 367.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered By Gitee.com
To https://gitee.com/feibo2011_admin/s91.git
cd703ce..a33eb2b master -> master
➜ s91 git:(master)
Git的基础详细
5.2 配置
无论 Linux 还是 Windows,安装完成后都要初始化
# 查看 git 版本
git --version
# 查看配置
git config -l
# 设置用户名和邮箱
git config [--global] user.name "Your Name"
git config [--global] user.email "your@email.com"
# 中括号内的参数:
# --local 本地
# --system 系统
# --global 全局
# 无参,则为当前库配置身份
# 如:
git config --global user.name "seeker"
git config --global user.email "3300696254@qq.com"
6. Git常用操作
6.1 生成新的版本库
- 新建空目录
- 进入该目录—单击右键—选择
Git Bash Here
- 弹出 git 的命令行工具
- 初始化该目录为版本仓库,键入
git init
- 显示
Initialized empty Git repository in xxxxxx
ls -a
查看该目录下出现.git
的隐藏目录,即版本库- 初始化完成
6.2 添加文件到版本库
- 新建文件
1.txt
- 查看当前版本状态
# 查看当前版本状态
git status
- 红字提示有文件未跟踪(未加入版本控制)
- 在命令行内输入以下,添加文件至版本库:
# 添加文件至缓存区
git add 1.txt
# 再次查看版本库状态
git status
# 提示有要提交的修改,有一个新增的文件
# 提交文件至版本库
# 直接提交
# 回车后,会打开指定的编辑器编写描述信息
git commit
# 填写完描述信息,保存关闭即可
# 或者带参数 -m 直接写入提交的描述信息
git commit -m "新增1.txt"
# 新建 2.txt / 3.txt
# 多文件添加
git add 2.txt 3.txt
# 将缓存区的多次添加一次提交
git commit -m "新增2.txt+3.txt"
# ps:
# 添加所有改动过的和新增的文件到缓存区 (不包括被删除的文件)
git add .
# 添加所有文件到缓存区
git add --all
git add -A
- 执行完后,提示提交完成
- 查看提交后的版本库状态:
$ git status
On branch master
nothing to commit, working tree clean
- 至此,最简单的添加文件,到版本库的操作已完成
— PS部分: Git 实现原理 —
- 工作区 : 就是程序员日常编写代码的文件夹
- 版本库 : 负责代码版本控制,就是
.git
隐藏目录 - 版本库原理图 :
版本库包括:暂存区(index/stage),HEAD(指针),分支(默认为 master 主分支)等。
文件提交至版本库总共分两步:
git add filename
# 添加至 stage 缓存区git commit -m "描述"
# 将 stage 的内容提交至版本库的 master 分支
实验:
- 修改文件 »> 查看状态
- 添加到缓存区 »> 查看状态
- 再次修改 »> 提交 »> 查看状态
实验过程如下,观察理解 Git 实现机制:
- 修改文件 »> 查看状态:
- 修改
1.txt
文件的内容,添加一行111
,查看状态:git status
- 提示:
Changes not staged for commit:
(工作区的修改,还没有提交到缓存区) - 显示红字,
modified: 1.txt
- 修改
- 添加到缓存区 »> 查看状态:
- 添加到缓存区
git add .
- 查看状态:
git status
- 提示:
Changes to be committed
(要提交的修改。表示已提交到缓存区,待提交到版本库) - 显示绿字:
modified: 1.txt
- 添加到缓存区
- 再次修改 »> 提交 »> 查看状态
- 继续修改文件:
1.txt
文件的内容,添加一行222
- 提交版本库:
git commit -m "第1次修改 1.txt"
- 再次查看状态:
git status
- 提示:
Changes not staged for commit
(表示工作区中,还有修改记录,没有被提交到版本库之中) - 显示红字:
modified: 1.txt
- 继续修改文件:
说明:
- 第 3 步的提交,只是提交了缓存区内,已经缓存过的内容(即,第二步的
add .
操作) - 第 3 步中的第二次修改文件内容的记录,并没有添加到缓存区,所以版本库与工作区文件不一致
- 此时需要将第二次的修改记录,添加到缓存区,再次提交即可
git add.
git commit -m '第2次修改 1.txt'
git status
6.3 查看文件修改状态相关
# 查看当前版本状态(是否修改)
git status
修改文件,测试区别:
# 当 工作区/缓存区/版本库 都一致时,使用以下命令不会有任何提示
git diff # 工作区 与 缓存区的区别
git diff --cached # 缓存区 与 版本库的区别
git diff HEAD # 工作区 与 版本库的区别
# 更改工作区的 1.txt,并将更改添加到缓存区
# 然后再次更改工作区的 1.txt,并保存文件的更改
# 再次测试以上三条命令
6.4 Git 日志
# 查看提交历史
git log
# 以简短的方式查看提交日志
git log --oneline
# 行为日志,显示所有提交,回滚等..
git reflog
# 显示缓存区的所有文件
git ls-files
6.5 版本回退
# 将当前版本重置为 HEAD(通常用于清空缓存区,或 merge 失败回退)
git reset --hard HEAD
# hard 努力的
git reset --hard HEAD^ # 回退上一个版本
git reset --hard HEAD^^ # 回退上两个版本
git reset --hard HEAD~n # 回退上n个版本
# 回退到指定版本,commitid 可根据日志获取,'<>'内的id必填
git reset --hard <commitid>
6.6 撤销
目的:将尚未提交至版本库的修改撤回
- 情况一 : 文件修改后,尚未添加至缓存区
# 修改 1.txt 的内容:添加一行
# 在工作区撤销文件的修改
git checkout -- filename
# 注意'--'不可缺少。没有'--',就变成了“切换到另一个分支”的命令
- 情况二 : 文件修改后,已添加至缓存区
# 修改 1.txt 的内容:添加一行,并添加到缓存区
# 撤回添加至缓存区的修改
git checkout HEAD filename
6.7 Git 删除
- 删除文件和版本库记录
# `rm`命令只会删除工作区的文件,不会删除记录
rm 2.txt
git status # 提示2.txt 被删除,是否需要提交到版本库
# 如果删错文件,则可以撤回删除(因为此时的删除操作,还未写入到缓存区)
git checkout -- 2.txt
# 将 2.txt 的删除记录写入到缓存区,并删除文件
git rm 2.txt
# 如果还未提交,想要撤回,可使用 `git checkout HEAD 2.txt`
# 提交 2.txt 的删除记录到版本库中
git commit -m '删除2.txt'
- 删除缓存区的文件
# 新建 demo.html 文件,并加入到缓存区
git add demo.html
git status # 提示有新文件等待提交
# 将 demo.html 文件移出缓存区,但不删除(文件还会保留在工作区)
git rm --cached demo.html
git status # 提示工作区有文件等待 add
# 重新将 demo.html 加入到缓存区
# 将缓存区中的 demo.html 文件移出并删除(工作区不保留文件)
git rm -f demo.html
- 其他删除
# 新建 aaa/111.txt
# 新建 aaa/bbb/111.txt
# 将文件添加到版本库中
git add .
git commit -m '添加aaa目录及文件'
# 递归删除目录(删除的是,已被记录到版本库的目录)
git rm -r 目录名
git commit -m '删除aaa目录'
6.8 Git 流程图
7. 远程仓库
7.1 得到远程的版本库
可以使用两种方式来得到远程版本库:
- 在某个指定的文件夹下使用,即可得到远端版本库及代码
git clone <远端版本库url> <本地存放该库的文件夹名>
- 手动添加版本库,并拉取文件
#初始化本地仓库
git init
# 添加远程版本库 <remote>可自行取名,默认origin
git remote add <remote> <url>
# 查看远程版本库信息
git remote -v
# 查看指定远程版本库信息
git remote show <remote>
# 删除远程remote链接
git regite>
# 下载代码及快速合并
git pull <remote> <branch>
7.2 推送分支代码
得到远端版本库后,可以在本地按正常的步骤编辑 : 新建或改动文件–>添加至缓存区–>提交到版本库
此时,要想将本地版本库发给远端,只有commit提交是不够的. 还需要下面的操作 :
git push <remote> <branch>
# 上传代码及快速合并
执行以上代码,会有报错 : 无法直接推送到远端的主分支 此时,可以曲线救国,推送自己的分支到远端即可 :
git push origin master:dev
此时,推送成功!
8. Git 分支管理
8.1 查看版本库分支
# 显示本地分支
git branch
# 显示所有分支
git branch -a
# 切换到指定分支或标签
git checkout 分支名/标签名
8.2 创建分支/删除分支
# 新建分支
git branch 分支名
# 创建并切换到dev分支
git checkout -b dev
# 删除本地分支 -D 强制删除
git branch -d 分支名
8.3 合并分支
要将 B分支 合并到 A分支里 请切换到A分支内,合并B分支的操作在A分支内进行
# 合并分支到当前分支
git merge 分支名
8.4 解决合并冲突
多分支修改同一文件,合并可能出现冲突。冲突部分用«<===»>表示
解决方法: 先手动修改冲突部分,再次提交即可。
8.5 分支管理策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
8.6 多人协作
多人协作的工作模式通常是这样:
首先,可以试图用git push origin <branch-name>
推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
9. 使用代码托管系统
市面上有名的Git托管系统 :
9.1 码云 生成SSH密钥及使用
- 本地打开git bash ,
cd
切换到用户的家目录 - 使用
pwd
来查看目录是否正确 - 使用
ssh-keygen.exe -t rsa
来生成SHA256的SSH密钥(按回车确认即可) cd .ssh/
切换至ssh目录ls
查看目录下文件cat id_rsa.pub
查看生成的密钥,并复制- 打开git@osc开源中国,登录自己的账户.点选个人资料
- 选择SSH公钥
- 在添加公钥界面,将刚刚复制好的密钥粘贴进来,再自己取一个该密钥的名字,以便于区分管理
- 本地新建一个目录,用于拉取远端版本库
- 使用
git init
初始化该目录 - 使用
git remote add origin <SSH地址>
来添加远程版本库 - 使用
git remote -v
来查看远程版本库信息 - 使用
git pull origin marster
来拉取版本库及代码
➜ s91 git:(master) ✗ cd ~
➜ ~ git:(master) ✗ pwd
/Users/tianzi
➜ ~ git:(master) ✗ ssh-keygen -t rsa -C "pc554328955@163.com"
Generating public/private rsa key pair.
Overwrite (y/n)? y
The key's randomart image is:
+---[RSA 2048]----+
|Oo+ .oo=. |
|.. +... . . |
+----[SHA256]-----+
➜ ~ git:(master) ✗ cd .ssh
➜ .ssh git:(master) ✗ ls
authorized_keys config id_rsa id_rsa.pub known_hosts
➜ .ssh git:(master) ✗ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqtKs+L/ pc554328955@163.com
➜ .ssh git:(master) ✗ git push --help
➜ .ssh git:(master) ✗ git push --help
➜ .ssh git:(master) ✗ git --help
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
These are common Git commands used in various situations:
start a working area (see also: git help tutorial)
clone Clone a repository into a new directory
init Create an empty Git repository or reinitialize an existing one
work on the current change (see also: git help everyday)
add Add file contents to the index
mv Move or rename a file, a directory, or a symlink
restore Restore working tree files
rm Remove files from the working tree and from the index
examine the history and state (see also: git help revisions)
bisect Use binary search to find the commit that introduced a bug
diff Show changes between commits, commit and working tree, etc
grep Print lines matching a pattern
log Show commit logs
show Show various types of objects
status Show the working tree status
grow, mark and tweak your common history
branch List, create, or delete branches
commit Record changes to the repository
merge Join two or more development histories together
rebase Reapply commits on top of another base tip
reset Reset current HEAD to the specified state
switch Switch branches
tag Create, list, delete or verify a tag object signed with GPG
collaborate (see also: git help workflows)
fetch Download objects and refs from another repository
pull Fetch from and integrate with another repository or a local branch
push Update remote refs along with associated objects
'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
See 'git help git' for an overview of the system.
➜ .ssh git:(master) ✗ git push -h
usage: git push [
-v, –verbose be more verbose
-q, –quiet be more quiet
–repo
9.2 GitHub 生成SSH密钥及使用
- 运行 git Bash 客户端,输入如下代码:
$ cd ~/.ssh
$ ls
- 这两个命令就是检查是否已经存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已经存在,那么你可以跳过步骤2,直接进入步骤3
- 创建一个 SSH key
$ ssh-keygen -t rsa -C "your_email@example.com"
- 代码参数含义:
-t
指定密钥类型,默认是 rsa ,可以省略。-C
设置注释文字,比如邮箱。-f
指定密钥文件存储文件名。
- 添加你的 SSH key 到 github上面去
$ cat ~/.ssh/id_rsa.pub
- 测试一下该SSH key 在git Bash 中输入以下代码
$ ssh -T git@github.com
- 显示类似如下,表示成功:
Hi username! You've successfully authenticated
git clone 远程git仓库地址
10. 文件忽略
想要工作区的某些文件,不受版本的控制,可使用.gitignore
文件进行忽略.
!(注意, .gitignore文件 是没有名字的文件.)
规则:
- 以斜杠
/
开头表示目录 - 以星号
*
通配多个字符 - 以问号
?
通配单个字符 - 以方括号
[]
包含单个字符的匹配列表 - 以叹号
!
表示不忽略(跟踪)匹配到的文件或目录
配置文件是按行 从上到下 进行规则匹配的, 这就意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效.
11. 使用 TortoiseGit 操作 Git
TortoiseGit 俗称 [ GIT小乌龟 ]
Git 常用命令速查
- master 默认主分支
- dev 默认开发分支
创建版本库
# 初始化本地git版本库(创建新仓库)
git init
# 配置用户名
git config --global user.name "xxx"
# 配置邮件
git config --global user.email "xxx@xxx.com"
#查看当前配置列表
git config --list
# clone远程仓库
git clone <url>
修改、提交、删除
# 添加index.php文件到缓存区
git add index.php
# 添加所有改动过的文件到缓存区
git add .
# 添加所有文件到缓存区
git add --all
# 提交缓存区内的文件(回车后需要键入描述:wq保存退出)
git commit
# 提交缓存区内的文件,并提供描述
git commit -m "描述"
# 将add和commit合为一步
git commit -am '描述'
# 合并最后一次提交(用于反复修改)
git commit --amend -m 'xxx'
# 删除index.php文件
git rm index.php
# 将index.php文件移出缓存区,但不删除( -r * 递归目录)
git rm --cached index.php
# 将缓存区中的1.html文件移出并删除
git rm -f 1.html
查看
# 查看当前版本状态(是否修改)
git status
# 查看所有添加到缓存区的变更(工作区与版本库的区别)
git diff
# 查看工作区文件和库文件区别
git diff index.php
# 查看所有已添加到缓存区,但还未commit的变更(缓存区与版本库的区别)
git diff --cached
# 查看提交历史
git log
# 以简短的方式查看提交日志
git log --oneline
# 行为日志,显示所有提交,回滚等..
git reflog
# 显示缓存区的所有文件
git ls-files
回退 与 撤销
# 将当前版本重置为HEAD(通常用于merge失败回退)
git reset --hard HEAD
git reset --hard HEAD^ # 回退上一个版本
git reset --hard HEAD^^ # 回退上两个版本
git reset --hard HEAD~n # 回退上n个版本
# 回退指定版本,commitid根据log获取
git reset --hard <commitid>
# 在工作区撤销文件的修改
git checkout --filename
# 撤回添加至缓存区的修改,不指定filename则撤回所有
git checkout HEAD [filename]
分支操作
# 获取远程分支master并merge到当前分支
git pull origin master
# 显示本地分支
git branch
# 显示所有分支
git branch -a
# 切换到指定分支或标签
git checkout 分支名/标签名
# 新建分支
git branch 分支名
# 删除本地分支 -D 强制删除
git branch -d 分支名
远程协作
# 添加远程版本库
git remote add <remote> <url>
# 查看远程版本库信息
git remote -v
# 查看指定远程版本库信息
git remote show <remote>
# 删除远程remote链接
git remote remove <remote>
# 重命名远程链接名
git remote rename <old> <new>
# 下载代码及快速合并
git pull <remote> <branch>
# 上传代码及快速合并
git push <remote> <branch>
# 将本地的远端库合并
git merge origin master
# 将远端库获取本地但不合并
git fetch origin
Git使用
安装git
sudo apt-get install git
xyl@xyl:~$ git
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
这些是各种场合常见的 Git 命令:
开始一个工作区(参见:git help tutorial)
clone 克隆一个仓库到一个新目录
init 创建一个空的 Git 仓库或重新初始化一个已存在的仓库
在当前变更上工作(参见:git help everyday)
add 添加文件内容至索引
mv 移动或重命名一个文件、目录或符号链接
reset 重置当前 HEAD 到指定状态
rm 从工作区和索引中删除文件
检查历史和状态(参见:git help revisions)
bisect 通过二分查找定位引入 bug 的提交
grep 输出和模式匹配的行
log 显示提交日志
show 显示各种类型的对象
status 显示工作区状态
扩展、标记和调校您的历史记录
branch 列出、创建或删除分支
checkout 切换分支或恢复工作区文件
commit 记录变更到仓库
diff 显示提交之间、提交和工作区之间等的差异
merge 合并两个或更多开发历史
rebase 在另一个分支上重新应用提交
tag 创建、列出、删除或校验一个 GPG 签名的标签对象
协同(参见:git help workflows)
fetch 从另外一个仓库下载对象和引用
pull 获取并整合另外的仓库或一个本地分支
push 更新远程引用和相关的对象
命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些概念帮助。
查看 'git help <命令>' 或 'git help <概念>' 以获取给定子命令或概念的
帮助。
工作区和暂存区
-
工作区
本地目录
-
版本库
工作区有一个隐藏目录
.git
,这个不算工作区,而是Git的版本库。把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
创建版本库
-
创建版本库目录
mkdir myGit
-
通过
git init
命令把这个目录变成Git可以管理的仓库xyl@xyl:~/myGit$ git init 已初始化空的 Git 仓库于 /home/xyl/myGit/.git/
将文件添加到版本库
-
将文件放到版本库目录或子目录
-
把文件添加到暂存区
git add 文件名
-
使用
git commit
把文件提交到版本库仓库只会把暂存区的文件提交到版本库
xyl@xyl:~/myGit$ git commit -m 'testfile' # -m 本次提交的说明 [master (根提交) 5261364] testfile 1 file changed, 1 insertion(+) # 1个文件被改动,插入一行 create mode 100644 test_git
-
使用
git status
命令查看状态 -
使用
git diff
命令查看修改了那些东西xyl@xyl:~/myGit$ echo 'test3' >> test_git xyl@xyl:~/myGit$ git diff diff --git a/test_git b/test_git index 72167ef..67edf0a 100644 --- a/test_git +++ b/test_git @@ -1,2 +1,3 @@ test 111 +test3
版本回退
-
使用
git log
查看提交日志commit id(版本号)
xyl@xyl:~/myGit$ git log commit dea0f620a215804b8d70c29aa00e48fbc765b1ed (HEAD -> master) Author: 787119359 <787119359@qq.com> Date: Thu Jul 18 11:36:19 2019 +0800 back_test commit 61f04ac79fd56d61fc27d0a08e4078855030438b Author: 787119359 <787119359@qq.com> Date: Thu Jul 18 11:34:32 2019 +0800 test3 commit cd097f8a824eecdd2f4a0c78ac78c7608bd2ecdb Author: 787119359 <787119359@qq.com> Date: Thu Jul 18 11:28:17 2019 +0800 test2 commit 526136465a882088b223b7d43113bc3b7d1f094b Author: 787119359 <787119359@qq.com> Date: Thu Jul 18 11:20:35 2019 +0800 testfile :
-
回滚到上次记录
xyl@xyl:~/myGit$ git reset --hard HEAD^ HEAD 现在位于 61f04ac test3 xyl@xyl:~/myGit$ cat test_git test 111 test3
HEAD 表示当前版本
HEAD^ 上个版本
HEAD^^ 上上个版本
HEAD~100 上100个版本
-
回滚到指定记录
git reset --hard 版本号
-
查看每一次命令
git reflog
xyl@xyl:~/myGit$ git reflog 61f04ac (HEAD -> master) HEAD@{0}: reset: moving to HEAD^ dea0f62 HEAD@{1}: commit: back_test 61f04ac (HEAD -> master) HEAD@{2}: commit: test3 cd097f8 HEAD@{3}: commit: test2 5261364 HEAD@{4}: commit (initial): testfile
-
总结
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
撤销修改
使用 git checkout -- file
可以丢弃工作区的修改
-
文件修改后还未放到暂存区
现在撤销修改就会回到和版本库一样的状态
-
文件已经添加到暂存区后又做了修改
现在撤销修改就会回到添加到暂存区后时的状态
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令
删除文件
在文件管理其中把没用的文件删除,git status
命令就会显示哪些文件被删除了
两种选择:
-
从版本库中删除该文件
git rm file
-
删错了,从版本库中恢复
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
git checkout -- file # 只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
远程仓库
第1步:创建 SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容
同步远程仓库
-
在本地仓库下运行命令
$ git remote add origin git@github.com:(用户名)/(库名).git
-
把本地库的内容推送到远程用
git push
git push -u origin master # 第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push origin master
-
SSH 警告
因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入
yes
回车即可。The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xx.xx.xx.xx.xx. Are you sure you want to continue connecting (yes/no)?
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
-
总结
要关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git
;关联后,使用命令
git push -u origin master
第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令
git push origin master
推送最新修改;
从远程库克隆
克隆一个库
$ git clone git@github.com:michaelliao/gitskills.git
$ git clone https://github.com/michaelliao/gitskills.git
创建与合并分支
-
原理
一开始的时候,
master
分支是一条线,Git用master
指向最新的提交,再用HEAD
指向master
,就能确定当前分支,以及当前分支的提交点每次提交,
master
分支都会向前移动一步,这样,随着你不断提交,master
分支的线也越来越长。当我们创建新的分支,例如
dev
时,Git新建了一个指针叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示当前分支在dev
上从现在开始,对工作区的修改和提交就是针对
dev
分支了,比如新提交一次后,dev
指针往前移动一步,而master
指针不变假如我们在
dev
上的工作完成了,就可以把dev
合并到master
上。Git怎么合并呢?最简单的方法,就是直接把master
指向dev
的当前提交,就完成了合并合并完分支后,甚至可以删除
dev
分支。删除dev
分支就是把dev
指针给删掉,删掉后,就剩下了一条master
分支 -
创建
dev
分支,然后切换到dev
分支$ git checkout -b dev Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:$ git branch dev $ git checkout dev Switched to branch 'dev'
git branch
命令会列出所有分支,当前分支前面会标一个*
号。$ git branch * dev master
git branch -r
列出远程库分支xyl@xyl:~/myGit$ git branch -r origin/master
-
合并分支
git merge
命令用于合并指定分支到当前分支$ git merge dev Updating d46f35e..b17d20e Fast-forward readme.txt | 1 + 1 file changed, 1 insertion(+)
-
删除分支
$ git branch -d dev Deleted branch dev (was b17d20e). # 删除后,查看branch,就只剩下master分支了: $ git branch * master
-
小结
查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创建+切换分支:git checkout -b <name> 合并某分支到当前分支:git merge <name> 删除分支:git branch -d <name>
合并冲突
master
分支和feature1
分支各自都分别有新的提交
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来
$ git merge feature1
Auto-merging test.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
查看文件内容,Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,需修改后在提交
$ git add test.txt
$ git commit -m "conflict fixed"
[master cf810e4] conflict fixed
用带参数的git log --graph
也可以看到分支的合并情况:
xyl@xyl:~/myGit$ git log --graph
* commit b9b7be6bd4c634211f6000773b47e703f183c937 (HEAD -> master)
|\ Merge: fd6debe 0cbc932
| | Author: 787119359 <787119359@qq.com>
| | Date: Thu Jul 18 14:38:01 2019 +0800
| |
| | conflict fixed
| |
| * commit 0cbc93203c1c1fed87bec96ec44a809c2c6b5611
| | Author: 787119359 <787119359@qq.com>
| | Date: Thu Jul 18 14:30:24 2019 +0800
| |
| | chongtu
| |
* | commit fd6debed120a74fb668ed797783f4bc2f086d6e2
|/ Author: 787119359 <787119359@qq.com>
| Date: Thu Jul 18 14:32:39 2019 +0800
|
| chongtu2
|
* commit a9442361e14210595f8acaa505c85d560c59c92e
| Author: 787119359 <787119359@qq.com>
| Date: Thu Jul 18 14:14:45 2019 +0800
|
| branch test
|
* commit 563435b6026633af9abf7287cae5a7858022dc52 (origin/master)
| Author: 787119359 <787119359@qq.com>
| Date: Thu Jul 18 13:32:14 2019 +0800
|
| push_test
分支管理
通常,合并分支时,如果可能,Git会用
Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用
Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
合并dev
分支,使用--no-ff
参数,表示禁用Fast forward
xyl@xyl:~/myGit$ git merge --no-f -m 'merge with no-f' dev
Merge made by the 'recursive' strategy.
test2.txt | 1 +
1 file changed, 1 insertion(+)
因为本次合并要创建一个新的commit,所以加上-m
参数,把commit描述写进去。
合并后,我们用git log --graph
看看分支历史
xyl@xyl:~/myGit$ git log --graph
* commit 76b69774fbd8821ec3c2c2606173618c91dc9b1b (HEAD -> master)
|\ Merge: b9b7be6 60f4aa0
| | Author: 787119359 <787119359@qq.com>
| | Date: Thu Jul 18 14:55:53 2019 +0800
| |
| | merge with no-f
| |
| * commit 60f4aa0c808c5259e9e3209d690a98f7512fec0e (dev)
|/ Author: 787119359 <787119359@qq.com>
| Date: Thu Jul 18 14:54:39 2019 +0800
|
| add merge
|
* commit b9b7be6bd4c634211f6000773b47e703f183c937
|\ Merge: fd6debe 0cbc932
| | Author: 787119359 <787119359@qq.com>
| | Date: Thu Jul 18 14:38:01 2019 +0800
| |
| | conflict fixed
| |
| * commit 0cbc93203c1c1fed87bec96ec44a809c2c6b5611
| | Author: 787119359 <787119359@qq.com>
| | Date: Thu Jul 18 14:30:24 2019 +0800
| |
| | chongtu
| |
* | commit fd6debed120a74fb668ed797783f4bc2f086d6e2
|/ Author: 787119359 <787119359@qq.com>
| Date: Thu Jul 18 14:32:39 2019 +0800
|
| chongtu2
小结:
合并分支时,加上
--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
删除分支
两种情况:
-
丢弃一个合并过的分支
git branch -d 分支名
-
强行丢弃一个未合并过的分支
git branch -D 分支名
创建标签
-
打标签
切换到需要大标签的分支上,然后敲命令
git tag <name>
-
查看所有标签:
git tag
注意: 标签按字母排序
-
在指定 commit 上打标签
git tag <标签名> <commit id>
-
用
git show <tagname>
查看标签信息$ git show v0.9 commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9) Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 18 21:56:54 2018 +0800 add merge diff --git a/readme.txt b/readme.txt ...
-
创建带说明的标签,
-a
指定标签名,-m
指定说明文字$ git tag -a v0.1 -m "version 0.1 released" 1094adb
-
小结
命令
git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id;命令
git tag -a <tagname> -m "blablabla..."
可以指定标签信息;命令
git tag
可以查看所有标签。
操作标签
-
删除标签
$ git tag -d v0.1 Deleted tag 'v0.1' (was f15b0dd)
-
推送标签到远程,使用命令
git push origin <tagname>
$ git push origin v1.0 Total 0 (delta 0), reused 0 (delta 0) To github.com:michaelliao/learngit.git * [new tag] v1.0 -> v1.0
一次性推送全部为推送到远程
git push origin --tage
-
删除远程库标签
先从本地删除
$ git tag -d v0.9 Deleted tag 'v0.9' (was f52c633)
然后从远程删除,删除命令也是push
$ git push origin :refs/tags/v0.9 To github.com:michaelliao/learngit.git - [deleted] v0.9
参考文献
他山之石
练习: 1. 创建 码云账号 2. 自己创建远程仓库 3. 同桌能够远程下载你的仓库 4. 开源中国是目前国内最大的开源技术社区,拥有超过400万会员,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
详细Git参考地址:
https://gitee.com/btchc/GIT_Document/tree/master
码云代码库
https://gitee.com/feibo2011_admin/fbcode
码云账号
https://gitee.com/feibo2011_admin/fibncci
Pro Git(中文版)
https://gitee.com/progit/index.html
开源中国
https://gitee.com/oschina
动画版git
https://oschina.gitee.io/learn-git-branching/
git码云帮助/GPG Key 生成与导出
https://gitee.com/help/articles/4248#article-header0