Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6034
  • 博文数量: 2
  • 博客积分: 40
  • 博客等级: 民兵
  • 技术积分: 32
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-06 13:46
文章分类

全部博文(2)

文章存档

2014年(2)

我的朋友

分类: 项目管理

2014-06-21 22:56:24

将这本书  的前3章读了2遍,写下一点Git学习笔记。

------------------------
### Basic Commands
------------------------


git help


## 取得项目的Git仓库
   # 1) 为工作目录创建新仓库
   git init 
   git add .
   git commit


   # 2) 从现有仓库clone一个仓库到本地
   git clone [url] [my-defined-name]
     # 比如,git clone git://github.com/schacon/grit.git
     # 这会在当前目录下创建出一个grit目录,其中包含一个.git子目录
     # 第二个参数 my-defined-name 可选,用来定义本地的项目目录名称


## 检查当前文件状态
  git status
  
## stage已修改的文件
  git add 
  
## 查看文件差异
  git diff                               # 查看 modified文件 和 staging文件 的差异
  git diff --cached 或 git diff --staged # 查看 staging 文件 和 commit 文件 的差异


## 配置
  git config --global user.name "FinixLei"
  git config --global user.email "finixlei@gmail.com"
  git config --global core.editor “C:\Program Files (x86)\Notepad++”
  git config --list


## 提交
  git commit -a # 对所有已经跟踪过的文件自动stage,然后再一并提交,从而跳过 git add 步骤
                # 注意,不会对从未运行过“git add”的文件进行自动stage


## 删除文件
  git rm # 先把想删除的文件物理删除,然后运行此命令,最后commit,即可删除文件。
                # 如果删除之前修改过且已存在staging区域的话,则必须要用强制删除选项-f,以防误删除文件后丢失修改的内容。
              
  git rm --cached    # 将文件从staging区域移除(因为之前将其忘记加入.gitignore文件),但并不从工作目录中移除。
                            # 最后再将此类文件加入.gitignore
                            # 比如,编译过程中的.o文件


## 移动文件
  git mv file_from file_to  # 修改文件名 (实际上本命令相当于3条命令:mv + git rm + git add)


## 查看历史
  git log
  git log -p -2 # -p 显示每次commit的内容差异,-2 显示最近2次更新
          --word-diff   # 显示单词层面的变化
          --stat        # 显示简要的增改行数统计


## 图形化工具
  gitk


## 撤销操作
  # 1) 撤销commit操作
    git commit --amend # 此命令将使用当前的staging区域快照提交。
                       # 如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明。
  
    # 如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交:
    $ git commit -m 'initial commit'
    $ git add forgotten_file
    $ git commit --amend
    # 以上3条命令其实只做了一次commit


  # 2) 撤销stage操作
    比如,不小心运行了 git add . 使得当前文件夹下所有文件都被添加到了staging区域,若要取消,运行下面的命令:
    git reset HEAD  
    可将从staging区域移出。


  # 3) 撤销modify操作
    git checkout --  # 将恢复为上次commit时的版本


## 远程仓库
  # 1) 查看当前的远程仓库
    git remote      # 列出每个远程库的简短名字
    git remote -v   # 显示对应的clone地址
                    # 注意,只有显示为SSH URL的,才有权限push数据上去


    git clone git://github.com/schacon/ticgit.git
    在克隆完某个项目后,至少可以看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库。
  
  # 2) 添加远程仓库
    git remote add [shortname] [url]  # 添加一个远程仓库
  
  # 3) 从远程仓库抓取数据
    git fetch [remote-name]  # 抓取remote-name远程仓库上有而本地仓库没有的信息
                             # fetch 命令只是将远端的数据拉到本地仓库,并不做自动合并的工作,只有当确实准备好了,才能手工合并。


    git pull 
      # 如果设置了某个branch用于跟踪某个远端仓库的branch(参见下节及第三章的内容),可以使用 git pull  命令,它会自动抓取数据下来,并将远端branch自动合并到本地仓库中当前branch。
  
      # 实际上,默认情况下 git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。
      # 一般我们运行 git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
  
  # 4) push数据到远程仓库
    git push [remote-name] [branch-name]  # 比如,git push origin master
                                          # 如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回;
                                          # 你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。
  
  # 5) 查看远程仓库的信息
    git remote show [remote-name] 
  
  # 6) 远程仓库的删除和重命名
    git remote rename
    git remote rm
  
## 打 tag (标签)
  # 1) 列出已有的tag
    git tag
    git tag -l 'v1.4.2.*'
    
  # 2) 新建tag
  # Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。
  # 轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。
  # 含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。
  # 一般我们都建议使用含附注型的标签,以便保留相关信息
  
  git tag -a v1.4 -m 'my version 1.4'   # -a 表示annotated
  git show v1.4 # 查看相应标签的版本信息
  
-----------------------------
### Brach
-----------------------------


Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。(3.1节解释很清楚)
Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。
在 Git 中,它是一个指向你正在工作中的本地分支的指针(将 HEAD 想象为当前分支的别名)。


## git branch 命令
  # 1) git branch       # 没有参数,列出所有branch
       git branch -v    # 查看各个branch最后一次commit的信息;前面有*的分支是当前分支
       
       git branch --merged  # 查看哪些branch已经被并入了当前的branch;
                            # 一般来说,这里列出的非当前分支都可以被删除。
                            
       git branch --no-merged   # 查看尚未合并到当前分支的其他分支
  
  # 2) git branch     # 创建新branch (添加个指针而已)
  
  # 3) git branch -d  # 删除branch (其实就是删除那个指针)
       git branch -D  # 一般来说,还没合并过来的分支不该被删除 (用 git branch --no-merged 查看),但假若真的想删除,就用-D选项强制删除。
  
## 切换到其他branch
  git checkout       # 切换到其他branch  
  git checkout -b    # 新建并切换到该branch. -b的作用就是新建branch. 
                                    # 相当于2条命令:git branch + git checkout
  
## 合并branch
  git merge   # 若在branch A上,运行 git merge B, 表示将branch B的内容merge到branch A上
                            # 实质上是生成一个 A 和 B 的共同后代,再将A的指针指向它,仍表示branch A. 


## 解决merge时的冲突
  # 1) git status 可以用来查阅哪些文件冲突了
  
  # 2) 手动解决冲突后,用 git add 将其标明为resolved状态
  
  # 3) 解决冲突的图形工具
       git mergetool    # 可以自己指定工具,参见 git help config
       
## 远程分支 (remote branch)
  # 以下用 / 来表示远程分支
  # 其实质是一个在本地无法移动的指针
   
  # 1) 同步远程服务器上的数据到本地
    git fetch
     
  # 2) push本地分支
    git push    
      # 比如:     git push origin serverfix
      # 也可写作: git push origin serverfix:serverfix 含义是:将本地的serverfix分支上传到远程仓库中并仍命名为serverfix
      # 所以,也可写作: git push origin serverfix:remote_serverfix 这样就是上传后在远程仓库中将该分支重命名为remote_serverfix了
        
  # 3) 在远程分支的基础上分化出新的本地分支
    git checkout -b /
    
    # 若这里的local branch的名字和remote branch的名字相同,以上命令还可以简化为:
    # git checkout --track /
    
    # 这里的 又被称为跟踪分支(tracking branch),是一种和远程分支有直接联系的本地分支。
    # 在跟踪分支里输入git push,Git会自动判断该往哪个服务器的哪个分支推送数据。
    # 同样,在跟踪分支里运行git pull,Git会自动获取对应的远程分支里的最新数据,并自动合并到该跟踪分支。
    
    # 所以,默认的git clone命令是自动创建了一个名为 master 的分支来跟踪 origin/master. 这就是 git push 和 git pull 一开始就能正常工作的原因。


  # 4) 删除远程分支
    git push :
      # 本来冒号左边若写 ,则相当于把本地分支推送到远程分支上;
      # 但现在什么都不写,正相当于本地分支为空,即推送空到远程分支,也就是删除远程分支了。
     
## branch 的 rebase


   git checkout experiment
   git rebase master 
     # 回到2个分支最近的共同祖先,根据当前分支experiment后续的历次提交对象,生成一系列补丁;
     # 然后对基底分支(这里即master)的最后一个commit对象应用所有补丁,最后生成一个新的合并对象;
     # 这样也就改写了experiment的提交历史,使其成为了master分支的直接下游。(见3.6节的图示)
     
     # 请注意,合并结果中最后一次提交所指向的快照,无论是通过rebase,还是三方merge,都会得到相同的快照内容,只不过提交历史不同罢了。
     # rebase是按照每行的修改次序重演一遍修改,而merge是把最终结果合在一起。
   
   git rebase
[feature branch]
     # 先取出feature branch,然后在main branch上重演
     
   # 戒律:一旦分支中的提交对象发布到了公共仓库,就不要再对该分支进行rebase操作。
   
--------------------------------------


  
阅读(527) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:开源围棋等级分计算系统

给主人留下些什么吧!~~