Git&GitHub-初步使用
说明
本文章包含以下内容:
- Git - 安装和本地配置
- Git - 文件状态说明
- Git - 常用命令说明
- GitHub - 配置 SSH keys
- GitHub - 创建第一个 GitHub 仓库,并关联本地仓库、提交更改
- GitHub - 处理关联仓库时的冲突
- GitHub - 拷贝远程仓库到本地
- GitHub - 多种方式的总结
Git
安装和本地配置
安装:
- 下载安装包,安装,默认安装了
Git GUI Here和Git Bash Here - 需要在哪里使用
git,只需在文件夹空白处右键,选择Git Bash Here即可打开git命令行
本地配置:
// 必须设置邮箱和名字,否则无法 commit
$ git config --global user.email "user_email@example.com"
$ git config --global user.name "user_name"
Git 文件状态说明
nothing to commit, working director clean:工作区无文件,包括已跟踪和未跟踪Untracked files:未跟踪的文件,可以使用 add 跟踪文件changes to be commited:已暂存的修改,此时可以提交,且该版本的文件将会保存在 log 历史记录中changes not staged for commit:已跟踪的文件修改后未处于暂存区,须再次使用 add 命令使其进入暂存区
Git 常用命令
- 初始化 git
$ git init // 在现有项目中初始化 git
- 查看文件状态
$ git status // 查看当前文件状态
$ git status -s(或short) // 状态简览
- 跟踪文件
$ git add . // 跟踪所有文件,跟踪的文件将会进入暂存区;
$ git add hello.txt // 跟踪单个文件
$ git add *.js // 跟踪所有 .js 后缀的文件
- 提交
$ git commit // 提交修改,并在log中有记录
// 执行此命令会打开一个编辑器,编辑器中按下 Esc 后输入两个大写的 Z 退出编辑
$ git commit -m "commit_word" // 快捷提交,引号内是提交说明
$ git commit -a -m "commit_word" // 将跟踪的文件暂存,并快捷提交
- 推送
$ git push remote-name branch-name // 推送至远程仓库的指定分支
$ git push // 默认推送至 origin 仓库的 master 分支
// 若推送前项目的版本与clone的时候有差别(在你clone之后,push之前有其他人已经push),要先pull拉取更改,合并操作后再push(若有冲突还要解决冲突等操作)
- 拉取
$ git push remote-name branch-name // 从远程仓库的指定分支拉取
$ git push // 默认拉取 origin 仓库的 master 分支的内容
- 查看提交历史
$ git log // 查看所有提交历史
$ git log -p -2 // 显示每次提交的差异,并且只显示最后两次的提交
$ git log stat // 显示每次提交的简略信息
// 提示:大写的 Q 退出 log 命令
// 提示:可以为提交模式设置别名 alias
- 仓库管理
$ git remote // 列出所有指定的远程仓库简写
$ git remote -v // 显示远程仓库的简写及其 URL
$ git remote add <short-name> <url> // 添加远程仓库,并指定别名
$ git fetch <short-name> // 拉取远程仓库中你没有的信息;该命令会拉取至本地仓库,需手动合并
$ git remote show <remote-name> // 列出远程仓库的 URL 与跟踪分支的信息
$ git remote rename <old-name> <new-name> // 更改远程仓库名字
$ git remote rm <remote-name> // 删除指定的远程仓库
- 分支管理
$ git branch // 查看分支
$ git checkout <branch-name> // 切换至指定分支
$ git checkout -b <branch-name> // 创建并切换至分支
$ git branch <branch-name> // 创建分支,但要手动切换
$ git branch -d <branch-name> // 删除分支
GitHub 的使用
配置 SSH keys
- 打开命令行,输入命令
ssh-keygen生成密钥 - 在 C 盘(C:\Users\你的用户名.ssh)找到
id_rsa.pub公钥文件,用记事本或其他方式打开文件拷贝里面所有的内容 - 在 GitHub 操作:
Settings-->SSH and GPG keys-->New SSH key--> 粘贴密钥(title可以忽略) -->Add SSH key
创建第一个 GitHub 仓库,并关联本地仓库、提交更改
1)打开 GitHub 主页,点击 New,创建仓库(这里我没有勾选创建 README 文件):

2)创建完成
由于没有创建 README 文件,当前的仓库是完全空的,然后该仓库页面提示了可以进行的操作:
- 创建一个本地仓库,然后关联推送到远程仓库
- 将已有本地仓库,关联推送到远程仓库

说明:
- 仓库地址:点击红色圈圈可以复制该仓库的地址,左边一行为仓库地址,有
HTTPS和SSH两种格式,都可以使用 - 本地仓库:用
git init在本地创建的仓库,远程仓库就是刚刚在GitHub创建的hello-world仓库 - 本地仓库必须要关联远程仓库之后,才能推送本地文件和更改到远程仓库
3)本地仓库的创建
- 创建一个文件夹,在文件夹种打开
Git命令行,使用git init初始化Git仓库:

- 接着在文件夹内创建文件
hello.txt,随便写点内容,使用git add hello.txt添加文件到暂存区:

- 提交修改,使用
git commit输入提交说明:

- 使用
git remote add origin关联远程仓库:

- 使用
git push推送至远程仓库:

- 至此,GitHub 仓库已经存储了本地仓库推送的内容,打开 GitHub 仓库,发现一个提交记录:

- 点击进去查看,可以看到提交的信息,和本地
git log显示的是一样的:

处理关联仓库时的冲突
当关联仓库(git remote add origin)时,若远程仓库和本地仓库有不一样的提交历史,就会产生冲突;下面记录这种冲突产生的原因以及解决方法。
- 重新创建一个仓库时,同时创建
READEME文件:

- 此时仓库就不是空仓库了,其中包含了一次提交:

- 点击查看,看到一次初始化提交:

- 复制仓库的地址:

- 创建本地仓库,但是在推送时出现了问题:

仔细想一下,发现远程仓库和本地仓库的文件结构不一样,当推送的时候,git 并不知道我们想要做什么操作(复制还是覆盖、更新);此时先尝试执行 git pull 将远程仓库的内容拉取到本地,结果提示 “没有共同的提交、没有当前分支的跟踪信息” 等信息:

也就是说本地仓库与远程仓库没有向远程仓库提交过信息,不能直接使用 git pull;接着再尝试执行红框中的命令,其中 <branch> 为需要拉取的远程仓库的分支(没有创建分支时远程仓库只有 master 分支),最后的 master 为本地仓库的分支(本地仓库的默认分支也是 master);结果显示 “本地仓库的 master 分支已经跟踪远程仓库的 master 分支”:

再尝试执行 git pull 拉取远程仓库的更改时,提示 “拒绝合并不相关的历史”:

这里的意思是远程仓库和本地仓库有不相关的提交历史:初始化远程仓库添加 READEME 文件时有了一次提交,而本地仓库也有一次提交;由于是个人仓库,所以这里可以执行命令 git pull --allow-unrelated-histories 来合并不相关的提交历史(输入该命令时实际会产生一次 merge,会弹出一个编辑器要求输入提交信息,如果是 Vim 编辑器:输入提交信息后,按下 ESC 后再键入两个大写的 Z,会退出编辑器并且提交):


最后就可以推送到远程仓库了:

- 在
GitHub上查看,文件已经推送成功了,并且提交记录变成了三条:

- 查看提交记录,记录是由下至上的(最上面的是最新的):
- 最下面的是初始化仓库的提交
- 再上一条是本地仓库的提交记录
- 最上面的是
merge操作

也就是说,本地仓库的提交历史和远程仓库提交历史合并了,同时在本地执行 git log 命令也能查看从远程仓库合并的提交历史。
当然,也有一种更为暴力的提交方式:git push origin master -u -f,这种方式会强制将本地仓库的内容推送到远程仓库,并且会清空远程仓库的提交树,所以应该谨慎使用。
拷贝远程仓库到本地
- 执行
git clone命令拷贝远程仓库(这里将仓库名重命名为clone-hello):

- 进入文件目录,创建一个
local-hello.txt文件,依次执行命令:

- 在 GitHub 中查看仓库,发现文件已经推送上来了:

- 在提交记录中,也看到了本地的提交:

多种方式的总结
关联远程仓库和本地仓库:
- 当远程仓库和本地仓库没有不相关的提交历史时,关联仓库后提交并推送即可
- 当远程仓库和本地仓库有不相关的提交历史时,需要处理它们不相关的提交历史(或者合并),然后再推送并提交
最简单的方式:
- 创建远程仓库后,先不要在远程仓库作任何更改(避免产生不相关的提交历史)
- 使用
git clone拷贝到本地仓库 - 在本地仓库添加、修改文件
- 提交并推送到远程仓库
最暴力的方式: git push origin master -u -f,它适用于:
- 初始化仓库
- 提交树混杂,需要清空提交树
- 你很清楚自己在做什么
常见冲突及处理
git clone 拷贝到本地仓库、修改代码、提交代码,但推送时提示冲突:
- 一种情况是,在你执行
git clone命令后,有人(可能是你也可能是仓库的协作者)在远程仓库修改了某些文件(比如修改了README),而本地的这些文件跟远程仓库的不相同。这种情况的解决比较简单,先执行git pull拉取远程仓库(git 会智能地将文件的改动拉取到本地),再执行git push推送即可。 - 另一种情况是,当
git pull之后,git push依旧提示有冲突未处理(并且会将文件从git工作区删除):这是因为那人在远程仓库修改与你提交的修改都作用了同样的文件(一般开发时会分模块开发,出现的情况较少,但也仍有可能发生),此时git不知道要听从哪个人的修改。解决方法是手动解决冲突:打开产生冲突的文件(文件里面会标识<<<<<<< HEAD的下一行就是本地仓库的改动,再接着=======以下是远程仓库的改动,最后还有>>>>>>>加上远程仓库的提交哈希串标识),选择性删除代码,并删除上面多出来的标识,重新一套提交流程(因为文件从git工作区删除,需要重新add,commit,push);当然,也可以选择不删除文件的内容或标识而直接重新一套提交流程将更改提交,但是两个文件的内容和标识都会显示在文件中(有可能会令代码不能工作)。
Git&GitHub-初步使用的更多相关文章
- git/github学习笔记
郑重提示,本文来自这里,如果喜欢,请关注原作者. 1. git 版本控制系统 相比CVS\SVN优势: - 支持离线开发,离线Repository- 强大的分支功能,适合多个独立开发者协作- 速度块 ...
- 浅谈自我对git的初步认识
本学期我们新增了一门课程,那就是软件工程,不知道为什么,感觉有种莫名的高大上.哈哈!难道是这个名称太抽象了吗?这个问题我感觉到后来肯定就明白了. 第一次博客,感觉好紧张哦,嘿嘿!老师让我们谈谈对git ...
- git/github 使用
原文:http://www.cnblogs.com/fnng/archive/2011/08/25/2153807.html git/github学习笔记 Posted on 2011-08-25 2 ...
- git的初步使用---本地代码库的使用和提交
git的初步使用---本地代码库的使用和提交 git是一个好东西,但对于新手来说,这个工具并不好使用,因为它里面涉及到很多东西,而这些东西新手一时间是无法理解的.不幸的是,本人就是新手一枚,所以,这里 ...
- Git的初步学习
前言 感谢! 承蒙关照~ Git的初步学习 为什么要用Git和Github呢?它们的出现是为了用于提交项目和存储项目的,是一种很方便的项目管理软件和网址地址. 接下来看看,一家公司的基本流程图: 集中 ...
- git &github 快速入门
本节内容 github介绍 安装 仓库创建& 提交代码 代码回滚 工作区和暂存区 撤销修改 删除操作 远程仓库 分支管理 多人协作 github使用 忽略特殊文件.gitignore 1.gi ...
- git+github上传与管理
1.首先下载并安装git,方便管理github上的代码 https://git-scm.com/downloads 2.然后点击安装好的git bash(注册好自己的github) git confi ...
- Git/GitHub 初用体验与总结
Git,一个神奇而又陌生的东西,居然到现在才去了解它,就像有一位仁兄说的,现在不会用Git真的都不好意思说自己搞IT的. 简单的讲,这Git是目前最先进的分布式版本控制系统,和他相对应的就是众所周知的 ...
- git github简单知识
Git 常用命令 git init here -- 创建本地仓库(repository),将会在文件夹下创建一个 .git 文件夹,.git 文件夹里存储了所有的版本信息.标记等内容 git remo ...
- Git/Github + TortoiseGit 使用教程
前言 Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理. 在github上有很多优秀的项目,一个伟大的学习宝库.本文分享使用tortoisegit对github/ ...
随机推荐
- base64编码 的 图片 另存为下载
功能描述: 有一段base64字符串的图片,将其保存下载为png图片! 可以: 直接 a 链接下载: <a id="tttt" download="1.jpg& ...
- easyui 删除行的时候 引起的 bug
问题场景 easyui 编辑里 有删除行的功能 文档提供的方法如下 $aplgrid为grid 的容器 ind 为当前行的索引 $aplgrid.datagrid('deleteRow', ind); ...
- nyist 20 吝啬的国度(dfs)
吝啬的国度 题目描述: 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来. 现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市, 必须经过的前一 ...
- Python语言下图像的操作方法总结
本章主要讲解 图像的读取方式.灰度化操作.图像转化为矩阵的方法 假设 strImgPath是图像的路径, img对象将图片读入到内存中 读取图像的第一种方式:skImage from skimage ...
- 【OBJC】数字转中文大写
博客园都不知道怎么外链图片…… - (void)numToString:(double)num{ ; NSMutableString *szChMoney = [[NSMutableString al ...
- Oracle基础之Merge into
Merge into语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句. 通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDA ...
- Linux 虚拟机虚拟网卡问题导致无法连接问题
问题描述 当 Linux 虚拟机启动时,通过串口输出或者启动日志, 观察到虚拟网卡启动或者初始化故障, 导致虚拟机无法连接. 问题分析 常见的超时报错范例如下: CentOS 复制 Bringing ...
- T-SQL语法学习一(持续更新)
T-SQL语法学习(一) 第一节 不常用语句 不常用语句-指的是一些不常用的查询语句,不针对业务数据查询 SET STATISTICS IO ON(用于查询逻辑读取次数,物理读取次数) 图片 sele ...
- 用WCAT进行IIS压力测试
用WCAT进行IIS压力测试 分类: javascript专辑 IT信息化 2008-10-13 16:56 5754人阅读 评论(1) 收藏 举报 iis测试服务器microsoft脚本网络 如何建 ...
- Elasticsearch 架构原理
为什么要学习架构? Elasticsearch的一些架构设计,对我们做性能调优.故障处理,具有非常重要的影响.下面将从Elasticsearch的准实时索引的实现.自动发现.rounting和repl ...