git

和svn的区别
    svn是集中式版本控制系统,代码保存在一台中间服务器上,只有联网才能工作
    git是分布式版本控制系统,每个人本地都存在一个版本库,中间服务器只是为了方便合并代码
    因为所有数据都在本地,所以git安全性高,速度快
    git直接记录快照,而非差异比较,每一次的提取操作,实际上都是一次对代码仓库的完整备份
    
    
快照
    Git 并不保存前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。
    每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。
    为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。
三个区域
    working directory(本地工作区)       除.git外的文件
    staging area(暂存区)                需要提交的文件必须先add到此区,信息存在.git中的index文件
    git directory(版本仓库)             .git文件夹,版本仓库分为本地的版本仓库,远程的版本仓库(可以没有)
文件的生命周期
    untracked(未跟踪)
    unmodified(未修改)
    modified(已修改)
    staged(已添加到暂存区)
    状态转换
        未跟踪-->已添加到暂存区         git add
        已修改-->已添加到暂存区         git add
        已添加到暂存区-->未修改         git commit 或撤销回复
        未修改-->未跟踪                 git rm --cached
基本工作流程
    1. 在工作目录中修改某些文件。
    2. 对修改后的文件进行快照,然后保存到暂存区域。 
    3. 提交更新,将保存在 暂存区域 的文件快照永久转储到  Git 目录 中。
本地命令
    创建版本库
        建立一个本地版本库
            git init        将当前目录纳入到版本控制
            git init demo   会在当前文件夹下创建demo目录,并将demo目录纳入纳入到版本控制
        从远处克隆一个版本库
            git clone git://github.com/git/hello-world.git  --会在当期远程仓库同名的文件夹,复制远程文件,并纳入到版本控制
    跟踪新文件或将文件添加到暂存区
        git add a.txt       将当前路径下的a.txt添加到暂存区
        git add .           将当前路径下的所有文件添加到暂存区
        注意: 如果add后有修改了文件,这时应该再次add,否则commit的是上一次add后的内容
    提交(将暂存区中的文件提交)
        git commit -m "这是提交描述信息"        描述信息是必须的
        git commit -a -m "这是提交描述信息"     先将文件添加到提交列表,再提交
    查看文件状态(未跟踪的,已修改的,暂存区的,冲突的)
        git status
    版本
        在Git中,用HEAD表示当前版本
        上一个版本就是HEAD^或HEAD~1
        上一百个版本就是HEAD~100(存在分支合并的情况比较特殊)
    比较修改
        git diff                比较本地工作空间和暂存区
        git diff --staged       比较暂存区和本地版本仓库
        git diff --cached       比较暂存区和本地版本仓库
        git diff head           比较本地工作空间和本地版本仓库
        git diff head^ head     比较上上次提交和上一次提交的区别
        git diff 哈希 哈希      比较两个历史版本之间的差异
    撤销回复操作
        撤销未提交的操作
            撤销工作空间的更改(一般指未提交到暂存区)
                git checkout .              将当前目录下的所有修改过的文件回退到最近提交或添加到暂存区的状态
                git checkout --filename     将指定filename的文件回退到最近提交或添加到暂存区的状态
            撤销暂存区的更改(不会撤销工作空间的更改)
                git reset HEAD 文件名称     将某个文件从暂存区中去除
                git reset HEAD              清空暂存区
        撤销提交的操作(存在日志,必须保证暂存区为空)
            git revert HEAD             撤销最近一次的提交
            git revert 哈希值           撤销到指定哈希值的提交前
        回复提交的操作(不存在日志)
            git reset --hard HEAD^      回复到上上次提交
            git reset -–hard 哈希值        回复到指定哈希值的版本
            回复的模式说明
                --hard      回复暂存区和工作空间,并把head指向回复的版本
                --soft      把head指向回复的版本,将差异保留
                --mixed     回复暂存区(默认模式)
            注意:把head指向回复的版本意味着log也会被清除,可使用git reflog找到所有操作的哈希值进行回复
        撤销和回复的区别
            撤销是反向进行一次提交,会保留原来的提交记录,并添加新的一条提交记录
            回复是丢弃掉原来的部分提交,原来的提交日志也丢失了
            撤销提交的操作时需要保证暂存区为空
    查看提交历史
        git log                     查看提交历史,可查看版本,提交人,提交时间
        git log -n                  显示前n条记录
        git log 文件名              显示指定文件的提交记录
        git log --committer=提交人  显示指定提交人的提交记录
        git log --pretty=oneline    简洁,只显示哈希值和注释
        git log --pretty=format:"%h,%cd,%an,%s" --date=iso --name-only
    查看操作历史
        git reflog              查看操作历史,可查看版本,操作类型,操作描述
    删除文件
        git rm 文件             删除文件,未提交时可通过git checkout --文件 恢复
        git rm --cached 文件    在版本库和暂存区中删除文件,使文件变为未跟踪状态
        注意: 手动删除文件(rm)并提交不会向版本库提交删除命令,需使用 git rm
        或 git add . -all
    需要忽略的文件
        忽略未添加到版本控制的文件
        在.git文件夹同目录添加.gitignore文件,在其中写入需要忽略的文件或目录名称,每行一个,也可以写上.gitignore本身
        格式规范如下:
            所有空行或者以注释符号#开头的行都会被忽略。
            可以使用标准的 glob 模式匹配。
            匹配模式最后跟反斜杠(/)说明要忽略的是目录。
            要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
        所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。
            星号(*)匹配零个或多个任意字符;
            问号(?)只匹配一个任意字符;
            [abc],[a-z] 匹配一个在方括号中的字符;
        示例
            # 此为注释 – 将被 Git 忽略 
            *.a         # 忽略所有 .a 结尾的文件 
            !lib.a      # 但 lib.a 除外 
            /TODO       # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO 
            build/      # 忽略所有build文件夹下的文件
            aaa         # 忽略所有的aaa文件或文件夹
            doc/*.txt   # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
    保存但不提交(Stashing)
        保存
            git stash
        查看
            git stash list                  查看所有保存点
        回复
            git stash apply                 回复到最近的保存点(不回复暂存区,暂存区的更改在工作空间中,暂存区为空)
            git stash apply --index         回复到最近的保存点(同时回复暂存区)
            git stash apply stash@{版本}    回复到指定版本
            git stash pop                   回复最近一个保存点并删除保存点
            git stash branch                创建新分支,恢复到保存时的代码(删除之后的提交,删除本次保存点)
        删除
            git stash drop                  删除最近的一个保存点




远程命令
    本地仓库和远程仓库之间的传输是通过SSH加密的,需要先创建SSH Key
        ssh-keygen -t rsa -C "邮箱"
    克隆远程版本库
        git clone 地址
    本地版本库与远程仓库建立联系
        git remote add origin git地址
    查看远程版本仓库信息
        git remote          查看远程版本仓库名称
        git remote -v       查看远程版本仓库的路径
    从远程版本仓库拉取代码
        git fetch       从远程版本仓库拉取代码,更新本地的远程分支,不会和本地分支合并(可以看到这段时间远端提交的日志)
        git pull        从远程版本仓库拉取代码,自动与本地分支合并(相当于fetch + merge)
    向远程版本仓库提交代码
        git push                                从当前主线代码向远程版本仓库提交
        git push 远程仓库名称 本地分支名称      从指定分支向远程版本仓库提交



分支命令
    提交对象结构
        commit
            tree            记录所有修改文件
                文件对象1       修改文件的快照
                文件对象2       修改文件的快照
            parent          上一次的提交对象
            author          修改人
            committer       提交人
            ...
        提交对象主要分为三部分
            修改文件的快照索引
            其它提交相关信息
            上一次提交对象的引用(可以没有[第一次提交],可以有一个[正常提交],可以有多个[分支合并])
    分支
        分支其实就是从某个提交对象往回看的历史
        分支的指针在每次提交的时候都会自动向前移动
        默认存在一个master分支
        创建分支就是创建一个指针,然后指向某个提交对象
        存在一个特殊指针:HEAD,指向当前正在使用的分支
        切换分支就是将HEAD指向要切换到的指针,并切换修改文件的文件快照
        Git 的实现与项目复杂度无关,它永远可以在几毫秒的时间内完成分支的创建和切换
    创建分支
        git branch 分支名称     //会在当前commit对象上新建一个分支指针 
        注意: 创建分支并不会自动切换分支,当前还在原来的分支
    查看分支
        git branch      查看本地分支,前面存在*号的表示是当前分支
        git branch -r   查看远程分支
        git branch -v   查看本地分支最后一次提交对象的信息
    切换分支
        git checkout 分支名称               切换到指定分支
        git checkout -b 分支名称            切换到指定分支(如果不存在则根据当前分支自动创建)
        git checkout -b 分支名称 哈希值     切换到指定分支(如果不存在则根据当前分支指定提交自动创建)
        git checkout -b 分支名称 远程分支   切换到指定分支(如果不存在则根据远程分支自动创建)
    删除分支
        git branch -d 分支名称              删除本地分支
    远程分支和跟踪分支(跟踪分支每次pull会自动合并)
        git config --list                                   可查看本地分支跟踪的远程分支
        git branch -u 远程名称/远程分支名称                 可修改本地分支跟踪的远程分支
    比较两个分支的差异
        git diff 分支1 分支2
    合并分支
        git merge 要合并的分支名称          将指定的分支合并到当前分支
        git rebase 要应用补丁的分支名称     将当前分支的提交作为补丁应用在指定分支上
        merge和rebase的区别
            merge会将双方的差异进行合并
            rebase会将当前分支上进行的特有操作(补丁)在要合并的分支上重新进行一次
            merge的提交记录可看出是分支合并,2-->1
            rebase的提交记录看不出只能看到一条分支,就像一次普通提交一样
            merge由接收补丁的人进行合并
            rebase由提交补丁的人进行合并
        示例: 
            如test的提交要合并到master
            rebase通常操作
                git checkout test
                git checkout -b temp
                git rebase master
                git checkout master
                git merge temp
                git branch -d temp
            merge常用操作
                git checkout master
                git merge test
        合并的三个模式
            Fast forward(快进)
               当待合并的2个branch最近的commit是线性关系时
               或者说,某个branch自上次更新后没有commit信息时
               git则直接移动指针即可,并没有真正的merge操作,也没有对应的merge commit信息
            Merge made by recursive(递归合并)
               当要合并的2个branch的最近的commit对应的直接祖先不同时
               git就无法通过简单的移动指针来进行合并
               只能以2个branch的最新commit和他们的共同祖先进行一次merge
               并对应有一个merge commit信息
            Conflict(冲突)
               当2个branch都修改了同一个文件的同一部分时
               这时,就会发生冲突,git的自动合并就会失败
        冲突解决步骤(git merge)
            git status  查看冲突文件
            手动合并
            git add     添加到暂存区(用此方法标记为已解决)
            git commit  提交
            或取消合并并还原到合并前的状态(git merge --abort)
        冲突解决步骤(git rebase)
            git status              查看冲突文件
            手动合并
            git add                 添加到暂存区(用此方法标记为已解决)
            git rebase --continue   继续应用后面的补丁
            或取消合并并还原到合并前的状态(git rebase --abort)
    合并分支(合并部分提交)
        将某次提交应用到当前分支
            git cherry-pick 哈希值
        将某些连续提交应用到分支
            示例: 如test的提交c1~c2要合并到master
            git checkout test
            git checkout -b temp c2哈希值
            git rebase --onto master c1哈希值^
            git checkout master
            git merge temp
            git branch -d temp
    其它
        git mergetool       可自动调用合并工具进行合并冲突



git配置文件
    类型
        系统级:对所有用户所有仓库有效(%Git%/etc/gitconfig)
        全局级:对某个用户所有仓库有效(c:/users/用户/.gitconfig)
        仓库级:对某个用户某个仓库有效(%仓库%/.git/.config)
    命令
        git config [–-local|–-global|–-system] 命令
        查看全部    git config --list
        查看单个    git config user.name
        添加/修改   git config user.name likaihao
        删除        git config --unset user.name



git bash中文乱码
    ls                      etc\git-completion.bash文件中增加以下内容:alias ls='ls --show-control-chars --color=auto'
    文件名或日志            git config --system core.quotepath false
    可以输入中文            etc\inputrc文件中增加以下内容:set output-meta on 和 set convert-meta off
    日志                    git config --global gui.encoding utf-8     git config --global i18n.commitencoding utf-8


记住密码
    git config credential.helper store



提交任务的基本流程
    情景: 经过一段时间的开发,任务完成,任务开发过程中没有进行拉取远端的代码
    -------------------------------------------
    先不要提交, 先获取远端的代码(fetch), 如果没有获取到代码,则commit + push
    如果获取到代码, 则进入eclipse的同步视图(右键-->team-->Synchronize Workspace), 查看是否存在冲突
    如果没有冲突, 则拉取(pull), 并commit+push
    如果存在冲突, 需要解决冲突...
    -------------------------------------------
    如果本地已经提交, 先获取远端的代码(fetch), 如果没有获取到代码,则commit + push
    如果获取到代码, 则进入eclipse的同步视图(右键-->team-->Synchronize Workspace), 查看是否存在冲突
    如果没有冲突, 需要撤销本地本次提交(reset --soft),将更改放到工作空间,然后拉取(pull),并commit+push
    如果存在冲突...
    -------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值