Git学习笔记 -- 安装git、创建版本库、时光穿梭、远程仓库
一、Git的安装
在window系统上安装:从https://git-for-windows.github.io下载,然后按默认选项安装即可;
安装完成后,在“桌面”上右击,在弹出的菜单中选择“Git Bash”;
在蹦出一个类似命令行窗口的东西里面输入git命令:
$ git --version //查看git安装版本
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"//因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
$ git config user.name "yourname" $ git config user.email "xxx@ example. com"
通过使用 git config -l 列出在所有配置文件里共同查找的所有变量的设置值。
可以通过–unset选项来移除设置具体的配置项
$ git config --unset --global user.name
二、创建版本库
什么是版本库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建版本库的步骤:
- 选择一个合适的地方,新建一个目录
$ mkdir learnGit //创建目录 $ cd learnGit //进入该目录 $ pwd //命令用于显示当前目录
- 通过git init命令把这个目录变成Git可以管理的仓库
$ git init Initialized empty Git repository in /Users/michael/learngit/.git/ //初始化一个空的git仓库在...目录下
此时,learngit目录下有隐藏的.git目录,可以通过 ls -ah 命令,来查看learngit目录下所有文件(隐藏和未隐藏的)
把文件放到版本库
把文件放到版本库的操作情境如下:
在learngit目录里面新建一个文件,文件名为readme.txt,txt文件的内容如下:
Git is a version control system. Git is free software.
第一步,用命令git add告诉Git,把文件添加到仓库
$ git add readme.txt
用命令git commit告诉Git,把文件提交到仓库
$ git commit -m "wrote a readme file"
运行结果如下:
[master (root-commit) cb926e7] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt//git commit命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了两行内容(readme.txt有两行内容)。
git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录
commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt $ git add file2.txt file3.txt $ git commit -m "add 3 files."
三、修改版本库文件
修改文件之后:
- git status //查看仓库当前的状态
- git diff “指定文件名”
- git diff HEAD – “指定文件名” //查看指定文件的修改内容(修改前、修改后文件内容对比)
查看修改的文件内容后,该改改,该加加,最后再提交文件(add和commit)
像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
四、版本回退
查看提交历史记录
- git log //查看提交历史
- git log --pretty=oneline //–pretty=oneline参数 只显示commit id(版本号)
一大串类似3628164…882e1e0的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
$ git log --pretty=oneline
7f44d6c6601dc6f769991144e322234cc48dbac6 (HEAD -> master, origin/master) append GPL
a11d57e4441b278305d6102263e6fc14534fbf6f readme added distributed info
9dac2d1c05c87943664ccdb1d115a3a34e9e247a edit readme.txt file
6be118b4e1cbd8539abc4191b7572f69d862c962 add other readme.txt
1943eb06c596ed9f7edf33fd2a3223141eac8b8e add a git Note file
af58caf89cc1b573f4e9a09fe299b92406fd6de3 wrote a readme file
回退到指定历史版本
在Git中,用HEAD表示当前版本,从上面可以看出,最新的提交是 7f44d…c48dbac6
上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ , 当然往上100个版本写100个^比较容易数不过来,所以写成 HEAD~100
git reset //回退到之前版本,两种方法:
- $ git reset --hard HEAD^
- $ git reset --hard commit_id //版本号没必要写全,前几位就可以了
你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?
查看命令历史
- git reflog //用来记录你的每一次命令,查看命令历史
五、工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区。
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区
暂存区就像购物车,没到付款的时候你都不确定购物车里的东西全部都是要的。。。每拿一件商品就付一次款。。。那才麻烦大了
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
例子:对readme.txt做个修改,然后,在工作区新增一个LICENSE文本文件(内容随便写)
先用git status查看一下状态:
Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked现在,使用两次命令git add,把readme.txt和LICENSE都添加后,用git status再查看一下
现在,暂存区的状态就变成这样了:
- 所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
- 现在版本库变成了这样,暂存区就没有任何内容了:
六、管理修改
- Git比其他版本控制系统设计得优秀的点在于:Git跟踪并管理的是修改,而非文件
- Git是如何跟踪修改的:每次修改,如果不add到暂存区,那就不会加入到commit中。
七、撤销修改
当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时
git checkout 可以丢弃工作区的修改:
- git checkout – file
– 很重要,没有 --,就变成了“切换到另一个分支”的命令
命令 git checkout – readme.txt 意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
当你不但改乱了工作区某个文件的内容,还添加到了暂存区,想丢弃修改时
分两步:
- 第一步用命令git reset HEAD file,就回到了上面一个场景,
- 第二步按上面一个场景操作。
已经提交了不合适的修改到版本库时:
想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
八、删除文件
在Git中,删除也是一个修改操作
你新建了一个文件(test.txt),提到交了版本库,然后你把这个文件删除了:
$ rm test.txt
有两种删除的可能:
一种是你真的要删除,另一种是你误操作:
真删除或误删前,可通过git status查看下仓库状态
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
- 如果是真要删除:
那就用命令git rm删掉,并且git commit
$ git rm test.txt
rm 'test.txt'$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt1 file changed, 1 deletion(-)delete mode 100644 test.txt
- 如果是误删除:
那就可以通过git checkout – file 很轻松地把误删的文件恢复到最新版本
$ git checkout -- test.txt
git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
九、
创建SSH
- 打开Git Bash,创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
然后一路回车,使用默认值即可;
之后顺利的话,能在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
2. 登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
获取公有密钥
cat ~/.ssh/id_rsa.pub
添加远程库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库
在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
- 现在我们根据GitHub的提示,在本地的learngit仓库下运行命令
$ git remote add origin git@github.com:shiaijuan/learngit.git
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
- 把本地库的所有内容推送到远程库上
$ git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令
$ git push origin master
注意点:
如果执行git remote add origin …,出现错误:
fatal: remote origin already exists
则执行以下语句:
git remote rm origin
再往后执行
git remote add origin … 即可。
在执行git push origin master时,报错:
error:failed to push som refs to…
则执行以下语句:
git pull origin master
//先把远程服务器github上面的文件拉先来,再push 上去。引起该错误的原因也可能是目录中没有文件,空目录是不能提交上去的
从远程库克隆
假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
- 在github上建一个仓库
- 勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件
- 用命令git clone克隆一个本地库(克隆本地库之前,你要先确认本地库位置)
$ git clone git@github.com:shiaijuan/gitskills.git
给已经存在的项目添加git
前提:先去gitlab或github网站上创建一个新项目,完毕后记得添加.ignore;
1、打开终端,cd到已存在项目的目录,输入以下命令行,初始化一个本地仓库:
git init
2、创建 .gitignore 文件,在里面添加不要上传的文件的相应的匹配正则
/node_modules
/dist
3、输入以下命令,把工程所有文件都添加到该仓库中(千万别忘记后面的.号!!!):
git add .
4、输入以下命令,把文件提交到本地仓库:
git commit -m "Initial commit" //Initial commit是提交代码的说明文字
如果出现nothing to commit, working directory clean说明你已经提交好了。
5、输入以下命令,添加远程仓库地址:
输入:git remote add origin + 你的仓库地址
例如:git remote add origin https://git.oschina.net/hhh/GitDemo.git
如果出现fatal: remote origin already exists.说明你已经添加过远程仓库了,输入以下命令删除远程仓库:git remote rm origin,然后再次执行第5步。
6、输入以下命令,把文件提交到远程仓库:
git push -u origin master
然后你就等着它提交完成就完事了。
7、假如第6部失败的话再执行git pull –rebase origin master命令,然后再执行git push -u origin master即可上传成功。
8、完事后假如还是不能拉代码的话再重启项目执行git branch –set-upstream master origin/master即可。
9、报错:Updates were rejected because the tip of your current branch is behind
解决方法:
有如下几种解决方法:
- 使用强制push的方法:
$ git push -u origin master -f
这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候。
- push前先将远程repository修改pull下来
$ git pull origin master
$ git push -u origin master
- 若不想merge远程和本地修改,可以先创建新的分支:
$ git branch [name]
然后push
$ git push -u origin [name]
小结
- 要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
- 关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
- 此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改
问题
- git 报错—fatal: Not a git repository
- fatal: Not a git repository (or any of the parent directories): .git。提示说没有.git这样一个目录
- 解决办法如下:git init就可以了!
Git学习笔记 -- 安装git、创建版本库、时光穿梭、远程仓库相关推荐
- Git 的安装和创建版本库 。
Git 的优点就不再多说了 .直接进入正题吧 . 安装Git 首先可以尝试输入 Git 看看有没有反映 . $ git The program 'git' is currently not insta ...
- 本地Git下载安装以及创建版本库、远程Github
Git下载安装 windows:在git官网下载安装程序即可.点击git bash,出现命令行窗口说明安装成功. CentOS 7:root权限下,输入yum install git.如果非root权 ...
- Git学习(1)-本地版本库的创建
我用的是Git-2.14.3-64-bit版本,在windows64位上运行的,把软件分享下链接:http://pan.baidu.com/s/1jIoZ7Xc 密码:13q2. 安装及配置自行百度, ...
- 【GIT 基础篇二】创建版本库与提交
最近在项目过程中,着实是犯懒了,虽然公司使用git管理,但是感觉自己已经严重的依赖页面工具了,这次正好借助公司不是很忙,把git常用的命令整理记录一下,今天我们主要就是整理创建仓库以及修改提交功能. ...
- Git学习笔记:Git简介
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 目 ...
- GIT学习笔记(git工具安装与配置)
- 【学习总结】Git学习-参考廖雪峰老师教程三-创建版本库
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- Git学习笔记:远程仓库
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- Git 的安装与初次使用 —— Git 学习笔记 03
Git 的安装与初次使用 -- Git 学习笔记 03 Git 的安装与初次使用 -- Git 学习笔记 03 安装 Git 在 Linux 上安装 在 Windows 上安装 初次运行 Git 前的 ...
最新文章
- 计算机办公高级试题,高级办公软件试题及解答
- html5做咖啡网页素材,HTML5/CSS3咖啡品类切换动画
- Linux环境编译时报错/lib64/libdl.so.2: could not read symbols: Invalid operation
- 怎么得到16位校检和-c语言,16位CRC校验C语言算法.pdf
- 在线编辑Excel——插入图表
- python大漠插件官网视频教程_python调用大漠插件教程01注册大漠
- 关于名为民间借贷实为诈骗案件的讨论
- Ember controller
- dell进入u盘启动模式_Dell戴尔笔记本bios设置u盘启动详细步骤
- python问题unindent does not match any outer indentation level在pycharm平台的解决方法
- 【mysql】In aggregated query without GROUP BY, expression #1 of SELECT list contains ......
- 姜汝祥是个骗子吗_我是个骗子你是?
- 新点互联互通_新点驱动(江苏省互联互通版)
- js原生拖拽的两种方法
- 网络原理考点之无线网络应用层协议
- PicPick的安装方法
- 注册一级建造师和注册二级建造师有什么区别
- Matlab 元胞数组和结构体
- 从与迪思杰签约 看浪潮主机生态如何布局?
- 关于图灵JAVA一百道面试题总结