git简介、基本命令和仓库操作

Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git 是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Torvalds开始着手开发Git是为了作为一种过渡方案来替代BitKeeper。
开发过程如下图所示:

Git的功能特性:
从一般开发者的角度来看,git有以下功能:
1、从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。
2、在自己的机器上根据不同的开发目的,创建分支,修改代码。
3、在单机上自己创建的分支上提交代码。
4、在单机上合并分支。
5、把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6、生成补丁(patch),把补丁发送给主开发者。
7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8、一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。

从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:
1、查看邮件或者通过其它方式查看一般开发者的提交状态。
2、打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
3、向公共服务器提交结果,然后通知所有开发人员。

优点:
1、适合分布式开发,强调个体;
2、公共服务器压力和数据量都不会太大;
3、速度快、灵活;
4、任意两个开发者之间可以很容易的解决冲突;
5、离线工作。

缺点:
1、资料少(起码中文资料很少);
2、学习周期相对而言比较长;
3、不符合常规思维;
4、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

git基本命令:

  1. git init 表示初始化一个Git仓库。
  2. git status 表示查看当前仓库的状态,可以随时掌握工作区的状态,例如可以看到有哪些文件被修改了,有哪些文件需要提交等,如果没有的话就会出现 working tree clean表示工作区很干净,没有被修改的文件或者没有需要提交的文件,如果有文件被修改了,可以结合git diff filename查看文件被修改了什么内容,也就是文件发什么了哪些变化。
  3. git add filename 表示将文件添加到暂存区。
    add可以反复多次使用,将多个文件添加到暂存区。如果一次性添加多个文件,直接使用空格分隔文件名就可以了。
  4. git commit filename 表示将文件提交到仓库,有说明信息需要使用-m参数,变为这样:git commit -m "说明信息" filename。
    这儿提交可以不用接文件名的,因为add到了暂存区,提交就是提交暂存区的内容,如果add了多个文件到暂存区,那么commit时不加文件名就表示将暂存区的文件全部提交,添加了文件表示只提交指定的那个文件。
    git commit --amend命令可以重新修改提交信息。例如你之前提交了文件,但是你的描述信息写错了,这时可以使用它来重新修改提交信息,但是内容是没有变化的。
  5. git diff filename 表示比较文件的不同地方,比如昨天修改了文件,但是今天已经不记得了修改了什么,这时可以使用这个命令查看今天的文件和昨天的文件有什么不一样。
    必须在没有add进暂存区之前进行比较,如果已经添加进暂存区之后将无法比较出区别。
    例如:

    a/A.txt表示之前的文件,b/A.txt表示之后的,-号表示删除了内容,+号表示添加了内容并且可以看到添加了什么内容。
  6. git log 命令可以查看从最远到最近的提交日志,git log --pretty=oneline表示提交日志在一行显示,不然的话太乱了不方便浏览。
    git log -1命令可以查最后一次提交的信息,后面可以-n,表示可以查看最近几次的提交情况。
    git log -p -2 命令还可以查看每次提交的差异变化,也就是说查看每次提交文件的变化内容,这里表示查看最近两次提交所发生的变化。
    git log --stat命令可以查看每次提交的一些简略信息,比如那些文件被修改了,最后会有一句总结,表示有多少个文件被修改,增加了或者删除了。
    git log 还可以和--graph结合使用,显示 ASCII 图形表示的分支合并历史。
    git log --pretty 可以指定提交日志的显示格式,有oneline,short,full,fuller可以选择。还可以设置format,
    它的常用选项是:例如git log --pretty=format:"%h - %an, %ar : %s"
    Table 1. git log --pretty=format 常用的选项
    选项 说明
    %H 提交对象(commit)的完整哈希字串
    %h 提交对象的简短哈希字串
    %T 树对象(tree)的完整哈希字串
    %t 树对象的简短哈希字串
    %P 父对象(parent)的完整哈希字串
    %p 父对象的简短哈希字串
    %an 作者(author)的名字
    %ae 作者的电子邮件地址
    %ad 作者修订日期(可以用 --date= 选项定制格式)
    %ar 作者修订日期,按多久以前的方式显示
    %cn 提交者(committer)的名字
    %ce 提交者的电子邮件地址
    %cd 提交日期
    %cr 提交日期,按多久以前的方式显示
    %s 提交说明
    例如:
    有时候当我们修改了文件,但是想要恢复以前的某一个版本的文件,可以采用创建一个快照的形式方便回退到以前的某一个版本,在git中的快照就是commit。
    图片中黄色的那一长串就是commit id。
    当你想要回退到某一个版本的话,首先必须知道当前是在哪个版本,而在git中HEAD就表示当前版本,head就是一个类似指针,指向当前版本。上一个版本表示为HEAD^,上上个版本表示为HEAD^^,如果版本太多了,可以直接这样表示某一个版本HEAD~10,表示之前的第10个版本。
  7. git reset --hard HEAD^ 命令表示回退到上一个版本。现在已经回退到上一个版本了。
    但是如果你后悔了,还是想要以前的刚刚你修改的那个版本,怎么办,这时只要你的git bash 窗口没有关闭,你可以往上翻找你刚刚commit 的commit id然后
    git reset --hard commit id 就可以回退到之前你刚刚的那个版本了。
    在如果,第二天你又后悔了昨天的操作,那么现在还是可以找到你之前的版本的,我擦,git好神奇哦
    git 使用了一个git reflog 来记录你的每一次命令操作的。

    图片中黄色的那一串就是commit id,这时 git reset --hard commit id就可恢复了。

需要注意的是git是分布式版本控制工具,它是有一个暂存区概念的,每一次修改了需要add到暂存区然后在commit提交,如果修改了直接提交的话,是不会成功的,因为提交只会提交暂存区中有的修改。可以使用git diff HEAD -- filename 来查看工作区和版本库里面最新版本的区别。


那么如何撤销已经修改了的文件呢?有两种情况:第一,修改了文件,但是还没有add进暂存区;第二,修改了并且已经添加进了暂存区。

第一种情况,修改了还没有add进暂存区可以使用git checkout -- testzancunq.txt进行撤销工作区的修改,这样就回到了原来工作区内容的状态。
第二种情况,修改了并且已经添加进暂存区了,如下图:

这时可以使用git reset HEAD testzancunq.txt表示从暂存区中取消暂存,然后在使用git checkout -- testzancunq.txt进行撤销,完事!
8. 删除文件,在git中删除文件也是一种修改。
当你使用rm删除了文件之后,使用git status查看工作区状态如下图:

这个时候你可以恢复,但是如果你确定要删除文件,可以使用git rm filename 并且commit到git仓库中,这时文件就从版本库中删除了,也就是无法恢复了。
另一种情况是你删错了文件,在删除文件之前只要你将文件提交到了版本库中,都是可以恢复的,但是只能恢复到最新版本,会丢失最近一次提交后你修改的内容。
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
9. 当你不知道某个命令的作用时可以查看git 帮助文档,有三种方式:
git help verb
git verb --help
man git-verb
git help config 获取config手册


以上就是git在本地库中的文件的基本操作。


接下来是如何向远程仓库提交内容。这时需要注册一个github账号,并且github是基于SSH协议加密授权的,ssh是一种网络协议用于计算机之间的加密登录,就像远程操作服务器一样,例如linux,可以利用ssh远程连接操作服务器。每一台linux都配置了ssh协议。想要向远程仓库提交代码,需要ssh key,需要在github中添加ssh key。首先要生成ssh key。

  1. ssh-keygen -t rsa -C "youremail@example.com"(邮箱要换成自己的邮箱) 表示使用rsa算法生成密钥,最后windows平台会在用户目录下生成.ssh的隐藏目录,以及id_rsa和id_rsa.pub两个文件,而id_rsa就是密钥,id_rsa.pub就是公钥。这样只需要将公钥id_rsa.pub添加到github中,就可以和本地的密钥id_rsa进行配对,完成授权过后就可以进行代码提交了。
    添加成功过后进行测试:ssh -T git@github.com,如果出现了Hi.....就表示授权添加成功了。
  2. Push命令:表示如果本地代码有更新了,就可以将它推送到远程仓库,以保持代码同步,例如:git push origin master表示将本地代码推送到master分支。
  3. Pull命令:表示将远程仓库的代码更新到本地,例如:git pull origin master 表示将远程master的代码拉到本地。
    有了Push和pull两个命令就可以向远程仓库提交代码了。如果有改动就添加到暂存区,没有问题就可以commit,最后将项目push到远程仓库。
    向远程仓库提交内容有两种方式,一种是将项目从远程仓库clone下来,另一种是将本地仓库与远程仓库进行关联。

第一种方式,将项目从远程仓库中clone下来

  1. git clone git@github.com:github名称/项目仓库。表示将项目从远程clone到本地。这个项目本身就是一个git仓库了,所以就不需要再进行git init了。
  2. git push origin master 表示如果修改了文件,并且commit了,就直接将项目推送到远程仓库了。

第二种方式,将本地仓库和远程仓库关联起来,

例如本地仓库test2,远程仓库test,现在需要将test2中的代码提交到test中。这个时候需要将test和test2关联起来。

  1. git remote add origin git@github.com:github名称/项目.git 表示将本地仓库和远程仓库关联起来,这个远程仓库的地址是git@github.com:github名称/项目.git,而origin是这个仓库的名字,以后推送就可以使用git push origin master表示推送到远程仓库origin的master分支。
  2. git push -u origin master表示向test仓库提交了代码,默认是提交到master主分支上。第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

参考文章:
(1) https://baike.baidu.com/item/GIT/12647237?fr=aladdin#7

原文地址:https://www.cnblogs.com/jasonboren/p/11087336.html