【free style】华为云之git学习笔记

举报
yd_79585289 发表于 2017/11/22 11:35:56 2017/11/22
【摘要】 网上有很多教程,这里我自己做下整理,省得有时忘记,有道是好记性不如烂博客! 先大概描述下Git的各种命令: git init #初始化 git clone #将远程项目拷贝到本地 git add # 提交文件更改(修改

网上有很多教程,这里我自己做下整理,省得有时忘记,有道是好记性不如烂博客!

         先大概描述下Git的各种命令:

          git init                     #初始化

          git clone                  #将远程项目拷贝到本地

          git add                    # 提交文件更改(修改和新增)

          git commit              # 基于当前分支提交修改

          git reset                  # 去除某个提交之后的一切提交记录

          git log                     # 查看当前分支下的某个提交记录

          git whatchanged   # 查看更详细的提交记录,可以看到具体哪些文件做了修改

          git status                # 查看当前状态

          git checkout            # 切换分支或者回滚到某个提交

          git branch               # 创建或查看分支    

          git merge                # 合并目标分支到当前分支  

 

       1.Git配置:

          Git有三种配置方式,一种是针对全部用户,一种是针对当前用户,还有一种是针对当前工程.

          1)全部用户:/etc/gitconfig     通过git config --system进行配置

          2)当前用户:~/.gitconfig       通过git config --global进行配置

          3)当前工程:.git/config         

               同时当前工程的配置会覆盖当前用户的配置,当前用户的配置也会覆盖全部用户的配置

        

          我们更多的是针对~/.gitconfig和.git/config进行配置.如可以通过以下命令对当前用户进行配置:

          git config --global user.name "userName"

          git config --global user.email "userName@gmail.com"

          随后我们就可以通过vi ~/.gitconfig或git config --global --list进行查看当前用户的配置

          具体配置我们可以通过git help config查看

          这里贴上一段对git显示的脚本,方便你使用git命令

Shell代码  收藏代码

  1. git config --global color.ui "auto"  

  2. git config --global color.diff "auto"  

  3. git config --global color.status "auto"  

  4. git config --global color.branch "auto"  

  

       2.Git对于文件的管理.

          对于Git而言,文件只有两种状态:untracked和tracked,也就是未跟踪和已跟踪.

          同时已跟踪文件又分为三种状态:

               unmodified:文件没有做过任何修改

               modified:文件已经修改了,但还没有提交

               staged:文件已经修改,准备提交

 

       3.Git命令的使用

          1)在本地创建Git工程,这里我把工程创建到/tmp/workspace下,没有该目录需先创建.然后Git工程名是git-project

Shell代码  收藏代码

  1. cd /tmp/workspace  

  2. mkdir git-project  

  3. cd git-project  

  4. git init  

      当看到Initialized empty Git repository in /tmp/workspace/git-project/.git/ 就表示已经创建成功

 

          2)提交更新文件(这里请注意,这里的更新包括新增,修改),比如我这里想新增一个说明文件README.TXT,同时提交到Git仓库

Shell代码  收藏代码

  1. echo README > README.TXT  

  2. git add README.TXT                                       #添加  

  3. git commit -m "README"                               #提交到本地仓库,并说明是README  

  4. git push                                                          #如果是要提交到远程仓库,则还需要使用该命令  

 

         3)有时以下记不得具体对工程做了哪些修改,则可以使用git diff,比如
             echo README2 > README.TXT                      # 先修改README.TXT,以便查看内容变化

             git diff

             然后控制台可以看到如下内容:

Shell代码  收藏代码

  1. diff --git a/README.TXT b/README.TXT  

  2. index e845566..1a06674 100644  

  3. --- a/README.TXT  

  4. +++ b/README.TXT  

  5. @@ -1 +1 @@  

  6. -README  

  7. +README2  

            为了下面的完整性,这里我再将修改README.TXT给提交上去,可以用一条语句搞定:

            git commit -a -m "README2"

 

         4)上面git diff只是对比已经提交了的文件,也就是git tracked的文件的更新情况.如果你新建了一个文件,但没有提交给git仓库的话,git diff是跟踪不到的.这里我们要使用git status.如下:

           echo README > README.HTML                        #新建README.HTML文件

           git diff                                                              # 看不到有什么变化

           使用git status -s命令后则会看到以下内容:

Shell代码  收藏代码

  1. ?? README.HTML  

 

           将README.HTML也提交上去

           git add README.HTML 

           git commit -m "create README.HTML"

        

     5) 和git仓库里某个文件内容一致,比如你对一个文件做了些修改,但不想要了,想跟仓库中该文件内容一样,则

             echo README3 > README.TXT   # 先修改README.TXT,这里用cat README.TXT看到的是README3

             git checkout -- README.TXT       # 同步git仓库中README.TXT内容,再从README.TXT看到的是README2

             可能一次提交了多个文件,但不可能每个文件都git checkout吧.还可以有另外一种方式,通过git log查看你commit的key,再通过git checkout commit_no完成.比如我这里:

Shell代码  收藏代码

  1. commit 1b5c1689dbfad446fbc29a001fd6498e74bb4427  

  2. Author: guoyunsky <xxx@xxx.com>  

  3. Date:   Mon Dec 26 11:52:46 2011 +0800  

  4.   

  5.     create README.HTML  

  6.   

  7. commit bc8460c7889aa005f6f056151505c0887c3fd5d5  

  8. Author: guoyunsky <xxx@xxx.com>  

  9. Date:   Mon Dec 26 11:48:38 2011 +0800  

  10.   

  11.     README2  

  12.   

  13. commit 5c7eeb2b31e5f0722cf2bfc038a51fffcea8dfe1  

  14. Author: guoyunsky <xxx@xxx.com>  

  15. Date:   Mon Dec 26 11:48:10 2011 +0800  

  16.   

  17.     README  

 

 

       之前是想回滚到README2,它的commit是bc8460c7889aa005f6f056151505c0887c3fd5d5.

所以我们只需git checkout bc8460c7889aa005f6f056151505c0887c3fd5d5
即可.

       这个可以随便切换到任意commit.比如我又想回到README,HTML.

       则直接git checkout 1d30434716df7e95a533e20f2973a107eb65b0d1即可

 

       6)GIT 回退 GIT checkout

          通过上面git log可以看出git checkout后git仓库中并不会发生变化,包括索引文件和源码.所以这里引入git reset.

          比如我这里就只要README这个提交下的源码,README之后的所有修改都是无效的.这也意味着Git仓库中README这个提交是最新.所以需要删除掉README2和create README.html的commit.这里就可以使用git reset了.具体命令如下:

      git reset --hard 571d6fac5b8218b40953e478dbb28e41c5511904

      同时本地的代码也是README状态!所以这个可是要慎用!因为不仅git仓库没有了相关索引文件和源码,连你本地的源码也被清除,只有README状态下的源码.你可以用git log查看下,发现只有README这个提交了

 

       有时我们有这样一种需求,比如想取消某一次提交,但不想修改本地代码,只是不想在git仓库中提交.我们也可以使用git reset.如我想取消最近一次提交,则可以

       git reset --soft HEAD~1

       那么你上一次提交就不会反应到Git仓库中去了.

       这里介绍下git reset:

        git reset HEAD filename   #从暂存区中删除文件

        git reset –hard HEAD~3   #会将最新的3次提交全部清空,那么仓库中最新的代码应该是HEAD~4,之前三次提交全部没了
        git reset –hard commit bc8460c7889aa005f6f056151505c0887c3fd5d5 #回退到bc8460c7889aa005f6f056151505c0887c3fd5d5 版本

         git reset –mixed    #此为默认方式,不带任何参数的git reset,回退到某个版本,只保留源码,回退commit和index信息
         git reset –soft       #回退到某个版本,只回退了commit的信息,不会恢复到index file。如果还要提交,直接commit即可
        git reset –hard      #彻底回退到某个版本,本地的源码也会变为上一个版本的内容 

 

      7)修改文件名,这里不在是修改文件内容.修改文件名的话,比如这里修改README.TXT为readme.txt,对于Git来说,是删除了README.TXT新增了readme.txt文件.我们可以通过git status来查看

Shell代码  收藏代码

  1. # On branch master  

  2. # Changes not staged for commit:  

  3. #   (use "git add/rm <file>..." to update what will be committed)  

  4. #   (use "git checkout -- <file>..." to discard changes in working directory)  

  5. #  

  6. #   deleted:    README.TXT  

  7. #  

  8. # Untracked files:  

  9. #   (use "git add <file>..." to include in what will be committed)  

  10. #  

  11. #   readme.txt  

  12. no changes added to commit (use "git add" and/or "git commit -a")  

      但Git不可能这样弱智,可以使用git mv README.TXT readme.txt,如发生错误可以视情况强制执行:git mv -f README.TXT readme.txt,再通过git status查看:

Shell代码  收藏代码

  1. # On branch master  

  2. # Changes to be committed:  

  3. #   (use "git reset HEAD <file>..." to unstage)  

  4. #  

  5. #   renamed:    README.TXT -> readme.txt  

  6. #  

         

    8) Git删除文件

             git rm HEADME.TXT

             git commit -m "delete README.TX

             以上会在git仓库中删除README.TXT,同时以后也不会再跟踪这个文件.如你输入git diff则不会再拿这个文件去对比.但有时我们只想删除跟踪这个文件,但还想在git仓库中保留这个文件.则可以使用这个命令:

             git rm --cached  README.TXT

 

     9)Git分支 git branch

          分支是个永恒的概念,比如很多开源程序都有版本以及不同的功能实现.如Hadoop被用到各个方面.

          git branch branch_name            #创建分支

          git branch -r                              #查看远程分支,也就是你git仓库里有哪些分支

          git branch -a                              # 查看所有分支,远程和本地

          git branch --no-merge                # 查看所有未合并的分支

          git branch --merge                     # 查看所有已合并的分支

          git checkout branch_name         # 切换到某个分支

          git checkout -b branch_name     # 创建并且切换到某个分支

          git branch -d branch_name        # 删除某个分支,仅能删除合并了的分支

          git branch -D branch_name       # 删除某个分支,未能合并的分支也能删除

          git merge dest_branch               # 将目标分支合并到你当前分支

 

          以上只是命令,这里来个实践.我们重新建个git工程.也算是对git有个大概的使用

          #创建git工程

          mkdir git-branch-test

          cd git-branch-test

          git init

 

          echo "test" > test.txt

          git add test.txt

          git commit -m "test"                #提交到master分支

 

          git checkout -b test                  #创建并进入test分支

          echo "test2" >> test.txt          #追加文件内容到test.txt,如此test分支中test.txt文件内容已修改

          git add test.txt

          git commit -m "test2"              #提交到test分支

 

          git checkout master                 #切换到master分支

          echo "test3" >> test.txt          #追加内容到test.txt,如此master分支中test.txt文件内容又有修改

          git add test.txt

          git commit -m "test3"             #提交到master分支

 

          经过以上命令,我们知道master分支中提交过两次,test.txt文件内容是test test3.而test分支也同样提交过两次,内容是test test2.这里我们将test分支合并到master中:

           git checkout master

           git merge test

           之后再跟test.txt文件内容为如下: 

Shell代码  收藏代码

  1. test  

  2. <<<<<<< HEAD  

  3. test3  

  4. =======  

  5. test2  

  6. >>>>>>> test  

          可以看到合并之后有冲突,那需要我们根据实际情况处理.


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。