什么是Git

  1. Git是目前世界上最先进的分布式版本控制系统。
  2. Git是免费、开源的
  3. 最初Git是为辅助 Linux 内核开发的,来替代 BitKeeper

    作者

    Linux和Git之父李纳斯·托沃兹(Linus Benedic Torvalds)1969、芬兰

    特点

    1. 直接记录快照,而非差异比较
    2. 近乎所有操作都是本地执行

    3. 时刻保持数据完整性
    4. 多数操作仅添加数据

    优点

  4. 适合分布式开发,强调个体。

  5. 公共服务器压力和数据量都不会太大。
  6. 速度快、灵活。
  7. 任意两个开发者之间可以很容易的解决冲突。
  8. 离线工作。

    缺点

  9. 模式上比SVN更加复杂。

  10. 学习周期相对而言比较长
  11. 不符合常规思维。
  12. 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

    git的使用

    初次使用的时候

  13. 提交自己的GitHub用户名和密码

  • 安装完成后,需要进行设置,在命令行输入以下代码: ```
  1. $ git config —global user.name “Your Name”
  2. $ git config —global user.email “email@example.com” ``` 顾名思义,这是设置你的名字和Email地址。
  • 如果当前配置过用户名和邮箱,我们可以查看一下用户名和密码: ```
  1. $ git config user.name
  2. $ git config user.email ```

进行分盘

  • . cd D: 进入相应的磁盘
  • . mkdir ‘你自己定义的件夹名’ (创建一个文件夹)
  • . cd ‘你自己定义的件夹名’ (进入文件夹)
  • . pwd 显示(你自己定义的件夹名)的路径

    初始化

  • 通过如下命令把这个目录变成Git可以管理的仓库: ```

  1. $ git init
  2. Initialized empty Git repository in /Users/Administrator/learngit/.git/ ``` 这样Git就把仓库建好啦,我们可以看到在当前目录下多了一个 .git 的目录,这个目录是Git来跟踪管理版本库的。

    将文件提交到git服务器

  • 把文件添加到版本库(把咱们的文件存放在一个神秘的地方 >>>> 暂存区 (暂存区在本机)

我们在 learngit 目录下编写一个 readme.txt 文件,内容如下:

  1. 1. Git is a version control system.
  2. 2. Git is free software.

(1) 用 git add 命令,把文件添加到仓库:

  1. $ git add readme.txt

执行以上命令,没有任何显示。
(2) 用 git commit 命令,把文件提交到仓库:

  1. 1. $ git commit -m "wrote a readme file" //-m后面输入的是本次提交的说明,可以输入任意内容。
  2. 2. [master (root-commit) eaadf4e] wrote a readme file
  3. 3. 1 file changed, 2 insertions(+) //1 file changed:1个文件被改动(新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt内有两行内容)
  4. 4. create mode 100644 readme.txt

查看commit状态和修改文件

  • 提交后会出现以下命令

image.png

  • 当文件被修改之后

运行 git status 命令:

  1. 1. $ git status //查看仓库当前的状态
  2. 2. On branch master
  3. 3. Changes not staged for commit: //没有文件将要被提交
  4. 4. (use "git add <file>..." to update what will be committed)
  5. 5. (use "git checkout -- <file>..." to discard changes in working directory)
  6. 6.
  7. 7. modified: readme.txt
  8. 8.
  9. 9. no changes added to commit (use "git add" and/or "git commit -a")

上面的命令告诉我们,readme.txt 文件被修改过了,但还没有准备提交的修改。
如果我们想知道上次是怎么修改readme.txt 文件的,需要用 git diff 命令:

  1. 1. $ git diff readme.txt
  2. 2. diff --git a/readme.txt b/readme.txt
  3. 3. index 46d49bf..9247db6 100644
  4. 4. --- a/readme.txt
  5. 5. +++ b/readme.txt
  6. 6. @@ -1,2 +1,2 @@
  7. 7. -Git is a version control system. //这一句是被删掉的
  8. 8. +Git is a distributed version control system. //这一句是新添加的
  9. 9. Git is free software.

版本回退

image.png

  1. git reset —hard HEAD^ 退回到上个版本 如果需要退回好多版本就在后⾯加上 ^ 例: git reset —hard HEAD^^退回两个版本。 然后去查看readme.txt是否成功退回。
  2. 这时候用 cat 命令查看一下 readme.txt 的内容: ```
  3. $ cat readme.txt //查看 readme.txt 文件的内容
  4. Git is a distributed version control system.
  5. Git is free software. ``` 果然 readme.txt 文件返回到了上一个版本。

    删除

  6. 新建一个b.txt

image.png

  1. 然后添加commit到库中。 并删除

image.png

  • . git add
  • . git commit -m ‘备注’
  • . rm b.txt 这个是删除b件的命令
  1. 回过头来看文件夹中的b.txt

image.png

  1. b.txt不见了,查看下状态。

image.png

  1. 可以commit,可以放弃修 git reset —hard 版本号来回复文件

image.png

  • .git reset —hard 3f27353(回复到这个版本的内容)

    撤销修改

    假如说你在 readme.txt 文件中添加了一行内容如下: ```
  1. $ cat readme.txt
  2. Git is a distributed version control system.
  3. Git is free software distributed under the GPL.
  4. Git has a mutable index called stage.
  5. Git tracks changes of files.
  6. My stupid boss still prefers SVN.
    1. 最后一行是万万不能让BOSS看到的,应该怎么撤销呢?<br />(1) 没有 git add 之前<br />可以手动删除最后一行,手动把文件恢复到上一个版本的状态。然后再用 git checkout -- file 命令丢弃工作区的修改:
  7. $ git checkout — readme.txt //把readme.txt文件在工作区的修改全部撤销。 2.
    1. 现在看一下 readme.txt 文件内容:
  8. $ cat readme.txt
  9. Git is a distributed version control system.
  10. Git is free software distributed under the GPL.
  11. Git has a mutable index called stage.
  12. Git tracks changes of files.
    1. 果然复原了。<br />(2) git add了,但没有git commit<br />这时候的修改添加到了暂存区,但没有提交到分支,用 git status 查看一下:
  13. $ git status
  14. On branch master
  15. Changes to be committed:
  16. (use “git reset HEAD …” to unstage)
  17. modified: readme.txt
    1. 这时候我们可以使用 git reset HEAD file 命令把把暂存区的修改撤销掉,重新放回工作区:
  18. $ git reset HEAD readme.txt //git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区,HEAD表示最新版本。
  19. Unstaged changes after reset:
  20. M readme.txt
    1. 现在再用 git status 查看一下:
  21. $ git status
  22. On branch master
  23. Changes not staged for commit:
  24. (use “git add …” to update what will be committed)
  25. (use “git checkout — …” to discard changes in working directory)
  26. modified: readme.txt //暂存区是干净的,工作区有修改。
    1. 这时候再丢弃工作区的修改就OK了:
  27. $ git checkout — readme.txt //丢弃工作区的修改。
  28. $ git status
  29. On branch master
  30. nothing to commit, working tree clean ``` 终于大功告成了。
    (3) 既 git add 了,也 git commit 了
    可以回退到上一个版本,见回退版本内容。

远程仓库准备工作

生成ID

image.png

  • . ssh-keygen -t rsa –C “youremail@example.com” 然后两下回车

在开始这部分之前,我们需要自行注册GitHub账号。而且,因为你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要设置:
(1) 创建SSH Key。在用户主目录下[副本]git和svn - 图9,看看有没有.ssh 目录,如果有的话,看此目录下有没有 id_rsa 和 id_rsa.pub 这两个文件,如果有,直接跳到下一步。如果没有,打开Git Bash,创建SSH
(2) 登陆GitHub,打开”Account settings”
[副本]git和svn - 图10
image.png

然后点击”Add SSH and GPG Keys”,再点击”New SSH Key”进行SSH Key 的创建,填上任意 Title ,把 id_rsa.pub 中的内容复制到Key文本框内:
[副本]git和svn - 图12

添加远程库

现在我们已经在本地创建了一个Git仓库了,又想在GitHub上创建一个Git仓库,然后让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。那么我们应该怎么做呢?
首先,登陆GitHub,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
[副本]git和svn - 图13
在Repository name填入 learngit (因为我已经创建完成了,所以提示此用户名存在)其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
[副本]git和svn - 图14
如上图所示我已经把本地仓库的内容推送到了GitHub上了,大家创建完以后应该是一个空的仓库。
这时候我们可以在本地learngit仓库下运行命令:

  1. $ git remote add origin git@github.com:RFHzhj/learngit.git //“RFHzhj”是我的GitHub的账户名,你需要填写你自己的账户名

添加后,远程库的名字就是 origin ,这是Git默认的叫法。
然后,我们就可以把本地库的所有内容推送到远程库上:

  1. 1. $ git push -u origin master
  2. 2. Counting objects: 20, done.
  3. 3. Delta compression using up to 4 threads.
  4. 4. Compressing objects: 100% (15/15), done.
  5. 5. Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
  6. 6. Total 20 (delta 5), reused 0 (delta 0)
  7. 7. remote: Resolving deltas: 100% (5/5), done.
  8. 8. To github.com:RFHzhj/learngit.git
  9. 9. * [new branch] master -> master
  10. 10. Branch 'master' set up to track remote branch 'master' from 'origin'.

使用 git push 命令,就是把当前分支 master 推送到远程。
因为远程库是空的,所以我们在第一次推送 master 分支时,要加上 -u 参数,Git不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:

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

  1. $ git push origin master

把本地 master 分支的最新修改推送至GitHub。现在,我们拥有了真正的分布式版本库。

从服务器拉去数据, gitclone

image.png

image.png

第二次开始

  • git add
  • git commit
  • git push //简写
  • $ git pull

git基本命令
1)git add 将想要快照的内容写入缓存区
2)git status -s “AM” 状态的意思是,这个文件在我们将它添加到缓存之后又有改动
3)git commit -m ‘第一次版本提交’ -m选项添加备注信息
4)git clone url 使用 git clone 拷贝一个 Git 仓库到本地
5)git diff 查看执行 git status 的结果的详细信息
6)git reset HEAD 用于取消已缓存的内容
7)git rm file
  git rm 会将条目从缓存区中移除。这与 git reset HEAD 将条目取消缓存是有区别的。
  “取消缓存”的意思就是将缓存区恢复为我们做出修改之前的样子。
  默认情况下,git rm file 会将文件从缓存区和你的硬盘中(工作目录)删除。
8)git mv 重命名磁盘上的文件 如 git mv README README.md

9)git push -u origin master 提交代码

2、git 分支管理
1)创建分支命令 git branch (branchname) 列出分支 git branch
2)切换分支命令 git checkout (branchname)
3)合并分支 git merge (branchname)
4)创建新分支并立即切换到该分支下 git checkout -b (branchname)
5)删除分支命令 git branch -d (branchname)

3、查看日志版本
git log 命令列出历史提交记录
git log —oneline 查看历史记录的简洁的版本
git log —oneline —graph 查看历史中什么时候出现了分支、合并

svn

SVN优缺点

优点:
1、 管理方便,逻辑明确,符合一般人思维习惯。
2、 易于管理,集中式服务器更能保证安全性。
3、 代码一致性非常高。
4、 适合开发人数不多的项目开发。

缺点:
1、 服务器压力太大,数据库容量暴增。
2、 如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。
3、 不适合开源开发(开发人数非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。