注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

中吴南顾惟一笑

成功法则就是那19个字

 
 
 

日志

 
 

git助记  

2016-07-13 13:51:04|  分类: R&D |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

git
    直接记录快照snapshot,而非差异比较(base+Δ)
    每次提交更新时,Git会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

    本地repo组成:
        .git 保存元数据和对象数据库
        working directory 某个版本实际文件和目录
        index暂存区 临时改动 (add: 快照暂存.git下的index文件)
        HEAD 最后一次提交结果 (commit: 暂存快照永久转储)

    stage 文件:SHA-1 + 文件快照blob保存到git仓库
    commit 提交:目录的SHA-1 + tree object(目录结构 + blob对象索引)
    commit object:tree object指针 + other提交信息


创建&获取
    git init
    git clone git://github.com/test.git optional_another_dir_name
    拷贝整个项目历史
    支持本地,ssh,http和git自有协议
        $ ssh-keygen -t rsa -C "youremail@example.com"
        在home目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥


快照&回退
    git status -s short output
        状态的第一列是staging area,第二列是working directory,详细信息使用git status,跟详细的改动使用git diff
    git add
        多功能命令,视文件状态而不同
        未跟踪状态:将指定文件纳入版本管理;
        已更新状态:将指定文件保存至暂存区;
        合并时冲突文件:标记为已解决状态;
    git commit -m 提供commit相关message
    git commit -a add 所有tracked且修改过的文件并提交(untracked文件仍然需要单独add)

    修改本次本地提交(有遗漏的修改/提交信息错误)
        在无新增文件情况下,可简单执行:
            $ git commit –a --amend [-m "your new comment"]
        有新增文件情况下,执行:
            $ git add file_name
            $ git commit --amend [-m "your new comment"]


    git checkout -- file_name 撤销工作区修改
    git reset 回退修改或提交
        git reset HEAD 从index unstage文件
        git reset --soft 移动HEAD至指定commit,index和工作区修改保留
            eg. git reset --soft HEAD~ 后再commit就相当于git commit --amend
        git reset --hard 用制定commit重置index和工作区
        git reset --hard commit_id
            回退版本后想恢复可以使用同样的命令,id可以用git reflog查看命令历史找到

    撤消未提交/已提交的修改
        未提交--checkout
            撤消对跟踪文件尚未提交的修改,包括放入暂存区的文件。对放入暂存区的新文件,checkout后该文件从工作目录中被删除。
            $ git checkout file_name //单支文件
            $ git checkout -f        //所有修改的文件
        已提交--reset
            将当前HEAD重置至指定的commit
            $ git reset [--soft | --mixed | --hard] [<commit>]
            Soft: index和工作树都不处理。指定commit后的所有修改保留,同时,改动的文件位于暂存区。
            Mixed:(默认)重置index,但保留工作树。指定commit后的所有修改保留,同时,修改的文件未放入暂存区。
            Hard:重置index和工作树。指定commit后的对跟踪文件的所有修改都将被丢弃。

    git rm 从工作区和暂存区都删除
    git rm --cached 仅从暂存区删除
    git mv 相当于
            git rm --cached old;
            mv old new;
            git add new;
    git stash 保存工作区和index的内容以便后续使用
        因为切换分支需要commit或revert修改
        注意如果要包含untracked,使用 git stash -u
        查看列表 git stash list
        恢复工作现场 git stash apply,默认是stash@{0},最后入栈的那个,注意不会删除stash列表项
        git stash drop 丢弃某个保留的现场
        git stash pop,恢复的同时把stash内容也删了

分支&合并
    分支其本质上仅仅是个指向commit object的可变指针(实际上仅是一个包含所指对象校验和(40个字符长度 SHA-1 字串)的文件)
    git branch
        查看分支:git branch
        创建分支:git branch <name>
        切换分支:git checkout <name>
        创建+切换分支:git checkout -b <name>
            eg. clone的远程库只有master分支,要在dev上开发,就必须创建远程origin的dev分支到本地
            $ git checkout -b dev origin/dev
        删除分支:git branch -d <name>
            注意如果分支还没有被合并,如果删除,git会提醒将丢失掉修改,如果要强行删除,需要使用命令git branch -D <name>
            git push remote_name :branch_name 删除远程分支
                注意空格,从git push remote-name local-branch:remote-branch语法就能理解
                或者使用git push remote_name --delete branch_name        
        git branch -v 每个branch的最后一次提交
    git merge
        把另一个分支上下文合并到当前分支
        如果有冲突无法自动合并时,需要手动修改解决冲突,并提交
        $ git status -s 会显示UU
        文件内git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
        用git log --graph命令可以看到分支合并图
    git log
        显示分支的提交历史
        git log --oneline
        git log --oneline --graph
    git tag
        标记重要的参照点,其实它就是指向某个commit的常量指针
        git tag 查看标签
        git tag -a(-a表示创建一个带注释的标签)
        用git log --decorate可以查看tag
        git tag -d 删除标签
        fetch的时候,从head可追溯的tag会自动同步到本地,如果想要所有tag,使用git fetch origin --tags
        push时,默认不会同步tag,需要的话需显示指定--tags
        git push origin <tagname>可以推送一个本地标签
        git push origin :refs/tags/<tagname>可以删除一个远程标签
    merge方式
        原理:两个分支最新的快照及二者最新的共同祖先之间的三方合并
    rebase方式
        原理:当前分支修改在基底分支上的重演。
        具体步骤:回到两个分支最近的共同祖先,根据当前分支后续的历次提交对象,生成一系统文件补丁;然后以基底分支最后一次提交对象为新出发点,逐个应用之前生成的补丁文件,最后生成一个新的合并提交对象。
        优点:更整洁的提交历史;

分享&更新
    git remote
        git remote 远程alias列表
        git remote add [alias] [url]
            要关联一个远程库,使用git remote add origin git@server-name:path/repo-name.git
        git remote rm
        git remote rename [old-alias] [new-alias]
        git remote set-url 更新url
       
    git fetch 下载远程库上的分支和所有数据
    git pull
        更新本地的远程分支代码并合并到当前分支
        = git fetch + git merge
        如果git pull提示"no tracking information",则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
    git push [alias] [branch] 将本地修改更新到关联的远程分支
        如果是关联远程库后第一次推送(远程库为空), 使用git push -u origin master
        -u参数告诉git把本地的master分支内容推送的远程新的master分支,同时把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
        如果提示推送失败,是因为最新提交和你试图推送的提交有冲突
   
查看&比较
    git log
        查看历史,作者,日期,内容
            $ git log --author=who --oneline -5
            $ git log --oneline --before={3.weeks.ago} --after={2016-06-18} --no-merges
        git log --grep 通过commit message过滤
            $ git log --grep="bugfix" --format="%h %an %s" --author="facebook" 注意此例中 --author和--grep是OR的关系,AND要用--all-match选项
        git log -S 通过diff过滤,对查找何时引入某个函数或类极其有用
            $ git log -Ssome_new_function_name
        git log -p 查看每次提交的patch
            $ git log -p --no-merges -2
        git log --stat 查看每次提交的统计
            $ git log --stat --no-merges -2

    git diff
        查看变动
        git diff 显示没有进入stage的修改
        git diff --cached 显示进入stage,下次即将commit的修改
        git diff HEAD 显示所有stage和unstage的修改
        git diff --stat 显示summary
        git diff tag
        git diff branch_a branch_b
       
        $ git diff --stat master...new_branch 注意...其实等价于
        $ git diff --stat $(git merge-base master new_branch) new_branch

其它
    忽略某些文件时,需要编写.gitignore,.gitignore文件本身要放到版本库
        eg.
            # Python:
            *.py[cod]
            *.so
            *.egg
            *.egg-info
            dist
            build
        add文件发现文件被忽略
            用git check-ignore -v <name>命令检查到底匹配了哪条规则
        如果你确实想添加某个使用规则的文件,可以用-f强制添加到git
            $ git add -f exception_file
    全局设置
        $ git config --global user.name your_name
        $ git config --global user.email your_email
        $ git config --global core.editor tool_name
        $ git config --global alias.ci commit
        $ git config --global merge.tool tool_name
        Git可支持的合并工具包括:kdiff3,meld,emerge,vimdiff,gvimdiff和opendiff等
        注意--global参数,用了这个参数,表示所有的git仓库都会使用这个配置(~/.gitconfig)
        而每个仓库的Git配置文件都放在.git/config
    cherry-pick
        将commit在某处回放
    rebase 重写历史
        git checkout foo
        git checkout -b newbar
        git cherry-pick C D E
        git checkout bar
        git reset --hard newbar
        git branch -d newbar
        注意C D E是同一源头的另一个分支在分叉后发生的所有改变
        等价于
        git rebase foo bar
参考
    http://gitref.org/
    http://marklodato.github.io/visual-git-guide/

  评论这张
 
阅读(73)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017