git & github 菜鸟笔记

1、概念:
最先进的分布式版本控制系统
文件修改该提交的内容:---版本 文件名 用户 说明 日期
GitHub网站上线了,它为开源项目免费提供Git存储
--CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统
集中:代码在中央服务器上,获取最新,编辑,上传;互联网网速可能慢;
分布:没有“中央服务器”,每人有完整的版本库,有一台充当“中央服务器”的电脑,作用仅仅是用来“交换”修改。

2、安装:
Linux上安装Git
测试:$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./config,make,sudo make install这几个命令安装就好了。

Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像)
安装完成后,在开始菜单里找到“Git”->“Git Bash”;

安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

3、版本库
仓库,repository;简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
mkdir mygit 创建目录;
pwd 显示当前目录;
git init命令把这个目录变成Git可以管理的仓库
--目录默认是隐藏的,用ls -ah命令就可以看见。
把文件添加到版本库
--只能跟踪文本文件的改动 (Word格式是二进制格式)
文件放在仓库目录或子目录下,
$ git add readme.txt 把文件添加到仓库
$ git commit -m "wrote a readme file" 把文件提交到仓库
-- -m后面输入的是本次提交的说明,从历史记录里方便地找到改动记录。
-- 1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容)。
可以add多个文件,一次commit;
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

4、修改 回退
git status命令可以让我们时刻掌握仓库当前的状态
git diff 看看具体修改了什么内容 ,查看difference
快照在Git中被称为commit;
git log 历史记录
--pretty=oneline参数:
commit id(版本号)
HEAD表示当前版本
HEAD^,上上一个版本就是HEAD^^ ,HEAD~100;
$ git reset --hard HEAD^ 退回上个版本
cat 查看;
$ git reset --hard 1094a 指定回到特定 id 的某个版本;
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:改为指向add distributed:
git reflog用来记录你的每一次命令;

5、工作区、暂存区
工作区(Working Directory)
版本库(Repository) 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
Untracked files:从来没有被添加过

6、管理修改
Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。

1.git diff commit_id_1 commit_id_2
用来比较2个commit之间区别

2.git diff
检查的是工作区与暂存区的差异【没add之前】

3.git diff --staged
暂存与仓库的差异【add之后,commit之前】

4 git diff HEAD 工作区 与 版本库

-----------------------版本库--------------------------------------------
| |
git diff --cached |
| |
-------------暂存区---------------------- git diff HEAD
| |
git diff |
| |
-----工作区--------------------------------------------------------------

7、撤销修改
git checkout -- file可以丢弃工作区的修改:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:

8、删除文件
rm命令删本地,
git add/rm 把本地的删除 放到缓存区;
git commit -m "..." 执行缓存区内容;
--git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

9、远程仓库
GitHub,提供Git仓库托管服务,本地Git仓库和GitHub仓库之间的传输是通过SSH加密的。
第1步:创建SSH Key; 打开Shell(Windows下打开Git Bash),
$ ssh-keygen -t rsa -C "youremail@example.com"
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件;
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
GitHub允许你添加多个Key。免费托管的Git仓库,任何人都可以看到;

添加远程库
本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,。
找到“Create a new repo”按钮,创建一个新的仓库:
接着有3种选择: 1新建本地库,关联到github, 2已有本地库关联,3从别人那关联
关联一个远程库: git remote add origin https://github.com/oscarDacude/xx.git
推送master分支: git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

提示出错信息:fatal: remote origin already exists.
--删除 $ git remote rm origin

克隆 $ git clone https://github.com/oscarDacude/hellogit.git

GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

10、分支管理
你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。
主分支,即master,HEAD严格来说不是指向提交,而是指向master,HEAD指向的就是当前分支。
创建新的分支,例如dev时,Git新建了一个指针叫dev,
删除dev分支就是把dev指针给删掉,
--Fast-forward信息,这次合并是“快进模式”

原文地址:https://www.cnblogs.com/dacude/p/10045981.html