学习资料:

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

http://codingnow.cn/version/212.html

http://blog.jobbole.com/34503/

http://www.cnblogs.com/lwzz/archive/2013/02/23/2921426.html

Git即集中式版本控制系统。mac上的安装:直接从AppStore安装Xcode,Xcode集成了Git,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。

1.版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

  • 初始化一个Git仓库,使用git init命令。
  • 更新一个Git仓库,即添加文件到Git仓库,分两步:  (add放到暂存区(stage),commit放到工作区)
    • 第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;
    • 第二步,使用命令git commit,完成。   -m “xxx” 本次提交的说明。Git跟踪并管理的是修改,而非文件,表现在git commit只负责把暂存区的修改提交了。
  • 查看仓库状态,即距离上个更新版本有哪些更改。
    • git status哪些文件更改了(有没有放到暂存区也显示)。一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的.
    • git diff <file>更改了什么。
  • 查看仓库更新的历史纪录,git log命令显示从最近到最远的提交日志,可以看到3次提交。
  • 到指定版本:
    • HEAD表示当前版本,HEAD^是上一个版本,HEAD^^是上上一个版本,HEAD~100往上100个版本。 

git reset --hard HEAD^     回退到上一个版本“add distributed”

    • 通过版本号(hash id)转到某一版本。版本号没必要写全,前几位就可以了,Git会自动去找。
git reset --hard 3628164
    • Git提供了一个命令git reflog用来记录你的每一次命令。可以通过此找到版本号回到“未来版本”。

Ps:Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD修改指针,同时更新工作区。

  • git checkout --  <file>   让这个文件回到最近一次git commitgit add时的状态。  没有--,就变成了“创建一个新分支”的命令
  • 与add对应,rm是删除某文件,也要commit生效。撤销删除可以用checkout --

2.远程仓库

只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。

找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。

由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:

  • 创建SSH Key。
  • 登陆GitHub添加SSH Key。

1)使用remote add把本地仓库的内容关联到远程仓库(至少先创建个空到远程仓库)。

$ git remote add origin git@github.com:<git账户名>/<本地仓库名>.git

添加后,远程库的名字就是origin,这是Git默认的叫法。

使用命令push第一次推送master分支的所有内容,以后再push不需要加-u。

git push -u origin master

2)先有远程库,然后,从远程库克隆。

git clone git@github.com:<git账户名>/<远程仓库名>.git

地址还可以是https://github.com/michaelliao/gitskills.git这样的地址,支持ssh和http两种协议。

git clone默认会把远程仓库整个给clone下来,但只会在本地默认创建一个master分支

3.分支

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

1)

  • 每个节点是一次commit,用时间线链接起来,分支其实是指向节点的指针,创建、切换、合并、删除分支等操作其实都是在操作指针。
git checkout -b feature1  //创建一个新分支feature1并切换
git checkout master //切换回maseter
  • 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。git status可以告诉我们冲突的文件。可以直接查看冲突文本,Git用<<<<<<<=======>>>>>>>标记出不同分支的内容。
git merge feature1
git status
git add readme.txt
git commit -m "conflict fixed"
git log --graph --pretty=oneline --abbrev-commit    //用带参数的git log可以看到分支的合并情况
git branch -d feature1         //删除分支feature1

  合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

git merge --no-ff -m "merge with no-ff" dev
  • 分支策略

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

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

    • 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

    • 开发一个新feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

2)与远程仓库关于分支的交互

  • 查看远程库信息,使用git remote -v;查看branch信息, git branch -a;

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

  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

git push --all origin
git push <远程主机名> <本地分支名>:<远程分支名>
    • master分支是主分支,因此要时刻与远程同步;
    • dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
    • bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
    • feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

git pull <远程主机名> <远程分支名>:<本地分支名>

手册:

  • git help <命令> 可以看doc。
  • The most commonly used git commands are:

add        Add file contents to the index

bisect     Find by binary search the change that introduced a bug

branch     List, create, or delete branches

checkout   Checkout a branch or paths to the working tree

clone      Clone a repository into a new directory

commit     Record changes to the repository

diff       Show changes between commits, commit and working tree, etc

fetch      Download objects and refs from another repository

grep       Print lines matching a pattern

init       Create an empty Git repository or reinitialize an existing one

log        Show commit logs

merge      Join two or more development histories together

mv         Move or rename a file, a directory, or a symlink

pull       Fetch from and integrate with another repository or a local branch

push       Update remote refs along with associated objects

rebase     Forward-port local commits to the updated upstream head

reset      Reset current HEAD to the specified state

rm         Remove files from the working tree and from the index

show       Show various types of objects

status     Show the working tree status

tag        Create, list, delete or verify a tag object signed with GPG

git常用知识笔记的更多相关文章

  1. Git 常用知识

    git 常用命令 创建并checkout分支: git checkout -b branch_name git merge 与 git rebase 的区别 git rebase 合并后将形成一条直线 ...

  2. git常用操作笔记

    这是我看了廖雪峰的git教程,写的笔记,仅作为一个学习的记录 一.大多数我们面临的是已经有一个进行中的项目了,我们只需克隆下来就可以了 1.安装git,安装完后,可输入git,回车,查看是否已安装 2 ...

  3. GIT常用命令笔记

    最近在做了一个自己的项目.两个人合作的,所以需要用到版本管理工具.本来打算学一下自己搭建svn的,后来朋友推荐我用git,免费,流行,好用,逼格.所以就学习了一下.发现这个git与已经使用惯了的svn ...

  4. git常用知识整理

    分布式和集中版本控制的区别 分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因 ...

  5. 【原】git常用命令笔记

    平时要用一些命令老是去网上找还挺麻烦的,所以总结起来,还是写在了github上,博客园啥时候也支持一个markdown啊!! https://xianyulaodi.github.io/2017/03 ...

  6. git 常用命令笔记

    #提交代码会加上用户名和邮箱 git config --global user.name 名字 git config --global user.email 邮箱 git config --globa ...

  7. Android常用知识笔记

    1. 安卓图片自适应 android从1.6和更高,Google为了方便开发者对于各种分辨率机型的移植而增加了自动适配的功能  <supports-screens  android:largeS ...

  8. Git常用命令清单笔记

    git github 小弟调调 2015年01月12日发布 赞  |   6收藏  |  45 5k 次浏览 这里是我的笔记,记录一些git常用和一些记不住的命令,这个笔记原本是基于 颜海镜的文章增加 ...

  9. Git基础知识与常用命令

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

随机推荐

  1. 卷积层feature map输出到文本

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/52166388 以VGG_16的网络为例 ...

  2. POJ 3581 Sequence ——后缀数组 最小表示法

    [题目分析] 一见到题目,就有了一个显而易见obviously的想法.只需要每次找到倒过来最小的那一个字符串翻转就可以了. 然而事情并不是这样的,比如说505023这样一个字符串,如果翻转了成为320 ...

  3. [BZOJ4779] [Usaco2017 Open]Bovine Genomics(hash + 二分)

    传送门 网上的题解: 枚举左端点,二分右端点位置,最后所有左端点的答案取最小值 我的题解... 二分答案,枚举左端点,看看是否有解.. 好像和上面是反的,但是思路没问题 过程用hash判重 #incl ...

  4. 算法复习——splay(bzoj3224)

    题目: Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个 ...

  5. *hdu5632Rikka with Array

    $n \leq 10^300$,问所有$i<j$且$f_i>f_j$的$(i,j),1 \leq i \leq n,1 \leq j \leq n$数量.对某个数取模. $f(a,b,0/ ...

  6. 标准C程序设计七---17

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  7. Yii 之控制器响应

    public function actionIndex(){ //控制器响应处理 $res = \Yii::$app->response; //设置状态码 // $res->statusC ...

  8. SQL自动生成A到Z二十六个英文字母

    if object_id('#tempdriveinfo') is not null drop table #tempdriveinfo create table #tempdriveinfo ( [ ...

  9. Java修饰符关键字的顺序

    Java语言规范建议按以下顺序列出修饰符: 1. Annotations 2. public 3. protected 4. private 5. abstract 6. static 7. fina ...

  10. android中MVC,MVP和MVVM三种模式详解析

    我们都知道,Android本身就采用了MVC模式,model层数据源层我们就不说了,至于view层即通过xml来体现,而 controller层的角色一般是由activity来担当的.虽然我们项目用到 ...