首页 > 其他 > 详细

Git学习

时间:2016-09-01 16:34:35      阅读:371      评论:0      收藏:0      [点我收藏+]

Git的工作流程

从资源库克隆Git资源到工作副本,作为工作目录

对副本进行增删改等操作

如果别人进行了修改,我们可以更新资源

提交之前查看文件状态及修改情况

进行提交及推送操作

如果发现了错误可以撤回并重新提交及推送

技术分享


Git的基本概念

工作区:在电脑上可以看到的目录

暂存区:在工作区的隐藏目录.git下,一般为.git/index,有时暂存区也叫索引(index)

版本库:为工作区的隐藏目录.git,它是Git的版本库

技术分享

技术分享

技术分享


创建仓库

git init

初始化一个Git仓库,执行完git init命令后,Git仓库会生成一个.git目录,该目录包含了资源的所有元数据,其它的项目目录保持不变


git clone

从现有Git仓库中拷贝项目


基本操作

git add

git commit

git status

git diff

git reset HEAD

git rm

git mv



所有的版本控制系统,其实只能跟踪文本文件的改动


操作

1、创建版本库git init

在当前目录下创建一个文件test_git.txt,并编辑其内容

git add命令把文件添加到缓存

技术分享


2、git commit 把文件提交到仓库

技术分享

-m 后面是本次提交的说明,可以输任意内容,当然最好是有意义的

1个文件被改动

2行被内容被插入


3、git status查看

继续修改test_git.txt文件,内容如下:

技术分享

执行命令git status,该命令让我们时刻掌握仓库当前的状态

技术分享

上述命令告诉我们test_git.txt被修改过了,但还没有准备提交的修改

执行git diff,该命令使我们查看具体修改的内容

技术分享

从以上结果看出我们在第一行添加了一个distributed

知道了对test_git.txt作了什么修改后就放心了

执行git add test_git.txt,再执行git status 查看当前仓库的状态

技术分享

再把它提交到仓库

技术分享

1个文件被修改了

1行插入

1行删除

提交后,执行git status命令查看仓库当前状态

技术分享

以上结果说明当前没有需要提交的修改,而且目录是干净的

如果git status告诉你有文件被修改过,用git diff可以查看修改内容。



4、现继续修改test_git.txt,并执行git diff查看修改内容

技术分享

提交至仓库

技术分享


5、版本回退

///////////////////至此,我们已经提交了3个版本到仓库

版本1:

first test git:

git is a version control system.

git is free software.

版本2:

add distributed:

git is a distributed version control system.

git is free software.

版本3:

append GPL:

git is a distributed version control system.

git is free software distributed under the GPL.

实际工作中我们不可能记得所有修改过的内容git log可以显示从最近到最远的提交日志

技术分享

如果嫌输出太多可加参数输出

技术分享

需要友情提示:类似59cbc12a...75263ee的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。

为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。


每提交一个新版本,实际上Git就会把他们自动串成一条线


现在要把当前版本append GPL回退到上上一个版本first test git,可用git reset命令

在Git中HEAD表示当前版本,上一个版本是HEAD^,上上一个版本是HEAD^^,上100个可写成HEAD~100

技术分享

此时我们执行git log可看到最新的两个版本不见了

技术分享

但是想要再回去已经回不去了,除非你的窗口还没关,往上找,找到那个add distributed和append GPL的commit id,于是就可以指定回到未来的某个版本:

技术分享test_git的内容也是最新那个的版本:

技术分享

Git的版本回退速度非常快,这是因为在Git内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git只是把指针从append GPL指向test git first

然后顺便把工作区的文件更新了

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

技术分享这样就算你关闭了窗口甚至电脑,也可以回退到未来那个版本


HEAD指向的版本就是当前版本,Git允许我们使用git reset --hard commit_id在版本之间穿梭


6、工作区和暂存区

添加一个文件LICENSE

修改test_git.txt的内容

再git status查看

技术分享

以上告诉我们test_git.txt被修改,LICENSE从未被添加(Untracked)

添加之后再用git status查看一下状态

技术分享

这两个文件就从工作区添加到暂存区了,这是git add的作用

一次性把暂存区的所有修改提交到分支,这是git commit的作用

技术分享


提交之后,暂存区就没有任何内容了

技术分享


7、Git管理的是修改,而不是文件

修改文件test_git.txt,内容如下:

技术分享

然后git add test_git.txt进行添加


再修改test_git.txt,内容如下:

技术分享

提交并查看状态

技术分享

技术分享发现第二次的修改并没有被提交

执行git diff HEAD --test_git.txt查看工作区和版本库中文件的区别

技术分享

发现第二次的确实没被提交,我们可以添加并提交第二次的修改


8、撤销修改

命令git checkout -- test_git.txt意思就是,把test_git.txt文件在工作区的修改全部撤销,这里有两种情况:

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

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

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


如果你git add到暂存区后想要撤回,

执行git reset HEAD test_git.txt 可以把暂存区的修改回退到工作区,

此时用git status查看一下

技术分享

现在暂存区是干净的,还记得上述命令git checkout -- test_git.txt吗

技术分享


那如果你不但改错东西还提交到了版本库,怎么办?版本回退,

不过是有条件的,就是你还没有把本地仓库推送到远程


总结:1、如果改乱了工作区的某个文件内容,可执行git checkout -- file 丢弃工作区的内容

    2、如果不但改乱了工作区的某个文件内容保存到了暂存区,可执行git reset HEAD file,回到

     场景1,在按场景1的操作执行

    3、如果提交到了本地仓库,可利用版本回退,前提是没有推送到远程


9、删除文件

我们先添加一个文件tmp.txt 并提交

然后在工作目录下直接rm tmp.txt,这个时候Git知道你删了文件,工作区和版本库就不一样了

执行git status命令,Git会告诉你删除了一个文件


现在你有以下两种做法:

一种是真的要从版本库删除这个文件

执行命令git rm tmp.txt删掉

并执行git commit -m "remove tmp.txt"


一种是误删的,还想要恢复到工作区

git checkout -- tmp.txt  其实是用版本库里的版本替换工作区的版本,

             无论工作区是修改还是删除,都可以“一键还原”。


总结:git rm 用于删除一个文件。如果一个文件已经被提交到版本库,那么永远不用担心误删,

但是你只能恢复文件到最新版本





《完》

本文出自 “零蛋蛋” 博客,谢绝转载!

Git学习

原文:http://lingdandan.blog.51cto.com/10697032/1845175

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!