1 创建版本库

1.1 初始化

初始化一个Git仓库,使用 git init 命令。

添加文件到Git仓库,分两步:

  • 第一步,使用命令 git add <file> ,注意,可反复多次使用,添加多个文件;

  • 第二步,使用命令 git commit -m "xxx" ,完成。

1.2 工作区状态:

  • 要随时掌握工作区的状态,使用 git status 命令。

  • 如果 git status 告诉你有文件被修改过,用 git diff 可以查看修改内容。

1.3 查看修改内容:

  • 使用git diff <file>命令查看文件的修改内容。

1.4 提交修改(与添加文件相同):

  • 第一步,使用git add <file>,也可以反复添加多个修改文件;

  • 第二步,使用git commit -m "xxx",完成提交。

2 时光机穿梭

2.1 版本回退:

  • 进行版本回退之前可以使用 git log  查看提交历史。

    • 使用命令git log --pretty=oneline 来显示简单的提交历史信息。
  • Git允许我们在版本的历史之间穿梭,使用命令 git reset --hard commit_id

    • Git中的commit_id是一个SHA1计算出来的一个非常大的数字,用十六进制表示;

    • 在Git中,用 HEAD 表示当前版本; (HEAD代表的是最近的一次commit的信息)

    • 上一版本使用 HEAD^,上上一版本使用HEAD^^,往上100个版本写成HEAD~100

    • 版本号没必要写全,前几位就可以了,Git会自动去找。

  • 要重返 未来,用 git reflog 查看命令历史,以便确定要回到未来的哪个版本。

2.2 撤销修改:

  • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout -- file

    • 命令 git checkout -- readme.txt 意思就是,把 readme.txt 文件在工作区的修改全部撤销,这里有两种情况:

      • 一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

      • 一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

      • 总之,就是让这个文件回到最近一次 git commit git add 时的状态。

    -git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用 HEAD 时,表示最新的版本。

  • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git reset HEAD file ,就回到了场景1,第二步按场景1操作。

    • 用命令 git reset HEAD file 可以把暂存区的修改撤销掉(unstage),重新放回工作区;

    • git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用 HEAD 时,表示最新的版本。

  • 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考 版本回退 一节,不过前提是没有推送到远程库。

2.3 删除文件:

    命令 git rm 用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失** 最近一次提交后你修改的内容 ** 。

3 远程仓库

3.1 添加远程库:

  • 要关联一个远程库,使用命令 git remote add origin git@server-name:path/repo-name.git

    • 使用命令git remote -v 列出远程库列表;

    • 使用命令git remote remove <name> 删除指定的远程库;

  • 关联后,使用命令 git push -u origin master 第一次推送master分支的所有内容;

  • 此后,每次本地提交后,只要有必要,就可以使用命令 git push origin master 推送最新修改;

  • 分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!

3.2 从远程仓库克隆

  • 要克隆一个仓库,首先必须知道仓库的地址,然后使用 git clone 命令克隆,例: $ git clone git@github.com:michaelliao/gitskills.git

  • Git支持多种协议,包括 https ,但通过 ssh 支持的原生 git 协议速度最快。

4 分支管理

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

4.1 创建与合并分支

  • 查看分支: git branch

  • 创建分支: git branch <name>

  • 切换分支: git checkout <name>

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

  • 合并某分支到当前分支: git merge <name>

  • 删除分支: git branch -d <name>

4.2 冲突处理

  • 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

  • 用 git log --graph 命令可以看到分支合并图。

4.3 分支管理策略

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

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

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

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

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

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

4.4 Bug分支

+ 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

  • 当手头工作没有完成时,先把工作现场 git stash 一下,然后去修复bug,修复后,再 git stash pop ,回到工作现场。

4.5 Feature分支

  • 开发一个新feature,最好新建一个分支;

  • 如果要丢弃一个没有被合并过的分支,可以通过 git branch -D 强行删除。

4.6 多人协作

多人协作的工作模式通常是这样:

  1. 首先,可以试图用 git push origin branch-name 推送自己的修改;

  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull 试图合并;

  3. 如果合并有冲突,则解决冲突,并在本地提交;

  4. 没有冲突或者解决掉冲突后,再用 git push origin branch-name 推送就能成功!

如果 git pull 提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch --set-upstream branch-name origin/branch-name

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

git branch --set-upstream branch-name origin/branch-name现在已经改为git branch --set-upstream-to=origin/branch-name

** 总结: **

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

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

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

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

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

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

5 标签管理

5.1 创建标签

  • 命令 git tag <name> 用于新建一个标签,默认为 HEAD ,也可以指定一个commit id

  • git tag -a <tagname> -m "blablabla..." 可以指定标签信息;

  • git tag -s <tagname> -m "blablabla..." 可以用PGP签名标签;

  • 命令 git tag 可以查看所有标签。

5.2 操作标签

  • 命令 git push origin <tagname> 可以推送一个本地标签;

  • 命令 git push origin --tags 可以推送全部未推送过的本地标签;

  • 命令 git tag -d <tagname> 可以删除一个本地标签;

  • 命令 git push origin :refs/tags/<tagname> 可以删除一个远程标签。

6 使用GitHub

  • 在GitHub上,可以任意Fork开源仓库;

  • 自己拥有Fork后的仓库的读写权限;

  • 可以推送pull request给官方仓库来贡献代码。

7 自定义Git

让Git显示颜色,会让命令输出看起来更醒目:

$

git config --global color.ui

true

7.1 忽略特殊文件

  • 在Git工作区的根目录下创建一个特殊的 .gitignore 文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

  • 不需要从头写 .gitignore 文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:( https://github.com/github/gitignore )

** 忽略文件的原则是: **

  1. 忽略操作系统自动生成的文件,比如缩略图等;

  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的 .class 文件; 3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

** 小结: **

  • 忽略某些文件时,需要编写 .gitignore

  • .gitignore 文件本身要放到版本库里,并且可以对 .gitignore 做版本管理!

*一个完整的.gitignore文件的例子: *

# Windows:

Thumbs

.db

ehthumbs.db

Desktop.ini

# Python:

*.py[cod]
*.so
*.egg
*.egg-info
dist
build # My configurations: db.ini
deploy_key_rsa

7.2 配置别名

可以使用st表示status, co 表示 checkout , ci 表示 commit , br 表示 branch :

$

git config --global

alias

.st status

$

git config --global

alias

.co checkout

$

git config --global

alias

.ci commit

$

git config --global

alias

.br branch

以后提交就可以简写成:

$

git ci -m

"bala bala bala..."

--global 参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。

配置Git的时候,加上 --global 是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

配置文件放哪了?每个仓库的Git配置文件都放在 .git/config 文件中:

$

cat .git/config

[core]

repositoryformatversion =

0

    filemode =

true

    bare =

false

    logallrefupdates =

true

    ignorecase =

true

    precomposeunicode =

true

[remote

"origin"

]

url = git

@github

.

com:

michaelliao/learngit.git

fetch = +refs/heads/*

:refs/remotes/origin/*

[branch

"master"

]

remote = origin

merge = refs/heads/master

[

alias

]

last = log -

1

别名就在 [alias] 后面,要删除别名,直接把对应的行删掉即可。

而当前用户的Git配置文件放在用户主目录下的一个隐藏文件 .gitconfig 中:

$

cat .gitconfig

[

alias

]

co = checkout

ci = commit

br = branch

st = status

[user]

name =

Your

Name

    email = your

@email

.com

【原】《Git教程》学习笔记的更多相关文章

  1. 廖雪峰 Git教程学习笔记 原文 http://www.liaoxuefeng.com/

    一 .集中式与分布式        先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推 ...

  2. 廖雪峰git教程学习笔记3

    commit是一串不便记忆的数字,为了方便记忆,引入tag,tag就跟HEAD一样,就像一个指针,指向commit,且指向是不能变得,一个commit就有一个tag 给当前分支下的当前commit打上 ...

  3. 廖雪峰git教程学习笔记2

    本地git仓库和github仓库之间的传输是通过SSH加密的,所以: 注册GitHub账号 创建SSH key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id ...

  4. 廖雪峰git教程学习笔记

    对git来说,没有消息就是最好的消息 使用 git init 把当前目录变为git仓库 要在仓库里加入文件,先在仓库目录新建这个文件后,比如新建一个文件xiaobai.txt,内容为: 在命令行里输入 ...

  5. Git-第五篇廖雪峰Git教程学习笔记(4)分支

    1.一开始,只有一个主分支(master),HEAD指向Master,而Master指向主分支.现在我们创建dev分支. lfy@lfy-PC MINGW64 /c/fyliu/lfyTemp/git ...

  6. Git-第四篇廖雪峰Git教程学习笔记(3)远程仓库,克隆远端库

    1.本次连接的是gitHub仓库. 1>创建SSH Key. ssh-keygen -t rsa -C "youremail@example.com" lfy@lfy-PC ...

  7. Git-第三篇廖雪峰Git教程学习笔记(2)回退修改,恢复文件

    1.工作区 C:\fyliu\lfyTemp\gitLocalRepository\yangjie 2.版本库 我们使用git init命令创建的.git就是我们的版本库.Git的版本库里存了很多东西 ...

  8. Git-第二篇廖雪峰Git教程学习笔记(1)基本命令,版本回退

    1.安装Git-2.16.2-64-bit.exe后,设置用户名,用户邮箱 #--global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地 ...

  9. jfinal框架教程-学习笔记

    jfinal框架教程-学习笔记 JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...

  10. Webpack新手入门教程(学习笔记)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...

随机推荐

  1. nullcon HackIM 2016 -- Programming Question 2

    Your simple good Deeds can save you but your GREED can kill you. This has happened before. This gree ...

  2. Light OJ 1019 - Brush (V)(图论-dijkstra)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1019 题目大意:Tanvir想从节点1的位置走到节点n的位置, 输出最短距离, ...

  3. [转] swf文件加密基础

    本来打算下班回来就写这个东西,一方面算是对今天学习的一个笔记记录,另外一方面,给一些朋友普及一些swf文件加密基础知识.之所以说是基础,那是因为我也是刚学习了一点,灰常的基础.不过晚上看了一会我是传奇 ...

  4. python学习之——小闹钟(持续完善ing)

    "啊,坏了,我忘了那啥啥了~~~" 为了不坏了,动手做一个小闹钟吧,一点点完善的过程一定美好极了,必像等待培育许久的花儿绽放一样,不多说,加油,期待↖(^ω^)↗ #! /usr/ ...

  5. 在UITableViewStylePlain情况下sectionHeader可以与tableview一起滑动的解决方法

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat sectionHeaderHeight = ; ) { scrollVi ...

  6. Observer设计模式中-委托事件-应用在消息在窗体上显示

    Observer设计模式:监视者模式.在类中的方法中处理的结果或者消息通过事件委托 的方式发送给主窗体. 因为在其它类中直接访问主窗体类,显示内容是不能直接调用控件赋值的,当然也有别的类似查阅控件名, ...

  7. Silverlight C1.Silverlight.FlexGrid 表格动态列

    很多时候,我们对于表格展示的数据,需要根据条件不停的变化,这就需要表格列能动态生成,即没有Model的概念(万物始于无形).先上主要代码: 一.根据参数绑定列定义 二.根据数据动态创建数据对象,并添加 ...

  8. mysql远程连接:ERROR 1130 (HY000): Host '*.*.*.*' is not allowed to connect to this MySQL server解决办法

    安装完MySQL后,远程连接数据库的时候,出现 ERROR 1130 (HY000): Host '192.168.0.1' is not allowed to connect to this MyS ...

  9. P1403约数研究

    洛谷1403 约数研究 题目描述 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel2"的长时间运算成为了可能.由于在去年一年的辛苦工作 ...

  10. PHP疑惑

    <?php $a = array(); $a[0] = 1; $a[1] = 2; $b = (object)$a; var_dump($b); 怎么从对象$b 中取值??? <?php ...