操作步骤:
第一步 下载安装好Git之后,因为Git是分布式的版本控制系统,所以每个机器都要设置一个自己的账户:你的名字和Email地址,
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
--global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
第二步 要创建版本库:(Windows下打开Git Bash,)在一个合适的目录下,创建一个空目录,
$ mkdir github
$ cd github
$ pwd
/Users/shiddong/github
第三步 将这个空的目录变成Git可以管理的仓库,会看到在这个空目录下生成了一个.git目录,默认隐藏的
$ git init Initialized empty Git repository in /Users/shiddong/github/.git/
第四步 下面就可以在这个仓库内对文件操作,比如新建或者修改一个文件readme.txt,然后将对这个文件的修改添加到暂存库,也可以添加多个文件,直接在后面以空格间隔加上文件名即可
$ git add readme.txt
第五步 将所有需要修改的文件都添加到暂存库之后,就可以提交到本地的仓库中,-m之后跟着的是提交的记录说明
$ git commit -m "新增文件readme.txt" //下面是修改的信息 [master (root-commit) cb926e7] 新增文件readme.txt 1 file changed, 2 insertions(+) create mode 100644 readme.txt
查询信息:
可以在add之前先使用git status查看仓库当前的状态,
$ git status
# On branch master //表示是在主分支master上,一般应该在开发分支develop上开发
# 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")
通过这个命令Git能告诉我们那个文件被修改了,以及处于那个状态,是否有需要add或commit的文件,但具体修改了什么内容,需要通过git diff命令来查看
$ git diff readme.txt diff --git a/readme.txt b/readme.txt index 46d49bf..9247db6 100644 --- a/readme.txt +++ b/readme.txt @@ -1,2 +1,2 @@ -Git is a version control system. +Git is a distributed version control system. Git is free software.
- 是旧版本, + 是新版本,可以看到所做的修改是添加了一个distributed,一般在添加到暂存库之前先检查下修改的内容,
如果需要查看以前修改过的记录,即打印出日志,
$ git log commit a6ccb60677cc9f3c40a32594718352fdda1a0f9c Author: shiddong <shiddong@foxmail.com> Date: Wed Jul 27 23:43:45 2016 +0800 在readme.txt中添加GPL commit 32537a7be326d0fda96d21d8b75ad77abff14473 Author: shiddong <shiddong@foxmail.com> Date: Wed Jul 27 23:28:04 2016 +0800 在readme.txt中添加distributed commit acdafdc2f44aa0bf248ef6d60c3fa24ee8992e9e Author: shiddong <shiddong@foxmail.com> Date: Wed Jul 27 23:21:10 2016 +0800 新增文件readme.txt
打印出简单点的信息:
$ git log --pretty=oneline
a6ccb60677cc9f3c40a32594718352fdda1a0f9c 在readme.txt中添加GPL
32537a7be326d0fda96d21d8b75ad77abff14473 在readme.txt中添加distributed
acdafdc2f44aa0bf248ef6d60c3fa24ee8992e9e 新增文件readme.txt
前面的一串数字是根据SHA1计算得出的一串16进制数字,类似于commit id(版本号),这里不用1,2,3...的原因是当多个人在同一个版本库中工作,都用1,2,3...的话会产生冲突的。
直接输出git命令可以查看常用的命令:
$ git usage: git [--version] [--help] [-C <path>] [-c name=value] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] <command> [<args>] These are common Git commands used in various situations: start a working area (see also: git help tutorial) clone Clone a repository into a new directory init Create an empty Git repository or reinitialize an existing one . . .
回退版本、撤销修改:
Git中当前版本是HEAD,上一版本是HEAD^,上上版本是HEAD^^,前n个版本数字较大时,如100,就可以表示为HEAD~100,
$ git reset --hard HEAD^ HEAD is now at ea34578 在readme.txt中添加distributed
Git的版本回退非常快,这是因为Git内部有个指向当前版本的HEAD指针,回退版本的时候只是将HEAD指针从指向"在readme.txt中添加GPL"指向了"在readme.txt中添加distributed"。
git revert可以回退版本,也可以在add修改的文件到暂存区之后,将暂存区的修改撤销掉:
撤销修改:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- filename
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD filename
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交就参考上面的回退到指定版本号(下面有介绍),不过前提是没有推送到远程库。
回退之后再查看下日志:
$ git log
commit 32537a7be326d0fda96d21d8b75ad77abff14473
Author: shiddong <shiddong@foxmail.com>
Date: Wed Jul 27 23:28:04 2016 +0800
在readme.txt中添加distributed
commit acdafdc2f44aa0bf248ef6d60c3fa24ee8992e9e
Author: shiddong <shiddong@foxmail.com>
Date: Wed Jul 27 23:21:10 2016 +0800
新增文件readme.txt
可以看到, 之前最新的版本已经找不到了,如果想吃后悔药,还是有机会的,Git中有个命令打印出你的命令历史,
$ git reflog ea34578 HEAD@{0}: reset: moving to HEAD^ 3628164 HEAD@{1}: commit: 在readme.txt中添加GPL ea34578 HEAD@{2}: commit: 在readme.txt中添加distributed cb926e7 HEAD@{3}: commit (initial): 新增文件readme.txt
第二行显示"在readme.txt中添加GPL"的版本号是3628164,
$ git reset --hard 3628164 HEAD is now at 3628164 在readme.txt中添加GPL
这样又可以回到这个版本中了。
工作区、暂存区、版本库的概念:
工作区就是我们新建的那个目录/Users/shiddong/github,而这个里面有一个.git隐藏目录就是版本库,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
add和commit的流程可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
git跟踪管理的是文件的修改,而不是文件本身,所以只有被提交到暂存库中的修改,才能被commit到版本库中,而在工作区中修改过的文件是不能直接被commit的,因为并没有添加add这些修改到暂存库中。
第一次修改 -> git add -> 第二次修改 -> git commit,此时只能commit第一次修改的内容,第二次修改不会被提交。那么可以:
第一次修改 -> git add -> 第二次修改 -> git add -> git commit,
或者第一次修改 -> git add -> 第二次修改 -> git commit ->git add (第二次修改) -> git commit.
删除文件:
1.删除版本库中的文件,要先删除test.txt,(版本库知道你删了文件,)然后commit
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
2.若删错了,想要恢复,直接从版本库checkout或者回退版本即可。
远程仓库:
重头戏,注册GitHub。由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
如我的:
$ ssh-keygen -t rsa -C "shiddong@foxmail.com" Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/shiddong/.ssh/id_rsa): Created directory '/c/Users/shiddong/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /c/Users/shiddong/.ssh/id_rsa. Your public key has been saved in /c/Users/shiddong/.ssh/id_rsa.pub. The key fingerprint is: SHA256:********************************* The key's randomart image is: *********************** ***********************
***********************
可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容:
点“Add Key”,你就应该看到已经添加的Key:
GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
第3步:登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
在Repository name填入learngit
,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
目前,在GitHub上的这个learngit
仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的learngit
仓库下运行命令:
$ git remote add origin git@github.com:shiddong/learngit.git
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。
下面,就可以通过git push命令把本地库的所有内容推送到远程库上:
$ git push -u origin master //此时,推送到远程库的是当前分支master,第一次推送master分支时,加了-u参数
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (19/19), 13.73 KiB, done.
Total 23 (delta 6), reused 0 (delta 0)
To git@github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
clone仓库必须知道仓库的地址,
$ git clone git@github.com:shiddong/gittest.git Cloning into 'gittest'... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Receiving objects: 100% (3/3), done.
GitHub给出的地址不止一个,还可以用https://github.com/shiddong/gittest.git
这样的地址。实际上,Git支持多种协议,默认的git://
使用ssh,但也可以使用https
等其他协议。
使用https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh
协议而只能用https
。
学习参考: