git 学习笔记(一) Git实践

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

         先大概描述下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 "[email protected]"

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

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

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

git config --global color.ui "auto"
git config --global color.diff "auto"
git config --global color.status "auto"
git config --global color.branch "auto"

  

       2.Git对于文件的管理.

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

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

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

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

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

       3.Git命令的使用

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

cd /tmp/workspace
mkdir git-project
cd git-project
git init

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

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

echo README > README.TXT
git add README.TXT                                       #添加
git commit -m "README"                               #提交到本地仓库,并说明是README
git push                                                          #如果是要提交到远程仓库,则还需要使用该命令

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

             git diff

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

diff --git a/README.TXT b/README.TXT
index e845566..1a06674 100644
--- a/README.TXT
+++ b/README.TXT
@@ -1 +1 @@
-README
+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命令后则会看到以下内容:
?? 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完成.比如我这里:

commit 1b5c1689dbfad446fbc29a001fd6498e74bb4427
Author: guoyunsky <[email protected]>
Date:   Mon Dec 26 11:52:46 2011 +0800

    create README.HTML

commit bc8460c7889aa005f6f056151505c0887c3fd5d5
Author: guoyunsky <[email protected]>
Date:   Mon Dec 26 11:48:38 2011 +0800

    README2

commit 5c7eeb2b31e5f0722cf2bfc038a51fffcea8dfe1
Author: guoyunsky <[email protected]>
Date:   Mon Dec 26 11:48:10 2011 +0800

    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来查看

# On branch master
# 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:    README.TXT
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	readme.txt
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查看:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	renamed:    README.TXT -> readme.txt
#

         

    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文件内容为如下: 

test
<<<<<<< HEAD
test3
=======
test2
>>>>>>> test

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

    局域网内搭建小组级git服务器:

    http://www.cnblogs.com/wangshuai901/archive/2012/02/22/2362924.html

   github fork后合并主库的代码

   https://segmentfault.com/q/1010000002590371

更多技术文章、感悟、分享、勾搭,请用微信扫描:

git 学习笔记(一) Git实践

相关推荐