学习Git-上

这是我学习git的一部分笔记,整理了一下~

Git是什么?

是目前世界上最先进的分布式版本控制系统。

简单点就是说,Git会记录你文件的变动,增减修改什么的,而你无需费劲想起我之前到底是改了什么。

 

浅谈集中式和分布式

集中式版本控制系统,版本库是集中存放在中央服务器的,干活的时候,就从中央服务器获取最新的版本到自己的电脑上干活,结束之后,你再更新到服务器上面去。最大的毛病就是必须联网才能合作。

          

分布式版本控制系统,没有“中央服务器”,每个人的电脑都是一个完整的版本库,这样就不用联网了,因为版本库就在你自己的电脑上。那怎么合作呢,直接把自己的修改推送到对方就可以看到了。

         

 

【安装Git

主要介绍在windows上的安装。

你可以选择在官网上下载,或者是CSDNhttp://download.csdn.net/detail/leasun/9457169下载,CSDN2.7.2版本不过我找来找去这是目前CSDN上最新的了。

或者你在官网,但是我网速不给力,下载几乎没进度,就放弃了。

安装完成后,在开始菜单里找到GIT->Git Bash,如果弹出这个窗口,就是安装成功了。

 

接着,就在命令行输入:

$ git config --global user.name "Your Name"

$ git config --global user.email "email@example.com"

改成你相应的名字和邮箱就ok了。

 

【创建版本库】

比如我在e盘下的www文件夹里面建了一个名字为mygit的版本库

Administrator@WIN-SPF48A2TO2K MINGW64 ~

$ cd E:

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e

$ cd www

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www

$ mkdir mygit

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www

$ cd mygit

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit

$ pwd

/e/www/mygit

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit

$

其中pwd命令是用来显示当前目录

 

接下来,通过git init命令把这个目录变成git可以管理的仓库。

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit

$ git init

Initialized empty Git repository in E:/www/mygit/.git/

 

瞬间git就把仓库建好了,empty Git repository 表示是一个空的仓库,.git目录是git用来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了就会把git仓库给破坏了。

 

【把文件加到版本库中】

1,我们在mygit下面建立了readme.txt,内容是:

Git is a version control system.

Git is free software.

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

   Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

   $ git add readme.txt

   执行这个命令,没有任何显示,那就是对了。

3,用git commit告诉Git,把文件提交到仓库

    Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git commit -m "wrote a readme file"

[master (root-commit) d5ff281] wrote a readme file

 1 file changed, 2 insertions(+)

 create mode 100644 readme.txt

-m后面输入的是本次提交的说明

这个命令执行后告诉你,1个文件被改动,插入了两行内容

Commit还有个功能可以一次提交多个文件

比如:$ git commit -m “add 3 files.”

4,通过git status 可以看是否还有文件未被提交

    Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

nothing to commit, working directory clean

说明没有什么内容没有提交

 

【时空穿梭机】

之前不明白为什么要这么叫,现在一玩起来终于知道了

我们讲readme.txt的文件内容改成这样子。

Git is a distribute version control system.

Git is free software.

1,通过git status查看结果

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

Changes not staged for commit:

  (use "git add <file>..." to update what will be committed)

  (use "git checkout -- <file>..." to discard changes in working directory)

 

        modified:   readme.txt

 

no changes added to commit (use "git add" and/or "git commit -a")

这告诉我们,readme被修改了但是还没有提交。

可以通过给git diff查看修改的内容

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git diff

diff --git a/readme.txt b/readme.txt

index d8036c1..5fbfb0d 100644

--- a/readme.txt

+++ b/readme.txt

@@ -1,2 +1,2 @@

-Git is a version control system.

+Git is a distribute version control system.

 Git is free software.

\ No newline at end of file

通过这里可以看出我们在第一行加了distribute

之后我们就可以做提交了,同上面一样提交时两步

1git add

2git commit

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git add readme.txt

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

Changes to be committed:

  (use "git reset HEAD <file>..." to unstage)

 

        modified:   readme.txt

 

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git commit -m "add distribute"

[master 8992280] add distribute

 1 file changed, 1 insertion(+), 1 deletion(-)

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

nothing to commit, working directory clean

 

【版本回退】

再次修改readme.txt文件里的内容,如下:

Git is a distribute version control system.

Git is free software distributed under the GPL.

提交

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

Changes not staged for commit:

  (use "git add <file>..." to update what will be committed)

  (use "git checkout -- <file>..." to discard changes in working directory)

 

        modified:   readme.txt

 

no changes added to commit (use "git add" and/or "git commit -a")

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git diff

diff --git a/readme.txt b/readme.txt

index 5fbfb0d..ada5115 100644

--- a/readme.txt

+++ b/readme.txt

@@ -1,2 +1,2 @@

 Git is a distribute version control system.

-Git is free software.

\ No newline at end of file

+Git is free software distributed under the GPL.

\ No newline at end of file

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git add readme.txt

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git commit -m "appeng GPL"

[master aac1569] appeng GPL

 1 file changed, 1 insertion(+), 1 deletion(-)

 

现在总共有三个版本的readme.txt文件提交到Git仓库里面了。

版本1wrote a readme file

Git is a version control system.

Git is free software.

版本2add distribute

Git is a distribute version control system.

Git is free software.

版本3append GPL

Git is a distribute version control system.

Git is free software distributed under the GPL.

那我们可以通过git log查看我们到底哪个文件改了什么

Git log显示是从最近到最远的提交日志

如果觉得眼花缭乱,可以加上--pretty=oneline

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git log --pretty=oneline

aac1569e34475398cc21eb6ff6e4f2b403601b7a appeng GPL

89922806892c6a63e9ada46fbf3ad4d1ae5111da add distribute

d5ff281a11c449eb1b7ff9a82fb3bb848c9d9076 wrote a readme file

前面的一大串数字是commit id(版本号)

好了,进入时光穿梭了

Git中用HEAD表示当前版本,也就是最新的提交aac1569e34475398cc21eb6ff6e4f2b403601b7a,注意每个人的版本号肯定是不一样的,上一个版本就是HEAD^,上上一个就是HEAD^^,如此类推,当然往上100个版本数不过来,可以写成HEAD~100,那么:

通过git reset命令可以回到以前的版本

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git reset --hard HEAD^

HEAD is now at 8992280 add distribute

看看readme的内容是不是上一个版本

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ cat readme.txt

Git is a distribute version control system.

Git is free software.

通过git log查查当前版本库的状况,会发现最新的版本已经没有了,但是没事,直接git reset --hard aac15就可以了,写版本号前面几个就可以了,但是也不能太少位。

如果你忘记版本号也没事,口蹄疫通过git reflog

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git reset --hard aac1569

HEAD is now at aac1569 appeng GPL

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ cat readme.txt

Git is a distribute version control system.

Git is free software distributed under the GPL.

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git reflog

aac1569 HEAD@{0}: reset: moving to aac1569

8992280 HEAD@{1}: reset: moving to HEAD^

aac1569 HEAD@{2}: commit: appeng GPL

8992280 HEAD@{3}: commit: add distribute

d5ff281 HEAD@{4}: commit (initial): wrote a readme file

总结:穿梭前,可以通过gitlog可以查看提交历史,以便确定要回到哪个版本

      要重返未来,可以通过git reflog查看命令历史,以便确定要回到未来哪个版本。

 

 

工作区和暂存区

工作区:就是在你电脑里能看到的目录,比如我的mygit文件夹就是一个工作区

版本库:工作区有一个隐藏的目录.git,是Git的版本库。其中最重要的就是stage或者index的暂存区,还有Git为我们自动创建的第一个分支master,已经指向master的一个指针叫HEAD

 

所以git add 是把文件添加到暂存区,git commit 是把暂存区的内容仿造master分支上。

再试试,将readme修改为:

Git is a distribute version control system.

Git is free software distributed under the GPL.

Git has a mutable index called stage.

同时建立一个test.txt,里面没有添加内容

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

Changes not staged for commit:

  (use "git add <file>..." to update what will be committed)

  (use "git checkout -- <file>..." to discard changes in working directory)

 

        modified:   readme.txt

 

Untracked files:

  (use "git add <file>..." to include in what will be committed)

 

        test.txt

 

no changes added to commit (use "git add" and/or "git commit -a")

GIT非常清楚告诉我们。当前readme.txt被修改了,test还没有被添加过,所以是untracked

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

Changes to be committed:

  (use "git reset HEAD <file>..." to unstage)

 

        modified:   readme.txt

        new file:   test.txt

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git commit -m "two files"

[master b425af8] two files

 2 files changed, 2 insertions(+), 1 deletion(-)

 create mode 100644 test.txt

 

【管理修改】

我们将readme文件再次进行修改

Git is a distribute version control system.

Git is free software distributed under the GPL.

Git has a mutable index called stage.

Git tracks changes.

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ cat readme.txt

Git is a distribute version control system.

Git is free software distributed under the GPL.

Git has a mutable index called stage.

Git tracks changes.

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git add readme.txt

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

Changes to be committed:

  (use "git reset HEAD <file>..." to unstage)

 

        modified:   readme.txt

然后再修改

Git is a distribute version control system.

Git is free software distributed under the GPL.

Git has a mutable index called stage.

Git tracks changes of files.

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ cat readme.txt

Git is a distribute version control system.

Git is free software distributed under the GPL.

Git has a mutable index called stage.

Git tracks changes of files.

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git commit -m "git tracks changes"

[master cd3046b] git tracks changes

 1 file changed, 1 insertions(+)

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

Changes not staged for commit:

  (use "git add <file>..." to update what will be committed)

  (use "git checkout -- <file>..." to discard changes in working directory)

 

        modified:   readme.txt

 

no changes added to commit (use "git add" and/or "git commit -a")

我们的步骤是第一次修改>add>第二次修改>commit,因为第一次没有提交,所以第二次是把你第一次放在暂存区的东西进行修改,而第二次的修改不会提交。

提交后,用git diff HEAD --readme.txt命令可以看看工作区和版本库的区别

 

【撤销修改】

修改readme.txt文件为:

Git is a distribute version control system.

Git is free software distributed under the GPL.

Git has a mutable index called stage.

Git tracks changes of files.

My stupid boss still prefers SVN.

如果我们要修改最后一句,可以手动删除,当然也可以通过 git checkout--file

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git checkout -- readme.txt

这即使把readme.txt文件子啊工作区的修改全部撤销,会有两种情况

1readme.txt修改后还没有加到暂存区,这样子,撤销修改就回到和版本库一模一样的状态

2,如果已经添加到暂存区,又做了修改,那么撤销修改就回到添加暂存区后的状态。

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ cat readme.txt

Git is a distribute version control system.

Git is free software distributed under the GPL.

Git has a mutable index called stage.

Git tracks changes.

如果我们添加到暂存区了,可以通过git reset HEAD file将文件重新放回到工作区。

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git add readme.txt

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

nothing to commit, working directory clean

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git reset HEAD readme.txt

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

总结:

1,当你改乱了工作区某个文件想丢弃时可以通过git checkout -- file

2,当你不但改了工作区还添加到了暂存区,可以通过git reset HEAD file,再重复1

3,如果你提交到版本库,那就可以用版本回退,不过前提是还没有推送到远程库

 

【删除文件】

通过rm命令把test文件删除

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ rm test.txt

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git status

On branch master

Changes not staged for commit:

  (use "git add/rm <file>..." to update what will be committed)

  (use "git checkout -- <file>..." to discard changes in working directory)

 

        deleted:    test.txt

 

no changes added to commit (use "git add" and/or "git commit -a")

真的要删除版本库中的文件,闹那个git rm commit

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git rm test.txt

rm 'test.txt'

 

Administrator@WIN-SPF48A2TO2K MINGW64 /e/www/mygit (master)

$ git commit -m "remove test.txt"

[master b7ca799] remove test.txt

 1 file changed, 0 insertions(+), 0 deletions(-)

 delete mode 100644 test.txt

那如果你把它从版本库中删除了,那就无法恢复了

恢复的话可以用git checkout -- test.txt

 

 

【远程仓库】

首先,创建SSH KEY,注意大小写!因为不小心把c小写了就创建不成功

在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:

ssh-keygen  -t rsa –C “youremail@example.com”

id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第二步:登录github,打开” settings”中的SSH Keys页面,然后点击“New SSH Key”,填上任意title,在Key文本框里黏贴id_rsa.pub文件的内容。

 

添加远程库

 

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

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

git remote add origin https://github.com/账户名

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

由于远程库是空的,我们第一次推送master分支时,加上了 –u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在github页面中看到远程库的内容已经和本地一模一样了。

从现在起,只要本地作了提交,就可以通过如下命令:git push origin master

把本地master分支的最新修改推送到github上了,现在你就拥有了真正的分布式版本库了。

 

 

 

 

 

 

posted @ 2016-03-15 16:47  Cchuying  阅读(162)  评论(0编辑  收藏  举报