zoukankan      html  css  js  c++  java
  • Git版本管理

    创建版本库

    第一步

      1: $ mkdir learngit
    
      2: $ cd learngit
    
      3: 显示当前目录
    
      4: $ pwd
    
      5: /Users/michael/learngit

    第二步

      1: $ git init
    
      2: Initialized empty Git repository in /Users/michael/learngit/.git/

    把文件添加到版本库

    以纯文办的方式进行编码,注意编码问题
    编写一个readme.txt文件,内容如下:放到learngit目录下(子目录也行)

      1: Git is a version control system.
    
      2: Git is free software.

    第一步,用命令git add告诉Git,把文件添加到仓库:

      1: $ git add readme.txt

    执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。

    第二步,用命令git commit告诉Git,把文件提交到仓库:

      1: $ git commit -m "wrote a readme file"

    正确显示,""里面的是本次提交的说明

    commit可以一次提交很多文件,所以你可以多次add不同的文件。

      1: [master (root-commit) eaadf4e] wrote a readme file
    
      2:  1 file changed, 2 insertions(+)
    
      3:  create mode 100644 readme.txt

    时光穿梭机

    修改readme.txt

      1: Git is a distributed version control system.
    
      2: Git is free software.

    运行git status命令看看结果:

      1: $ git status
    
      2: On branch master
    
      3: Changes not staged for commit:
    
      4:   (use "git add <file>..." to update what will be committed)
    
      5:   (use "git checkout -- <file>..." to discard changes in working directory)
    
      6: 
    
      7:     modified:   readme.txt
    
      8: 
    
      9: no changes added to commit (use "git add" and/or "git commit -a")

    git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
    虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:

      1: $ git diff readme.txt 
    
      2: diff --git a/readme.txt b/readme.txt
    
      3: index 46d49bf..9247db6 100644
    
      4: --- a/readme.txt
    
      5: +++ b/readme.txt
    
      6: @@ -1,2 +1,2 @@
    
      7: -Git is a version control system.
    
      8: +Git is a distributed version control system.
    
      9:  Git is free software.

    git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个distributed单词。
    知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了

      1: $ git commit -m "add distributed"
    
      2: [master e475afc] add distributed
    
      3:  1 file changed, 1 insertion(+), 1 deletion(-)

    提交后,我们再用git status命令看看仓库的当前状态。

      1: $ git status
    
      2: On branch master
    
      3: nothing to commit, working tree clean

    Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。

    版本回退

    现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下:

      1: Git is a distributed version control system.
    
      2: Git is free software distributed under the GPL.

    再提交。

    现在,我们回顾一下readme.txt文件一共有几个版本被提交到Git仓库里了:

      1: 版本1:wrote a readme file
    
      2: Git is a version control system.
    
      3: Git is free software.
    
      4: 版本2:add distributed
    
      5: Git is a distributed version control system.
    
      6: Git is free software.
    
      7: 版本3:append GPL
    
      8: Git is a distributed version control system.
    
      9: Git is free software distributed under the GPL.

    在Git中,我们用git log命令查看:
    如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:

      1: e0aec52e9f786f1d0710c91b19f01a68a6e54e51 (HEAD -> master) append GPL
    
      2: 03acc08c20b060f58c826fc670515547933a4e59 add distributed
    
      3: 7a7429309dfb15c891978d0d3e50385ae188623e wrote a readme file

    Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。
    每提交一个新版本,实际上Git就会把它们自动串成一条时间线
    启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是add distributed的那个版本,

      1: $ git reset --hard 7a74
    
      2: HEAD is now at 7a74293 wrote a readme file

    查看txt内容

      1: cat readme.txt
      1: Git is a version control system.
    
      2: Git is free software.

    现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?
    命令git reflog用来记录你的每一次命令:

      1: e0aec52 (HEAD -> master) HEAD@{0}: reset: moving to e0ae
    
      2: 7a74293 HEAD@{1}: reset: moving to 7a74
    
      3: e0aec52 (HEAD -> master) HEAD@{2}: reset: moving to e0ae
    
      4: e0aec52 (HEAD -> master) HEAD@{3}: commit: append GPL
    
      5: 03acc08 HEAD@{4}: commit: add distributed
    
      6: 7a74293 HEAD@{5}: commit (initial): wrote a readme file

    append GPL的commit id是1094adb,现在,你又可以乘坐时光机回到未来了。

    工作区和暂存区

    工作区就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区。

    工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库

    it的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

    git-repo

    前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

    第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

    因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

    你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

    先对readme.txt做个修改,比如加上一行内容:

      1: Git is a distributed version control system.
    
      2: Git is free software distributed under the GPL.
    
      3: Git has a mutable index called stage.

    然后,在工作区新增一个LICENSE文本文件(内容随便写)。

    先用git status查看一下状态:

      1: On branch master
    
      2: Changes not staged for commit:
    
      3:   (use "git add <file>..." to update what will be committed)
    
      4:   (use "git checkout -- <file>..." to discard changes in working directory)
    
      5: 
    
      6:         modified:   readme.txt
    
      7: 
    
      8: Untracked files:
    
      9:   (use "git add <file>..." to include in what will be committed)
    
     10: 
    
     11:         license.txt
    
     12: 
    
     13: no changes added to commit (use "git add" and/or "git commit -a")
    
     14: 

    Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked

    现在,使用两次命令git add,把readme.txtLICENSE都添加后,用git status再查看一下:

      1: On branch master
    
      2: Changes to be committed:
    
      3:   (use "git reset HEAD <file>..." to unstage)
    
      4: 
    
      5:         new file:   license.txt
    
      6:         modified:   readme.txt
    
      7: 

    现在,暂存区的状态就变成这样了:

    git-stage

    所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

      1: $ git commit -m "understand how stage works"

    一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:

      1: $ git status
    
      2: On branch master
    
      3: nothing to commit, working tree clean

    git-stage-after-commit

    注意:git diff 比较的是工作区文件与暂存区文件的区别(上次git add 的内容)

    git diff --cached 比较的是暂存区的文件与仓库分支里(上次git commit 后的内容)的区别

    管理修改

    因为Git跟踪并管理的是修改,而非文件。

    每次修改,如果不用git add到暂存区,那就不会加入到commit中。

    git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别。

    撤销修改

    git checkout -- file可以丢弃工作区的修改:

    命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

    一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

    一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

    总之,就是让这个文件回到最近一次git commitgit add时的状态。

    用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区

    git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

    场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

    删除文件

    般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

      1: $ rm test.txt

    Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

    现在你有两个选择,

    一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

    另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

      1: $ git checkout -- test.txt
    git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
  • 相关阅读:
    架构漫谈-阅读笔记(一)
    一线架构师实践指南--总结
    周四进度二
    质量属性改进
    结对作业第一次
    软件工程(2019)第三次作业
    软件工程(2019)第二次作业
    MarkDown编辑方法网址
    软件工程(2019年)第一次作业
    本人的coding地址
  • 原文地址:https://www.cnblogs.com/haoqirui/p/10273713.html
Copyright © 2011-2022 走看看