学习Git-上
这是我学习git的一部分笔记,整理了一下~
Git是什么?
是目前世界上最先进的分布式版本控制系统。
简单点就是说,Git会记录你文件的变动,增减修改什么的,而你无需费劲想起我之前到底是改了什么。
浅谈集中式和分布式
集中式版本控制系统,版本库是集中存放在中央服务器的,干活的时候,就从中央服务器获取最新的版本到自己的电脑上干活,结束之后,你再更新到服务器上面去。最大的毛病就是必须联网才能合作。
分布式版本控制系统,没有“中央服务器”,每个人的电脑都是一个完整的版本库,这样就不用联网了,因为版本库就在你自己的电脑上。那怎么合作呢,直接把自己的修改推送到对方就可以看到了。
【安装Git】
主要介绍在windows上的安装。
你可以选择在官网上下载,或者是CSDN上http://download.csdn.net/detail/leasun/9457169下载,CSDN是2.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
之后我们就可以做提交了,同上面一样提交时两步
1,git add
2,git 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仓库里面了。
版本1:wrote a readme file
Git is a version control system.
Git is free software.
版本2:add distribute
Git is a distribute version control system.
Git is free software.
版本3:append 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文件子啊工作区的修改全部撤销,会有两种情况
1,readme.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上了,现在你就拥有了真正的分布式版本库了。