zoukankan      html  css  js  c++  java
  • 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教程

  • 相关阅读:
    Selenium+PhantomJS实现简易有道翻译爬虫
    Scrapy框架实战-妹子图爬虫
    拉勾网职位信息爬取
    Docker Compose容器编排
    Ansible进阶--playbook的使用
    etcd集群部署
    使用Dockerfile构建镜像
    Docker网络管理
    Docker数据管理
    Dubbo高性能网关--Flurry介绍
  • 原文地址:https://www.cnblogs.com/shiddong/p/5722092.html
Copyright © 2011-2022 走看看