• Git 使用总结


    Git是什么

    Git是一个分布式版本控制系统。它可以很方便的记录你的每一次变动,而不需要每次都备份,还能让你和他人很方便的协同开发。这样你每次做了什么改动,瞄一眼就一清二楚了。

    --

    安装Git

    从官网下载适合自己电脑的Git,点击安装,一路“Next”就可以了。安装完成,打开Console开始设置Git参数。

    $ git config --global user.name "xxx"
    $ git config --global user.email "xxx@xxx.xxx"
    //在上面的两个引号中分别填写你的名字和邮箱。
    //由于Git是分布式的版本控制系统,可能会有很多用户,每个用户需要有自己的名字和邮箱来互相区分。

    --

    创建版本库(repository)

    简单的说,你可以将版本库理解为一个目录。我们用Git来管理我们的文件,所以你得告诉Git你需要它管理哪个目录下的文件,这个目录就是版本库。

    git init
    
    //创建一个learnGit目录,并进入learnGit目录,创建版本库
    md learnGit
    cd learnGit
    git init

    --

    添加文件到版本库中

    仓库下创建的文件以及目录需要手动的提交到仓库中。提交分为两步:
    1. git add
    2. git commit -m "提交的说明"

    先创建一个文件叫做readme.txt,里面输入

    Git is amazing!
    I love Git!

    接着将这个readme.txt提交到仓库中:

    > git add readme.txt
    warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory.
    
    > git commit -m "add a readme file"
    [master (root-commit) e7ddd65] add a readme file
    warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory.
     1 file changed, 3 insertions(+)
     create mode 100644 readme.txt

    --

    工作区的状态

    使用git status查看目前工作区的状态信息

    将readme.md修改为

    Git is great!
    I love git!

    接着使用git status命令

    > 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")

    --

    查看文件的修改内容

    虽然我们可以通过git status知道文件被修改了,但是我们并不了解到底修改了哪些内容。因此使用git diff可以知道具体的修改内容。

    > git diff readme.txt
    diff --git a/readme.txt b/readme.txt
    index 2482f69..8e882dd 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -1,3 +1,2 @@
    -Git is amazing!
    -I love Git!
    -
    +Git is great!
    +I love git!
     No newline at end of file
    warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory.

    --

    查看整个修改过程状态

    将修改过的文件进行提交

    > git add readme.txt

    再来看当前工作区的状态

    > git status
    warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory.
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            modified:   readme.txt

    继续提交修改后的文件

    > git commit -m "amazing became great"
    [master warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory.
    469dcdc] amazing became great
    warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory.
     1 file changed, 1 insertions(+), 1 deletions(-)

    再来看当前工作区的状态

    > git status
    On branch master
    nothing to commit, working directory clean

    --

    历史记录

    git log命令可以查看所有的历史记录

    > git log
    commit e4af028a493a4459fea0c0f673149281e0d11949
    Author: LIYANG <liyangtom@163.com>
    Date:   Tue Apr 26 16:17:58 2016 +0800
    
        add new line
    
    commit 469dcdcd4de36234666885f87fa581441a834992
    Author: LIYANG <liyangtom@163.com>
    Date:   Tue Apr 26 16:07:00 2016 +0800
    
        amazing became great
    
    commit e7ddd658bf0e5791acd07c25a56ba1c4fba1a181
    Author: LIYANG <liyangtom@163.com>
    Date:   Tue Apr 26 15:49:34 2016 +0800
    
        add a readme file

    --

    历史记录

    git log 命令给出了你的每一次提交,并按时间顺序依次显示,非常详细。但是有时候你只想要一个简单的结果,可以 git log --pretty=oneline

    > git log --pretty=oneline
    e4af028a493a4459fea0c0f673149281e0d11949 add new line
    469dcdcd4de36234666885f87fa581441a834992 amazing became great
    e7ddd658bf0e5791acd07c25a56ba1c4fba1a181 add a readme file

    --

    返回历史记录

    在Git中有个指针叫做HEADHEAD指向哪个快照,你现在就在哪个状态。对于第N个状态的版本HEAD~N

    > git reset --hard HEAD~2
    HEAD is now at e7ddd65 add a readme file

    --

    返回历史记录失败

    如果现在又想重新回到add new line这个版本怎么办。很简单,只要知道add new linecommit id就可以了。所以你理所当然的使用git log查看commit id

    > git log --pretty=oneline
    469dcdcd4de36234666885f87fa581441a834992 amazing became great
    e7ddd658bf0e5791acd07c25a56ba1c4fba1a181 add a readme file

    add new line不见了!记住git log只能查看HEAD及HEAD以前的版本。

    --

    查看所有历史操作

    git reflog 这个命令可以查看所有操作命令

    > git reflog
    469dcdc HEAD@{0}: reset: moving to HEAD~1
    e4af028 HEAD@{3}: commit: add new line
    469dcdc HEAD@{4}: commit: amazing became great
    e7ddd65 HEAD@{5}: commit (initial): add a readme file

    这时你就知道了add new line 的id了,你就可以很开心的回去了

    > git reset e4af028
    Unstaged changes after reset:
    M       readme.txt

    --

    工作区

    工作区就是你存放一切文件的那个目录。比如前面我们新建了一个目录,叫learnGit,然后进入learnGit,在learnGit目录下使用git init命令把learnGit变成了一个Git可以管理的目录。Git自动生成了一个隐藏目录叫.git。此时,这个learnGit目录就是工作区。

    --

    版本库

    工作区中各有一个隐藏目录叫.git.git就是版本库。你commit提交的就是这个地方。

    --

    暂存区

    虽然.git目录是隐藏的,但你仍然可以打开。打开.git,进去以后你会发现里面有很多目录和文件。其中有一个名叫index的文件,这个index文件就是暂存区stage。暂存区是版本库里的一个临时存储的地方,经由暂存区,再提交到版本库。

    git版本控制的逻辑过程:

    1. 首先,你在工作区创建了一个文件或者修改了一个文件

    2. 然后你有输入了git add,此时文件实际上是被添加到了暂存区stage,也就是那个index文件

    3. 接着,你又输入git commit,这才算是正式提交。Git默认给我们创建了一个master分支和一个指向master分支的HEAD指针。


    --

    复杂修改恢复 CND.1

    第1种情况: 在工作区产生的修改还没有git add添加到暂存区。你当然可以直接打开编辑器改回到之前的样子,但我们希望Git来帮我们做这件事, 可以执行命令git checkout -- file

    比如你在readme.txt中新添加了一行文本 。

    Git is great!
    I love git!
    just add line

    这时候就产生了一个修改,现在你后悔了,觉得不应该添加这一行。

    $ git checkout -- readme.md

    输入完命令以后没有任何提示。没有提示证明你没错。 这时你再打开readme.txt查看一下,发现刚才添加的just add line这一行已经没有了。


    --

    复杂修改恢复 CND.2

    第2种情况: 在工作区产生的修改添加git add到了暂存区。此时只能把这个修改打回到工作区,然后在工作区把这个修改给杀掉。可以执行命令行git reset HEAD file
    > git reset HEAD readme.txt
    Unstaged changes after reset:
    M       readme.txt
    
    > git checkout readme.txt


    --

    删除文件 PART.1

    删除文件也是一种修改,因为工作区里的东西发生了变化

    新创建一个文件,然后git add,再git commit

    > echo >new.txt
    > git add new.txt
    > git commit -m "create new.txt"
    [detached HEAD 21e3fe5] create new.txt
     1 file changed, 1 insertion(+)
     create mode 100644 new.txt

    --

    删除文件 PART.2

    然后再把它删了

    > del new.txt

    这时候Git发现你在工作目录里删了一个文件,但是Git的版本库里仍然还存在着new.txt

    > git status
    HEAD detached from 9baed55
    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:    new.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")

    --

    删除文件 PART.3

    如果你确定真的要把new.txt删除掉,那就需要执行命令git rm file

    > git rm new.txt
    rm 'new.txt'

    git status一下,发现你的操作还没有正式提交

    > git status
    HEAD detached from 9baed55
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            deleted:    new.txt

    你需要再次git commit

    > git commit -m "del new.txt"
    [detached HEAD 5e46854] del new.txt
     1 file changed, 1 deletion(-)
     delete mode 100644 new.txt

    --

    创建GitHub帐号 Part.1

    GitHub的官网注册一个账号,注册之后点击Settings


    在左侧栏选择SSH keys,点击New SSH keys


    --

    创建GitHub帐号 Part.2

    进去Git安装目录的usrin目录,在命令行输入以下命令

    //把里面的xxx@xxx.xxx部分换成你的邮件地址,然后一路回车就行了。
    //这样就在用户主目录(C:Documents and Settings用户名.ssh)下生成了密钥对
    // id_rsa是私钥,id_rsa.pub是公钥
    $ ssh-keygen -t rsa -C "xxx@xxx.xxx"

    回到GitHub在Title一栏中随便填一个名字,然后将id_rsa.pub中的内容粘贴到Key栏, 点击Add SSH key按钮就完成了。


    --

    创建GitHub仓库

    在GitHub上创建一个仓库,点击New repository


    Repository name一栏中随便填写一个名字作为仓库名。然后直接点击Create repository按钮。


    --

    GitHub仓库

    仓库的基本界面如下,因为我们使用的是SSH协议,而不是HTTPS协议,所以将默认的HTTPS切换成SSH


    --

    关联远程仓库

    第一种情况: 你在本地还没有建立一个仓库

    echo "# learnGit" >> README.md
    git init
    git add README.md
    git commit -m "first commit"
    git remote add origin git@github.com:liyang/learnGit.git
    git push -u origin master

    第二种情况:如果你在本地已经有了一个仓库

    git remote add origin git@github.com:liyang/learnGit.git
    git push -u origin master

    --

    创建分支 Part.1

    首先创建一个test.txt的文件,在里面输入:

    # this is a test file

    然后将它提交:

    $ git add test.txt
    $ git commit -m "add a test file"

    接着创建一个dev分支。

    $ git branch dev

    --

    创建分支 Part.2

    这样就生成了一个叫dev的分支。但别忘了,我们现在仍然在master分支

    $ git branch
      dev
    * master
    //git branch会列出所有的分支,并在当前分支的前面加上一个*号。

    如果需要切换到dev分支,只需执行

    $ git checkout dev
    //撤销修改的语法是:git checkout -- file
    //而切换分支命令没有 -- 这两个短横。

    如果你希望创建一个分支并直接切换到那个分支,只需执行

    $ git chekcout -b dev
    //这样将会创建dev分支并直接切换到dev分支。

    --

    修改分支 Part.1

    在dev分支中进行修改。在test.txt后面加上一行

    # this is a test file
    first line

    接着进行提交

    $ git add test.txt
    $ git commit -m "add first line  on dev"

    然后切换回master分支:

    $ git checkout master

    当切换回master分支后,打开test.txt,发现刚才添加的一行"first line"不见了, 因为"first line"是在dev分支上提交的。

    # this is a test file

    --

    合并分支

    现在在master分支上,准备跟dev分支合并:

    $ git merge dev
    Updating 0fed6b6..38fb696
    Fast-forward
    test.txt | 1 +
    1 file changed, 1 insertion(+)

    合并完成以后,可以删除dev分支

    $ git branch -d dev

    --

    抓取分支

    git clone url可以克隆远程仓库到本地

    git clone https://github.com/roastlechon/nodejs-rtorrent.git
  • 相关阅读:
    jQuery基础
    深入理解JVM内存模型(jmm)和GC
    oracle,哪些操作会导致索引失效?
    systemd
    一个我小时候玩过的我是猪不然关机的软件,我高仿了一个,超简单。
    自己写的求最大值实现,用到了模板函数。
    poj 1695
    poj 1192
    poj 1239
    poj 1170
  • 原文地址:https://www.cnblogs.com/kevingrace/p/5634005.html
Copyright © 2020-2023  润新知