git 使用命令

git-tutorial                    

 

操作步骤:

第一步 下载安装好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

git-repo

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_rsaid_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_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

github-addkey-1

点“Add Key”,你就应该看到已经添加的Key:

github-addkey-2

GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

第3步:登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:

github-create-repo-1

在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:

github-create-repo-2

目前,在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

 

 

学习参考:

廖雪峰的Git教程

 

posted @ 2016-07-30 23:37  shiddong  阅读(176)  评论(0编辑  收藏  举报