• Git 学习笔记


    1.Git介绍

     1 1-1.使用Git进行版本管理
     2   //Git是一个分布式版本管理系统,是为了更好地管理Linux内核开发而创立的;
     3   //Git可以在任何时间点,把文档的状态作为更新记录保存起来;因此可以把编辑过的文档复原到以前的状态,也可以显示编辑前后的内容差异;
     4 
     5 1-2.管理历史记录的数据库
     6   //数据库是记录文件或目录状态的地方,存储着内容修改的历史记录;在数据库的管理下,把文件和目录修改的历史记录放在对应的目录下;
     7 
     8   >.远程数据库和本地数据库
     9     >.远程数据库:配有专门的服务器,为了多人共享而建立的数据库;
    10     >.本地数据库:为了方便用户个人使用,在自己的机器上配置的数据库;
    11   //若要公开本地内容,需把内容上传到远程数据库;另外,通过远程数据库还可以获取其他人的共享的内容;
    12 
    13   >.创建数据库
    14     >.创建全新的数据库;
    15     >.复制远程数据库;
    16 
    17 1-3.修改记录的提交
    18   //执行提交后,数据库中会生成上次提交的状态与当前状态的差异记录(revision);系统会根据修改内容给出没有重复的40位字符来给提交命名;指定这个命名,就可以在数据库中找到对应的提交;
    19   //执行提交时,系统会要求输入提交信息,查看提交时要用到;
    20   
    21 1-4 工作树和索引
    22   //工作树:在Git管理下,我们实际操作的目录;
    23   //索引:在数据库和工作树之间,为了向数据库提交做准备的区域;
    24   //Git在执行提交的时候,不是直接将工作树的状态保存到数据库,而是将设置在中间索引区域的状态保存到数据库;
    25   //凭借中间的索引,可以避免工作树中不必要的文件提交,还可以将文件修改内容的一部分加入索引区域并提交;

     2.Git基础 

     1 2-1 安装Git
     2 2-2 Git设定
     3   //Git的设定会被存放在创建在用户本地目录的.gitconfig档案里;
     4   //使用config命令设定用户;
     5   $ git config --global user.name "<用户名>"
     6   $ git config --global user.email "<邮件>"
     7 
     8   //让git显示彩色
     9   $ git config --global color.ui auto
    10 
    11   //git的名利可以设定别名;"checkout"可省略为"co"来执行;
    12   $ git config --global alias.co checkout
    13 
    14   //在git中含有日文字符的文件名或显示为"346226260..";添加以下设定,让含有日文字符的文件名可以正确显示;
    15   $ git config --global core.quotepath off
    16 
    17 2-3 新建数据库
    18   //新建文件夹,在Git中cd进该文件夹;使用init命令;
    19   $ mkdir tutorial
    20   $ cd tutorial
    21   $ git init
    22   //Initialized empty Git repository in /Users/...
    23 
    24 2-4 提交文件
    25   //在tutorial文件夹添加文件;
    26   //在该文件夹,确认工作树和索引的状态使用status命令
    27   $ git status
    28 
    29   //将文件加入到索引,使用add命令,在<fild>指定加入索引的文件; 用空格分割可以指定多个文件;
    30   $ git add <file>..
    31 
    32   //指定参数 ".",可以把所有的文件加入到索引;
    33   $ git add .
    34 
    35   //执行commit命令提交
    36   $ git commit -m ".."
    37 
    38   //执行log确认数据库的提交记录
    39   $ git log

      3.共享数据库

    1 3-1 push到远程数据库
    2   //为了将本地数据库的修改共享到远程数据库,必须上传本地数据库中存储ude修改记录;
    3   //需要执行push命令,使远程数据库的修改记录和本地数据库的修改记录保持同步;
    4 
    5 3-2 克隆远程数据库
    6   //执行clone将复制远程数据库; 克隆后的本地数据库的变更履历也会被复制,可以像原始的数据库一样进行查看记录或其他操作;
    7   
    8 3-3 从远程数据库pull
    9   //执行pull操作就可以把远程数据库的内容更新到本地数据库,并覆盖本地数据库的相关内容;

      4.Git使用 

     1 4-1 创建远程数据库(Coding)
     2   $ mkdir git
     3   $ cd git
     4   $ git init
     5 
     6 4-2 push到远程数据库
     7   //使用remote命令,添加远程数据库;建立远程与本地数据库连接;
     8   $ git remote add origin http://coding.net.guosk/git.git
     9   //在远程数据库里创建了README.md文件,导致与本地版本冲突,需要先pull下来;
    10   $ git pull origin master
    11   //将本地修改上传到远程数据库
    12   $ git push -u origin master
    13 
    14   //执行推送或拉取,若省略了远程数据库的名称,则默认使用origin为远程数据库的名称;
    15 
    16 4-3 克隆远程数据库
    17   $ git clone https://coding.net/guosk/git.git
    18 
    19 4-4 从克隆的数据库进行push
    20   //从克隆版本进行修改以及push
    21   $ cd clone 
    22   $ cd git 
    23   $ git add -u 
    24   $ git commit -m "clone exercise"
    25   $ git push
    26 
    27 4-5 从远程数据库pull
    28   //在push之前,先进行pull命令,防止本地数据库覆盖远程数据库文件;
    29   $ git pull

      5.整合修改记录

     1 5-1 合并修改记录
     2   //在执行push之前,若其他人进行了推送内容到远程数据库,那么自己的push将被拒绝;
     3   //这种情况下,在读取别人push的变更并进行合并操作之前,自己的朴实都将被拒绝;这是因为如果不进行合并就试图覆盖已有的变更记录的话,其他人的push的变更就会丢失;
     4 
     5 5-2 解决冲突
     6   //执行合并即可自动合并Git修改的部分;但是也存在无法自动合并的情况;
     7   //Git会在发生冲突的地方修改文件的内容;
     8   <<<<<<<
     9   Hello.
    10   =======
    11   <strong>Hello</strong>
    12   >>>>>>>>17c860...
    13   //===分割先上方是本地数据库的内容,下方是远程数据库的内容;
    14   //此时可手动修改;然后再次add/commit/push解决冲突之后的的文件;

     6.整合修改记录2

     1 6-1 push冲突的状态
     2   //在tutorial1里修改文件并提交
     3   $ git add test.txt
     4   $ git commit -m "添加commit的说明"
     5   $ git push
     6 
     7   //在tutorial2里修改同个文件并提交
     8   $ git add test.txt
     9   $ git commit -m "添加pull说明"
    10   $ git push
    11   //此时提示:error:failed to push some refs to ...
    12   
    13 6-2 解决冲突
    14   //此时执行pull命令
    15   $ git pull origin master
    16   //打开test.txt文件,找到冲突;
    17   <<<<<<< HEAD
    18   pull      //本地内容
    19   =======
    20   commit    //远程端内容
    21   >>>>>>>> 4c0182...
    22   //手动修改文件并再次执行add/commit;
    23   $ git add test.txt
    24   $ git commit -m "merge"
    25   $ git push origin master
    26   //此时就完成合并修改;

     7.分支

     1 7-1 什么是分支
     2   //分支是为了将修改记录的整体流程分叉保存;分叉后的分支不受其他分支的影响,所以在同一个数据库里可以同时进行多个修改;
     3   
     4   //master分支:在数据库进行最初的提交后,Git会创建一个名为master的分支,因此之后的提交在切换分支之前都会添加到master分支里;
     5 
     6 7-2 分支的运用
     7   //在Git里可以自由地建立分支;
     8   
     9   //Merge分支:为了可以随时发布release而创建的分支,它还能作为Topic分支的源分支使用;保持分支稳定的状态很重要,若要进行更改,通常先创建Topic分支,而针对该分支,可以使用Jenkins之类的CI工具进行自动化编译以及测试;
    10   //通常大家将master分支当作Merge分支使用;
    11   
    12   //Topic分支:为了开发新功能或修复Bug等任务而建立的分支;
    13   //Topic分支是从稳定的Merge分支创建的,完成作业后,需把Topic分支合并会Merge分支;
    14 
    15 7-3 分支的切换
    16   //若要切换作业的分支,就要进行checkout操作,进行checkout时,git会从工作树还原向目标分支提交的修改内容;checkout之后的提交记录将被追加到目标分支;
    17 
    18   //HEAD:指向的是现在使用中的分支的最后一次更新;通常默认指向master分支的最后一次更新;通过移动HEAD,就可以变更使用的分支;
    19   //提交时使用~(tilde)和^(caret)就可以指定某个提交的相对位置;最常用的就是相对于HEAD的位置;
    20   //HEAD后面加上~(tilde)可以指定HEAD之前的提交记录;
    21   //合并分支会有多个根节点,可以用^(caret)来指定使用哪个为根节点;
    22 
    23   //stash:是临时保存文件修改内容的区域;还未提交的修改内容以及新添加的文件,留在索引区域或工作树的情况下切换到其他分支时,修改内容会从原来的分支移动到目标分支;
    24   //如果checkout的目标分支中相同的文件也有修改,checkout会失败;这时要么先提交修改内容,要么用stash暂时保存修改内容后再checkout;
    25   //stash可以暂时保存工作树和索引里还没有提交的修改内容,可以事后再取出暂存的修改,应用到原先的分支或其他的分之上;
    26 
    27 7-4 分支的合并
    28   //完成作业后的topic分支,最后要合并回merge分支;
    29 
    30   //merge:可以合并多个历史记录的流程;
    31     //合并时:如果master分支的状态没有被更改过,那么合并很简单;bugfix分支的历史记录包含master分支所有的历史记录,直接合并即可;这样的合并被称为fast-forward(快进)合并;
    32     //合并时:master分支在bugfix分支叉出去之后有新的更新,这种情况下,要把master分支的修改内容和bugfix分支的修改内容汇合起来;  因此,合并两个修改会生成一个提交;这时,master分支的HEAD会移动到该提交上;
    33 
    34   //rebase:rebase bugfix分支到master分支,bugfix分支的历史记录会添加在master分支的后面;
    35     //此时提交X和Y有可能会发生冲突,所以需要修改各自提交时发生冲突的部分;
    36     //rebase之后,master的HEAD位置不变;因此,要合并master分支和bugfix分支,即是将master的HEAD移动到bugfix的HEAD这里;
    37 
    38   //merge:保持修改内容的历史记录,但是历史记录会很复杂;
    39   //rebase:历史记录简单,在原有提交的基础上将差异内容反映进去;因此,可能导致原本的提交内容无法正常进行;
    40 
    41 7-5 topic分支和merge分支的运用

     8.操作分支

     1 8-1 事前准备
     2   //创建新目录,建立空数据库,添加myfile.txt文件;
     3   $ mkdir tutorial
     4   $ cd tutorial
     5   $ git init
     6   $ git add myfile.txt
     7   $ git commit -m "first commit"
     8 
     9 8-2 建立分支
    10   //创建分支
    11   $ git branch issue1
    12   //不指定参数直接执行branch命令时,可以显示分支列表;带有"*"的是目前所在的分支;
    13 
    14 8-3 切换分支
    15   //执行checkout命令切换分支
    16   $ git checkout issue1
    17   //在执行checkout命令时,指定"-b"选项执行,可以创建分支并进行切换;
    18   //$ git checkout -b <branchname>
    19   
    20   //在issue1分支的状态下提交,历史记录会被记录到issue1分支;
    21   $ git add myfile.txt
    22   $ git commit -m "添加add的说明"
    23   //此时HEAD在issue1里;
    24   
    25 8-4 合并分支
    26   //切换到master分支,执行merge命令,向master分支合并issue1的修改;
    27   $ git checkout master
    28   $ git merge issue1
    29 
    30 8-5 删除分支
    31   //将issue1分支的内容顺利合并到master分支上,可以将其删除;
    32   $ git branch -d issue1
    33 
    34 8-6 并行操作
    35   //创建2个分支尝试并行操作;
    36   $ git branch issue2
    37   $ git branch issue3
    38 
    39   //在issue2分支里修改文件内容,添加"two"并提交;
    40   //此时HEAD指向在issue2里;
    41   
    42   //在issue3分支里修改文件内容,添加"three"并提交;
    43   //此时HEAD指向在issue3里;
    44   
    45 8-7 解决合并的冲突
    46   //此时把issue2和issue3的修改合并到master;
    47   
    48   $ git checkout master   //切换master分支;
    49   $ git merge issue2      //执行fast-forward(快进)合并;
    50 
    51   $ git merge issue3
    52   //此时会提示自动合并失败;Automatic merge failed;
    53   //需手动修改冲突部分;再次提交;
    54   
    55   $ git add myfile.txt
    56   $ git commit -m "merge success"
    57   //因为在合并中修改了冲突部分,所以会重新创建合并修改的提交记录;这样,master的HEAD就移动到master里了;
    58   //这种合并不是fast-forward合并,而是non fast-forward合并;
    59 
    60 8-8 用rebase合并
    61   //在合并issue3分支时,使用rebase可以使提交的历史记录显得更简洁;
    62 
    63   //在issue3分支里执行rebase
    64   $ git rabase master       //Failed to merge in the changes.
    65   //此时会提示发生冲突;需手动修改;
    66 
    67   //修改后不是使用commit命令,而是执行rebase命令并指定"--continue"选项;(若要取消rebase,指定"--abort"选项);
    68   $ git add myfile.txt
    69   $ git rebase --continue 
    70   //此时master主支的issue3分支就可以fast-forward合并了;
    71 
    72   //切换到master主支后执行合并;
    73   $ git checkout master
    74   $ git merge issue3    //Fast-forward

     9.远端数据库

     1 9-1 pull
     2   //执行pull可以获取远程数据库的历史记录;
     3 
     4   >1.确认要更新的本地数据库分支没有任何更改;这时只执行fast-forward合并;
     5   >2.若本地数据库的master分支有新的历史记录,就需要合并双方的修改;
     6 
     7 9-2 fetch
     8   //只想确认本地数据库的内容而不想合并;
     9 
    10   //执行fetch就可以取得远程数据库的最新历史记录;
    11   //取得的提交会导入到没有名字的分支,这个分支可以从名为FETCH_HEAD的退出;
    12   
    13   //在这个状态下,若要把远程数据库的内容合并到本地数据库,可以合并FETCH_HEAD,或者重新执行pull;
    14 
    15   //合并后,历史记录会和pull相同;实际上pull的内容是fetch+merge组成的;
    16 
    17 9-3 push
    18   //从本地数据库push到远程数据库时,要fast-forward合并push的分支;如果发生冲突,push会被拒绝的;

     10.标签

    1 10-1 标签
    2   //标签是为了更方便地参考提交而给它标上易懂的名称;
    3 
    4   >1.轻标签:添加名称;
    5   >2.注解标签:添加名称/添加注解/添加签名
    6   //打上的标签是固定的,不能像分支那样可以移动位置;如果要移动标签,必须先删除标签再重新打上标签;
    7 
    8   //可以指定标签名称以退出,或reset在"修改提交"的讲解,还可以简单的恢复过去特定的状态;

    11.操作标签

     1 11-1 事前准备
     2   //建立目录,创建历史记录;
     3   $ mkdir label
     4   $ cd label
     5   $ git init
     6   $ git add myfile.txt
     7   $ git commit -m "one"
     8 
     9 11-2 添加轻标签
    10   //使用tag命令来添加标签;
    11   $ git tag apple
    12 
    13   //单独执行tag时,显示标签列表;
    14   $ git tag
    15 
    16   //在log命令添加"--decorete"选项,可以显示标签资料的历史记录;
    17   
    18 11-3 添加注解标签
    19   //使用tag命令指定"-a"选项执行,添加注解标签;
    20   $ git tag -a <tagname>
    21 
    22   //也可以指定-m选项来添加注解;
    23   $ git tag -am "注解内容" <tagname>
    24 
    25   //使用tag命令指定"-n"选项执行,可以显示标签的列表和注解;
    26   $ git tag -n
    27 
    28 11-4 删除标签
    29   //使用tag命令指定"-d"选项执行;
    30   $ git tag -d <tagname>

     12.改写提交

      1 12-1-1 改写最近的提交
      2   //指定amend选项执行提交的话,可以修改同一个分支最近的提交内容和注解;
      3   $ git commit --amend  //进入vim编辑器,可以修改最近提交的注解;
      4   >.添加最近提交时漏掉的档案;
      5   >.修改最近提交的注释
      6 
      7 12-1-2 commit --amend
      8   //修改上一次提交的Msg
      9   $ git add sample.txt        
     10   $ git commit --amend    //进入vim编辑器,修改最近提交的Msg;
     11 
     12   $ git log               //可查看提交日志;
     13 
     14 12-2-1 取消过去的提交
     15   //在revert可以取消指定的提交内容;
     16   //使用rebase -i或reset也可以删除提交;
     17   //但是不能随便删除已经发布的提交,这是需要通过revert创建要否定的提交;
     18   >.安全的取消过去发布的提交
     19 
     20 12-2-2 revert 
     21   //利用revert命令来取消"最近一次"提交;
     22   $ git log           //查看历史记录
     23   $ git revert HEAD   //进入vim编辑器,"Revert '最近一次提交Msg'"
     24   //Successed取消最近一次提交;
     25 
     26 12-3-1 遗弃提交
     27   //在reset可以遗弃不再使用的提交;
     28   //执行遗弃时,需要根据影响的范围而指定不同的模式,可以指定是否复原索引或工作树的内容;
     29   
     30   //遗弃模式
     31   模式名称      HEAD位置      索  引     工作树
     32   soft          修改          不修改     不修改
     33   mixed         修改          修  改     不修改
     34   hard          修改          修  改     修  改
     35 
     36   >.复原修改过的索引的状态(mixed)
     37   >.彻底取消最近的提交(hard)
     38   >.只取消提交(soft )
     39 
     40 12-3-2 reset 
     41   //利用reset来删除master分支最近几次提交;
     42   $ git reset --hard HEAD~~   //"~"代表一次提交;
     43   //Successed删除了最近两次提交;
     44 
     45   //reset操作错误时,在ORIG_HEAD上reset就可以还原到reset前的状态;
     46   $ git reset --hard ORIG_HEAD
     47 
     48 12-4-1 提取提交
     49   //在cherry-pick,可以从其他分支复制指定的提交,然后导入现在的分支;
     50   >.把弄错的分支的提交移动到正确的地方;
     51   >.把其他分支的提交添加到现在的分支;
     52 
     53 12-4-2 cherry-pick
     54   //将其他分支的历史记录导入到master分支;
     55   $ git checkout master       //切换到master分支;
     56   $ git cherry-pick 99daed2   //挑选其他分支的历史记录;
     57   $ git add sample.txt        //导入记录后提交;
     58   $ git commit -m "cherry-pick"
     59 
     60 12-5-1 改写提交
     61   //在rebase指定选项"i",可以改写/替换/删除或合并提交;
     62   >.在push之前,重新输入正确的提交注释;
     63   >.清楚地汇合内容含义相同的提交;
     64   >.添加最近提交时漏掉的档案;
     65 
     66 12-5-2 rebase -i 汇合提交
     67   //汇合最近两次提交,合并到一个提交;
     68   $ git rebase -i HEAD~~
     69   //Vim编辑器将会打开,显示从HEAD到HEAD~~的提交;
     70   //在Vim中,将第二行的"pick"改成"squash(挤压)",保存退出;
     71   //由于合并后要提交,Vim会再次打开;此时编辑汇合提交的信息,然后保存退出;
     72   //此时两次提交就合并成一个提交了;
     73   
     74 12-5-3 rebase -i 修改提交 
     75   //修改倒数第二次提交;
     76   $ git rebase -i HEAD~~      //定位到最近两次提交;
     77 
     78   //将第一行的"pick"改成"edit",保存退出;
     79 
     80   $ git add sample.txt
     81   $ git commit --amend    //修改最近提交的Msg; 
     82   $ git rebase --continue 
     83   //若中途停止rebase操作,在rebase后添加"--abort"选项即可;
     84   
     85   //实际上,rebase之前的提交会以ORIG_HEAD之名存留;若rebase之后无法复原到原先的状态,可以用git reset --hard ORIG_HEAD复原到rebase之前的状态;
     86 
     87 12-6-1 汇合提交
     88   //使用merge的选项"squash",指定分支的合并,就可以把所有汇合的提交添加到分支上;
     89   >.汇合主题分支的提交,然后合并提交到目标分支;
     90 
     91 12-6-2 merge --squash
     92   //把issue1分支的所有提交合并成一个提交,并导入到master分支;
     93 
     94   $ git checkout master
     95   $ git merge --squash issue1    //自动合并issue1分支;
     96 
     97   //修改冲突后提交;
     98   $ git add sample.txt
     99   $ git commit 
    100 
    101   //issue1分支上所有的提交都汇合并添加到master分之上;
  • 相关阅读:
    5G 时代,云计算迎来新风口
    阿里云VS腾讯云 谁才是中国未来的云计算之王?
    IaaS,PaaS,SaaS 的区别
    财经天下周刊:中国云计算——马化腾的救命稻草 任正非的“下个荣耀”
    HDOJ-1671 Phone List
    【转】Java进阶之路
    Delphi XE2 之 FireMonkey 入门(30)
    Delphi XE2 之 FireMonkey 入门(29)
    Delphi XE2 之 FireMonkey 入门(28)
    Delphi XE2 之 FireMonkey 入门(27)
  • 原文地址:https://www.cnblogs.com/yizihan/p/4234473.html
Copyright © 2020-2023  润新知