您的位置:首页 > 运维架构 > 网站架构

我的git学习记录------------从廖雪峰老师网站的学习总结

2016-03-25 18:03 471 查看
https://code.csdn.net/ csdn git平台

这篇文章只用作自我学习,部分参考来自廖雪峰老师网站

mkdir 路径/文件名(d:/test) 创建文件夹

cd 路径/文件名(cd d:/test) 进入文件夹

pwd 显示当前所出位置的路径 确保全英路径(注意)

cd 仓库(repository)文件路径 eg(cd d:/test)

git init 初始化空的仓库,把这个目录变成git可以管理的仓库

编写一个readme.txt文件,内容如下:

Git is a version control system.

Git is free software. 放到learngit目录下

git add告诉Git,把文件添加到仓库

git add readme.txt 没有任何显示,这就对了(readme.txt必须存在)

git add . 添加当前所有更改到下一个commit

命令git commit告诉Git,把文件提交到仓库

git commit -m "wrote a readme file" //说明提交了什么

git commit -m '说明' eg(git commit -m 'my first text')

git commit命令,-m后面输入的是本次提交的说明,

可以输入任意内容,当然最好是有意义的

为什么Git添加文件需要add,commit一共两步呢?

因为commit可以一次提交很多文件,即你可以多次add,以此commit

添加到git库成功后,手动去修改txt的信息

使用$git status命令看看结果,他会告诉你那个文件发生了改变却没有提交

git status命令可以让我们时刻掌握仓库当前的状态,

上面的命令告诉我们,readme.txt被修改过了,

但还没有准备提交的修改。

git diff readme.txt 看看具体修改了什么内容

然后就可以提交修改了 $ git add readme.txt 没有提示说明成功

commit之前试用下git status命令可以看到readme待提交

然后提交 $ git commit -m "fir modify"

提交后,我们再用git status命令看看仓库的当前状态

你会看到 noting to commit

下面重复修改一次,内容如下:

Git is a distributed version control system.

Git is free software distributed under the GPL.

如果你想使readme恢复到修改前的版本或者查看修改前的版本

我们先看下历史记录 git log

git log命令显示从最近到最远的提交日志

如果嫌输出信息太多,看得眼花缭乱的,

可以试试 git log --pretty=oneline 命令 只显示说明信息

你看到的一大串类似3628164...882e1e0的是commit id(版本号)

下面准备把readme.txt回退到上一个版本

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交

上一个版本就是HEAD^ ,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

现在我们回退到上一个版本$ git reset --hard HEAD^

此时我们git log --pretty=oneline 命令

你会发现最新的那个版本已经看不到了,突然不想修改了,想恢复到最新的版本怎么办

只要命令窗口没有关掉,可以根据commit id指定回到未来的某个版本

例如$ git reset --hard 283d9078//id号的前几位,不用写全

然后就又恢复到最新的版本了

现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,

想恢复到新版本怎么办?找不到新版本的commit id怎么办?

在Git中,总是有后悔药可以吃的。

当你用$ git reset --hard HEAD^回退到add distributed版本时,

再想恢复到append GPL,就必须找到append GPL的commit id。

Git提供了一个命令git reflog用来记录你的每一次命令

你就可以根据commit是的说明,定位到commitID了

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

工作区(Working Directory)就是你在电脑里能看到的目录,比如我的test文件夹就是一个工作区

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,

还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,

现在,git commit就是往master分支上提交更改。

所以,git commit -m '' 是把暂存区的东西提交到分支,

而git add是把工作区的改变提交到暂存区

注意理解这个逻辑

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

即git记录了修改,而不是记录文件

$ cat readme.txt 浏览文件内容 着重理解暂存区的概念,

掌握add和commit操作的区域以及作用

撤销修改

git checkout -- file 可以丢弃工作区的修改 意思就是,把readme.txt文件在工作区的修改全部撤销

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,

我们在后面的分支管理中会再次遇到git checkout命令。

删除文件

在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交

$ git add test.txt

$ git commit -m "add test.txt"

git remote (github上对应仓库的url) 例子如下

git remote git@github.com:fenghuayangyi/hello-world.git

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

$ rm test.txt

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了

现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:

$ git rm test.txt

$ git commit -m "remove test.txt" 文件就从版本库中被删除了。

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt

Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。

肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。

一台电脑上也是可以克隆多个版本库的,只要不在同一个目录下。

实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,

并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。

这样就实现了团队的版本控制

GitHub这个神奇的网站,就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,

如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C 'lanfengjin1@126.com' 邮件地址换成你自己的邮件地址

第一次停顿,敲回车,然后两次输入密码

就能在你的windows主目录看到.ssh文件夹(主目录就是你的c盘users文件夹下)

一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件

这两个就是SSH Key的秘钥对,

id_rsa是私钥,不能泄露出去,

id_rsa.pub是公钥,可以放心地告诉任何人

第2步:登陆GitHub,打开“settings”,“SSH Keys”页面:

填上任意Title,在Key文本框里粘贴你本地.ssh目录下的id_rsa.pub文件的内容

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,

而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,

只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。

如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。

***另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。这个方法我们后面会讲到的,相当简单,公司内部开发必备。

添加远程库

在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,

又可以让其他人通过该仓库来协作

登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库

在Repository name填入test3,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库.

目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。

我们根据GitHub的提示,在本地的test3仓库下运行命令:

If you're updating to use HTTPS, your URL might look like:

$ git remote add origin https://github.com/shlly/test3.git
If you're updating to use SSH, your URL might look like:

或者$ git remote add origin git@github.com:michaelliao/learngit.git

git remote add (github上对应仓库的url) 例子如下

git remote add git@github.com:fenghuayangyi/hello-world.git

git remote add origin (github上对应仓库的url) 例子如下

git remote add origin git@github.com:fenghuayangyi/hello-world.git

请千万注意,把上面的shlly替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,

因为你的SSH Key公钥不在我的账户列表中。

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的

下一步,就可以把本地库的所有内容推送到远程库上:

$ git push -u origin master

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,

还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样

在这个过程中会出现失败 fatal unable to access我的是网络的原因,还有就是使用了https,我的建议是使用ssh方式,下面有二者转换的说明

从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master

SSH警告

当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:

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使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。

GIT代理设置

查看是否设置

git config --global http.proxy

设置代理

git config --global http.proxy 127.0.0.1:8582

取消代理

git config --global --unset http.proxy

使用上面命令查看,原来GIT在安装后自动设置了一条 127.0.0.1 的代理。

Switching remote URLs from SSH to HTTPS

$git remote -v

$git remote set-url origin https://github.com/shlly/test3.git
$git remote -v

Switching remote URLs from HTTPS to SSH

$git remote -v

$git remote set-url origin git@github.com:shlly/test3.git

$git remote -v

git pull origin master(拉下来 origin master 第一次配置本机git)

当同步的库内有文件,需要线上本地同步的时候需要此命令

ssh -T git@github.com 上传文件到github

git pull origin master

git push -u origin master

git add .

git commit -m '123' 文件说明

git push origin master

从远端中心repository那里git clone 到本地

git clone git@...的path

git status 查看哪些文件修改了

git add . 告诉git,这些file加到branch

git commit -m " " 提交到branch

从远程获取一个git分支
– git-pull

与git-clone不同, git-pull可以从任意一个git库获取某个分支的内容。用法如下:

git-pull username@ipaddr: 远端repository名 远端分支名:本地分支名。这条命令将从远端git库的远端分支名获取到本地git库的一个本地分支中。其中,如果不写本地分支名,则默认pull到本地当前分支。

需要注意的是,git-pull也可以用来合并分支。 和git-merge的作用相同。 因此,如果你的本地分支已经有内容,则git-pull会合并这些文件,如果有冲突会报警。
将本地分支内容提交到远端分支 – git-push

git-push和git-pull正好想反,是将本地某个分支的内容提交到远端某个分支上。用法:

git-push username@ipaddr: 远端repository名 本地分支名:远端分支名。这条命令将本地git库的一个本地分支push到远端git库的远端分支名中。

需要格外注意的是,git-push好像不会自动合并文件。这点我的试验表明是这样,但我不能确认是否是我用错了。因此,如果git-push时,发生了冲突,就会被后push的文件内容强行覆盖,而且没有什么提示。 这在合作开发时是很危险的事情。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: