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
posted @ 2014-10-03 10:21  DwyaneTalk  阅读(592)  评论(0编辑  收藏  举报