zoukankan      html  css  js  c++  java
  • Git 学习教程【转+总结】

    之前是在用SVN,现在因为小伙伴比较喜欢Git,所以也开始学习Git,很感谢 时光穿梭机 - 廖雪峰 的无私奉献。本文用来记录我在学习Git过程中的收获和笔记,廖雪峰大神的Git教程参考这里

    1、Git介绍:

    2、Git概念:

      工作区与版本库:此段详情参考这里

        工作区(Working Directory):就是你在电脑里能看到的目录。版本库(Repository):工作区有一个隐藏目录“.git”,这个不算工作区,而是Git的版本库。

        Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。把文件往Git版本库里添加的时候,是分两步执行的:

        第一步是用“git add”把文件添加进去,实际上就是把文件修改添加到暂存区;

        第二步是用“git commit”提交更改,实际上就是把暂存区(Unstaged)的所有内容提交到当前分支。对于修改之后,但是没有经过git add,是不会提交到当前分支的,这就是Git最关键的跟踪管理修改而不是文件的概念,此点见这里

    3、Git指令:

      git config:配置Git,比如字体等等。安装好后,要通过下面两条指令配置用户信息。

      $ git config --global user.name "Your Name"
      $ git config --global user.email "email@example.com"

      git add fileName:将工作区的内容添加到暂存区,可以使用*表示左右文件,也可以针对特定文件用正则。

      git commit -m 'message':将暂存区内容提交到版本库,版本跟踪控制就是针对commit,版本号就可以理解成commit ID。

      git status:查看当前工作区的状态。

      git checkout --file:丢弃工作区的修改。若readme.txt自修改后还没有被放到暂存区,现在撤销修改就回到和版本库一模一样的状态;若readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit或git add时的状态。

      git reset [--Par] ID:ID表示版本号,在Git中,HEAD表示最新的版本(也就是刚刚commit的那个版本,git log时出现的第一个),HEAD^表示上一个版本,HEAD^^表示上上个版本,当然也可以使用HEAD~100表示往上100个版本。ID可以用HEAD表示,用于返回到之前的版本,ID也可以是commit ID,当使用reset之后,想要返回到HEAD之后的版本,只要还能够找到之前的commit ID,就可以回到HEAD之后的版本,其实commit ID可以不写全,只要前几位能保证Git能够唯一识别版本就行。Git内部维护一个HEAD指针,版本控制就是通过修改HEAD指针,因为即使返回到之前的版本,后面的版本也并没有彻底删除,如果使用“git reset --hard HEAD”之后,想要返回之后的版本,但是忘记cimmit id,可以使用后面的git reflog命令找回。

      有关HEAD更详尽的描述,见后面分支管理。

      git log:查看所以提交的commit的信息,包括commit ID(一个16进制的SHA值,而不是像SVN那样的1、2、3,这是因为Git是分布式的,多人工作时,每个人都会有版本号,所以不能用1、2、3依次增加)、Author、Date和message。如果内容太多,可以使用 --pretty=oneline,使每个commit在一行显示。但是git log只会显示HEAD时间之前的版本,如果使用了“git reset --hard HEAD”后,想要查看HEAD后的版本,可以使用git reflog查看commit id。

    4、Git的分支操作:

      Git中,通过commit维护一条时间版本线,各个分支版本通过指针指定commit ID来维护。master是指向master分支版本的id,每新建一个分支(如dev),都会创建一个指针dev指向创建时当前分支指针所指向的版本。而HEAD时间上是指向当前分支的指针(如master、dev)。所以每次commit时,只是更改当前分支的指针指向。每次分支切换,也就是更改HEAD指针指向要切换到的分支。此处一定要参考这里

      查看分支:git branch。列出仓库中所有分支,当前分之前加星号。git branch -r查看远程分支。

      创建分支:git branch name

      切换分支:git checkout name

      创建+切换分支:git checkout -b name

      合并某分支到当前分支:git merge name,默认Git会用“Fast forward”模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用“Fast forward”模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。git merge --no-ff -m 'message' name,--no-ff参数,表示禁用“Fast forward”;因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

      删除分支:git branch [-d] name, -d表示强制销毁。

      分支冲突与解决概念见这里

      分支管理策略:  

        在实际开发中,我们应该按照几个基本原则进行分支管理:

        首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

        那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

        所以,团队合作的分支看起来就像这样:

                git-br-policy

      隐藏工作区、缓存区(没有“git add”的修改):如果当前分支工作还没有完成,所以暂时不打算commit或add,然后此时需要到其他分支做其他工作,是没法直接切换(因为有没提交的修改)。所以可以把工作区或缓存区的修改隐藏起来。

      可以通过git stash隐藏未提交的更改(就是暂存到其他地方),其他分支完成任务后,返回该分支,可以git stash apply恢复,但是恢复后,stash内容并不删除,需要用git stash drop来删除。用git stash pop,恢复的同时把stash内容也删了。git stash list 查看所有的stash记录。

    5、标签管理: 

      Git标签也是版本库的一个快照,但其实它就是指向某个commit的指针(跟分支很像,但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

      git tag [-a] tagName -m 'message' [commit ID]:创建标签,默认tag是指向当前分支的最新提交,即:HEAD,但是可以通过指定commit ID使tag指向某个特定commit。

      git tag:显示所有tag,是按tagName的字母顺序排序,不是按照时间。

      git show tanName:显示tagName这个标签的信息。

      推送标签到远程仓库:git push origin tagName可以推送一个本地标签;git push origin --tags可以推送全部未推送过的本地标签。

      删除本地标签:git tag -d tagName。

      删除远程仓库的标签:1、先删除本地tag;2、然后通过git push origin :refs/tags/tagName删除远程仓库。

    6、GitHub相关使用:

          GitHub与Git的关系,ssh key的配置参考这里这里。GitHub私人只能建免费public的仓库,想要创建private需要收费或者学生和教育人士可以建私有仓库,申请在此。也可以使用BitBucket,相关使用和GitHub没有太大的区别

      1、添加本地仓库到远程仓库:

    git remote add origin git@github.com:DwyaneTalk/testGit.git:关联远程库
    git push -u origin master:首次推送到远程库
    git push origin master:之后的推送,推送之后,GitHub仓库页面就会显示更改。后面会介绍Pull Request概念。

      其中origin指远程库,第一条是将本地仓库与远程库关联。关联之后,首次推送时加 -u, Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

      2、克隆远程仓库:

      开发中,也可以现在远程GitHub上创建仓库,然后本地打开Bash之后,通过克隆本地仓库,并关联远程仓库,这样只要开发小组每人都克隆一下,就可以协同开发。

       git clone git@github.com:DwyaneTalk/gits.git

      PS:上面都是通过ssh进行传输的,GitHub也支持HTTPS等方式,但是相对速度较慢且每次需要输入口令。比如上面地址换成https://github.com:DwyaneTalk/gits.git就可以。完成上面之后,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

         3、多人协作分支操作:

        查看远程库信息,使用git remote [-v]

        本地新建的分支如果不推送到远程,对其他人就是不可见的;  

        在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

        从本地推送分支,使用git push origin branch-name,如果因为冲突(其他人也对某文件进行修改,并已经提交)推送失败,先用git pull抓取远程的新提交;

        从远程抓取分支,使用git pull,如果有冲突,要先处理冲突,然后在push。如果提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name  

    其他参考:http://blog.csdn.net/shulianghan/article/details/18812279
  • 相关阅读:
    PHP基本的语法以及和Java的差别
    Linux 性能測试工具
    【Oracle 集群】Linux下Oracle RAC集群搭建之Oracle DataBase安装(八)
    【Oracle 集群】Oracle 11G RAC教程之集群安装(七)
    【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
    Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
  • 原文地址:https://www.cnblogs.com/DwyaneTalk/p/4004759.html
Copyright © 2011-2022 走看看