很早之前就听说过Git和Github,但是并没有很放在心上,觉得可能不是很重要,而且英文的界面让我直接劝退。心想等着以后需要的时候再学习应该也不晚,随着了解知识的增加,现在越来越觉得Git和Github的重要性。工欲善其事必先利其器,将一个高效实用的工具好好使用可以起到事半功倍的效果。
简介
Git历史
git是目前世界上最先进的分布式版本控制系统。
提到Git,就不得不提起Linux。
Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper授权Linux社区免费使用这个版本控制系统。2005年,开发Samba的Andrew试图破解BitKeeper的协议被BitMover公司发现了,于是BitMover公司要收回Linux社区的免费使用权。
于是,Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内 Linux系统的源码已经由Git管理了!
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
Git安装
Git 各平台安装包下载地址为:http://git-scm.com/downloads
GitGit 工作区、暂存区和版本库
Git和代码托管中心
我们总是将Git和Github联系在一起,Github就是Git 的一个代码托管中心。
代码托管中心的任务 : 维护远程库
- 局域网环境下
GitLab 服务器 - 外网环境下
Github
码云
Git命令行操作
本地库初始化
命令: git init
.git 目录中存放的是本地库相关的子目录和文件,不要删除和随便修改
设置签名
形式
- 用户名
- Email地址:
作用:区分不同开发人员的身份
这里设置的签名和登录远程库(代码托管中心)的账号,密码没有任何关系。
命令
-
项目级别/仓库级别
git config user.name ...... git config user.email ......
仅在当前本地库范围内有效
信息保存位置: .git/config -
系统用户级别
git config --global user.name ...... git config --global user.email ......
登录当前操作系统的用户范围
信息保存位置: ~/.gitconfig
优先级:
就近原则,项目级别优先于系统用户级别,二者都有时采用项目级别的签名。
Git基本操作
git clone 克隆
使用 git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。
git clone [url]
可以看到本地文件夹中多出了:
默认情况下,Git 会按照你提供的 URL 所指示的项目的名称创建你的本地项目目录。 通常就是该 URL 最后一个 / 之后的项目名称。如果你想要一个不一样的名字, 你可以在该命令后加上你想要的名称。
git add 添加
git add
命令可将工作区文件添加到暂/缓存区。
git status 状态查看
git status 以查看在你上次提交之后是否有修改。
可以查看工作区,暂存区状态
在GitTest目录下新建一个文件test.txt
红色字体表示文件未被追踪,使用git add test.txt 添加进入即可
现在再使用git status:
从暂存区撤销:
git rm --cached filename
git commit 提交
从暂存区提交到本地库
git commit filename
输入命令后会显示如下内容,类似于代码的注释
点击i,输入内容:
:wq
保存退出
也可以直接使用
git commit -m "My first commit new file:test.txt"
:set nu
显示行号
使用git commit
将文件从暂存区提交到本地库后,再次使用git status
会发现此时暂存区已经没有要提交的文件了。
如果将test.xml 修改一下再使用git status
撤销修改:git checkout – filename
git diff
执行 git diff 来比较文件差异。
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。
git diff [文件名]
- 将工作区中的文件和暂存区进行比较
git diff [本地库中的历史版本] [文件名]
- 将工作区中的文件和本地库历史记录比较
不带参数比较多个文件
修改test.txt文件后使用git diff
和之前的版本进行比较
- 尚未缓存的改动:git diff
- 查看已缓存的改动: git diff --cached
- 查看已缓存的与未缓存的所有改动:git diff HEAD
- 显示摘要而非整个 diff:git diff --stat
git log
只add 没有commit 的,log里面看不到记录
git log
多屏显示控制翻页
空格 向下翻页
b 向上翻页
q 退出
git log --pretty=oneline
git log --oneline
git reflog
HEAD@{移动到当前版本的步数}
git reset
git reset --hard [索引值]
(推荐)
基于索引值的操作,能退回到之前的状态
git reset --hard HEAD^
回退一步
git reset --hard HEAD^^
回退一步
git reset --hard HEAD~10
回退十步
reset 命令的三个参数
- –soft参数
- 仅仅在本地库看、移动HEAD指针
- –mixed参数
- 在本地库移动HEAD指针
- 重置暂存区(暂存区也发生变化)
- –hard参数
- 在本地库移动HEAD指针
- 重置暂存区(暂存区发生变化)
- 重置工作区(工作区发生变化)
找回删除文件
前提: 删除前,文件存在时的状态提交到了本地库
操作: git reset --hard [指针位置]
- 删除操作已经提交到本地库:指针位置指向历史记录
- 删除操作尚未提交到本地库:指针位置使用HEAD
创建一个a.txt文件,提交到git工作区后删除
再将被删除的文件添加到工作区
查看历史记录,然后后退到文件没有被删除的状态
git tag
如果创建工程达到一个重要的阶段,并希望永远记住那个特别的提交快照,可以使用 git tag 给它打上标签。
-a 选项意为"创建一个带注解的标签",会打开编辑器让你写入注解
git tag -a v1.0
如果我们要查看所有标签可以使用git tag
:
-
创建标签
git tag v1.0
-
查看已有标签
git tag
-
删除标签
git tag -d v1.1
-
查看此版本所修改的内容
git show v1.0
commit 91388f0883903ac9014e006611944f6688170ef4
Author: "syaving" <"819044347@qq.com">
Date: Fri Dec 16 02:32:05 2016 +0800
commit dir
diff –git a/readme b/readme
index 7a3d711..bfecb47 100644
— a/readme
+++ b/readme
@@ -1,2 +1,3 @@
text
hello git
+use commit
[root@Git git]# git log –oneline
91388f0 commit dir
e435fe8 add readme
2525062 add readme
git remote
查看当前配置有哪些远程仓库
git remote add [远程仓库别名] [远程仓库地址]
删除远程仓库:
git remote rm [别名]
分支管理
Git分支管理的本质是创建和移动指针
什么是分支?
版本控制过程中,使用多条线同时推进多个任务。
分支的好处
- 同时并行推进多个功能开发, 提高开发效率
- 各个分支再开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可。
分支的创建
下面的master 就是一个主分支
- 查看分支:
git branch -v
- 创建分支
git branch 分支名
切换分支
git checkout hot_fix
合并分支
如果再hot-fix分支上修改了文件并提交到工作区
此时hot-fix分支上的test.txt 文件内容为:
master 分支上的文件内容为:
将hot-fix 所作的修改合并到master分支
1. 切换到接受修改的分支(被合并,增加新内容)
git checkout [被合并分支名]
2. 执行 merger 命令
git merger [有新内容的分支名]
解决冲突
在合并分支的时候,不同的分支可能有不同的内容,如何解决问题呢?
在master分支和hot-fix分支上同时对test.txt 文件进行修改,然后add,commit
hot-fix分支下:
master分支下:
在hot-fix 分支上合并master分支上的内容:
此时查看test.txt文件,出现一些新增内容,这就是冲突的表现:
当前分支的内容:
bash <<<<<<< HEAD 现在在hot-fix分支进行修改 =======
另外一个分支的内容
bash 现在在master分支进行修改 >>>>>>> master
解决办法:
- 编辑文件,删除特殊符号,修改内容
- 使用git add
和git commit -m "提示内容" (后面不要添加文件名)
Github
先看一下远程库和本地库的一个简单关系图
创建一个Git远程仓库
首先在Giuhub上创建一个仓库
创建好了之后,自动进入下面的界面
复制地址,然后进入git bash界面
给地址起一个别名firsttest
查看远程库
其中fetch表示取回,push表示推送
将master分支推送到仓库中:
git push firsttest master
会提示你输入用户名和密码,输入后点击login
下面表示push成功
回到Github 的网站,刷新页面
克隆
将远程库克隆到本地库
- 打开Github网站,进入仓库,复制仓库地址
新建一个文件夹,在新文件夹目录下打开Git Bash 界面
输入
git clone [项目地址]
克隆时有以下效果
- 初始化本地库(不需要使用git init 初始化)
- 创建 远程地址别名 (默认为origin)
- 完整的把远程库下载到本地
push
在刚刚的文件夹的git bash中新建文件,git add, git commit后
使用下面命令将文件上传
git push origin master
pull
clone下载整个仓库,pull把某个分支下载到本地
pull = fetch + merge
fetch
是读操作,对于远程库来说不需要输入密码
git fetch [远程库地址别名] [远程分支名]
merge
是合并操作
git fetch [远程库地址别名/远程分支名]
一般先用fetch读取文件,确认好了之后再使用merge
SSH免密登录
切换到ssh目录
ssh-keygen -t rsa -C 邮箱账号
将生成的密钥复制
进入项目,点击use ssh,复制
打开git bash,添加地址别名:
git remote add origin_ssh git@github.com:Yx-u/FirstTest.git
此时使用push就不需要再使用密码了
可能出现的错误
git push到GitHub的时候遇到! [rejected] master -> master (non-fast-forward)的问题
error: failed to push some refs to 'https://github.com'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
解决办法:
1、git pull origin master --allow-unrelated-histories
把远程仓库和本地同步,消除差异
2、重新add和commit相应文件
3、git push origin master
4、此时就能够上传成功了
在Github上托管Android项目
配置Git
打开File/Settings
进行Git的配置
配置成功,会出现
配置Github
输入Github的账号和密码
托管项目
填写相关信息就可以了