Git入门详解
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
一、git的简介
git是linux用两个月的时间用C语言写的一个分布版本控制系统。
版本控制系统主要有三种:本地版本控制系统、集中化版本控制系统、分布式版本控制系统。下面说下集中式版本控制系统与分布式版本控制系统的区别:集中式版本控制系统,版本库集中放在中央服务器上,开发人员是在自己的电脑上开发,所以需要从中央服务器获取代码,开发完毕再推送到中央服务器。主要缺点是必须有网的时候才可以使用;网慢,拉取推送速度慢;如果服务器上版本库出问题大家都不可以用了。分布式版本控制系统,根本没有“中央服务器”,因为每一台电脑都有完整的版本库,开发人员在各自的电脑上修改代码,然后推送给其他电脑,这样就能互相看到最新版本的代码,但实际工作中一般不会两两之间进行推送拉取,而是把其中一台电脑充当”中央服务器“,这样方便大家交换修改的代码;不需要网络也能交换代码;git强大的分支功能也是最要人陶醉的,建立分支,对这个分支进行修改,而不改变主支上的代码!
分布式版本控制系统除了Git以及促使Git诞生的BitKeeper外,还有类似Git的Mercurial和Bazaar等。这些分布式版本控制系统各有特点,但最快、最简单也最流行的依然是Git!
git术语:
仓库(repository):一个仓库包括了所有的版本信息、所有的分支和标记信息。在Git中仓库的每份拷贝都是完整的。仓库让你可以从中取得你的工作副本。
分支(branches):一个分支意味着一个独立的、拥有自己历史信息的代码线。你可以从已有的代码中生成一个新的分支,这个分支与剩余分支完全独立。默认的分支往往是叫master。用户可以选择一个分支,选择一个分支叫checkout。
标记(tags):一个标记指的是某个分支某个特定时间的状态。通过标记可以很方便的切换到标记时的状态,例如2009年5月22
提交(commit):提交代码后,仓库会创建一个新的版本。这个版本可以再后续被重新获得。每次提交都包括作者和提交者,作者和提交者可以是不同的人。
URL:用来标识一个仓库的位置。
修订(revision):用来表示代码的一个版本状态。git通过用SHA1 hash算法表示的id来标识不同的版本。每一个 SHA1 id都是160位长,16进制标识的字符串.最新的版本可以通过HEAD来获取.之前的版本可以通过"HEAD~1"来获取,以此类推。
二、git目标特点
git目标:快、分布式、上千个并行开发的分支、设计简单、高效管理超大规范项目
git特点:直接记录快照,而非差异比较;几乎所有操作都是本地执行;时刻保持数据的完整性;多数操作仅添加数据;文件有三种状态。
文件状态周期:
三、git的配置
命令:git config
1. /etc/gitconfig
2. ~/.gitconfig
3. .git/gitconfig
配置用户信息
$ git config --global user.name "Your name"
$ git config --global user.email YourName@example.com
# Set default so that all changes are always pushed to the repository
git config --global push.default "matching"
查看配置信息
$ git config -l
以下命令会为终端配置高亮
git config --global color.status auto
git config --global color.branch auto
- 配置代理
git config --global http://proxy.yourname.com:8080
如果需要用户名密码的话,则设置:
git config –global http.proxy http://user:password@proxy.yourname.com:8080
其中 user
和 password
分别为你的用户名和密码。
设置完成后,可以通过如下命令来查看设置是否生效:
git config –get –global http.proxy
如果某一天你不喜欢她了,需要删除代理设置,那么可以使用:
git config --system (或 --global 或 --local) --unset http.proxy
来删除设置
四、获取git仓库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。每个Git仓库都是放置在.git文件夹下.这个目录包含了仓库的所有历史记录,.git/config文件包含了仓库的本地配置。
创建仓库
$ mkdir learngit
$ cd learngit
$ pwd #pwd
命令用于显示当前目录。在我的Mac上,这个仓库位于/Users/michael/learngit
。
初始化新仓库
$ git init #瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
$ git add somefile
$ git commit -m 'init project' #简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
克隆已有仓库
$ git clone git://github.com/xx/example.git 或 $ git clone d:/learngit
Git支持多种协议,包括https
,但通过ssh
支持的原生git
协议速度最快。
五、git - 添加
git add somefile
1. 跟踪新⽂文件
2. 暂存已更改⽂文件
3. 标记冲突⽂文件为已解决状态
六、git - 忽略文件
.gitignore
#这⾏行是注释
node_modules #忽略所有node_modules目录
/node_modules #仅仅忽略根目录下的node_modules目录
temp/ #忽略temp目录下的所有⽂文件
doc/*.txt #忽略doc目录下的.txt⽂文件,但不包含doc⼦子目录的.txt⽂文件
*.txt #忽略所有.txt⽂文件
!readme.txt #readme.txt除外
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class
文件; - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
七、git - 提交
- git commit 启动编辑器输⼊入提交说明
- git commit -m "***" '本次提交说明'
- git commit -am "***" 跳过使用暂存区(即跳过git add)
八、git - 差异
- git status 列出修改过的⽂文件
- git diff 查看⼯工作目录和暂存区快照之间的差异
- git diff --staged 查看暂存区快照和上次提交快照之间的差异
九、git - 删除
- rm somefile.txt ⼿手⼯工删除
- git rm somefile.txt 删除未提交到暂存区的⽂文件
- git rm -f somefile.txt 强制删除已提交到暂存区的⽂文件
- git rm --cached somefile.txt 从暂存区移除,但不删除
十、git - 移动
- git mv somefile.txt otherfile.txt
相当于:
mv somefile.txt otherfile.txt
git rm somefile.txt
git add otherfile.txt
十一、git - 日志
每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit
。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作.
- git log 所有log
- git log --pretty=oneline 如果嫌输出信息太多,看得眼花缭乱的
- git log -p -5 显示最近5次更新,并显示差异
你看到的一大串类似3628164...882e1e0
的是commit id
(版本号),和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。为什么commit id
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
十二、git - 撤销
每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
- 回退到上一个版本
git reseet --hard HEAD^
- 查看文件
cat somefile
还可以继续回退到上一个版本,不过且慢,然我们用git log
再看看现在版本库的状态,最新的那个版本已经看不到了!肿么办?只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个版本的commit id
是3628164...
,于是就可以指定回到未来的某个版本:
- 制定某个版本
git reset --hard 3628164
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL。然后顺便把工作区的文件更新了。所以你让
HEAD
指向哪个版本号,你就把当前版本定位在哪。
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id
怎么办?Git提供了一个命令git reflog
用来记录你的每一次命令。
- 记录每一次命令
git reflog
- 修改最后⼀一次提交
git commit --amend
- 取消已暂存的⽂文件,把暂存区的修改撤销掉,重新放回工作区
git reset HEAD somefile
- 把文件在工作区的修改全部撤销
git checkout -- somefile
十三、git - 分支
十四、创建分支
创建dev
分支,然后切换到dev
分支
$ git checkout -b dev
或者
$ git branch dev
$ git checkout dev
十五、切换分支
-切换回master分支
git checkout master
十六、git - 移动指针
git commit -m ‘change it’
十七、git - 分支历史
git checkout master
vim index.html
git commit -m ‘change’
十八、git - 合并
git checkout master
git merge dev
git merge --no-ff -m "merge with no-ff" dev #强制禁用Fast forward
模式
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
十九、git - 冲突
git status #命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
git log -graph --pretty=oneline --abbrev-commit 查看分支的合并情况
二十、git - 分支管理
- 查看分支 git branch [-v]
- 查看合并的分支 git branch --merged
- 查看尚未合并的分支 git branch --no-merged
- 删除分支 git branch -d dev
- 强行删除分支 git branch -D dev
二十一、git bug 分支
工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
- 把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash
bug修改完了,返回去工作,工作区是干净的,
- 查看stash
git stash list
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
- 你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash
git stash apply stash@{0}
二十一、git - 远程仓库
- 查看
git remote [-v]
- 添加
git add [shortname] url
- 抓取数据
git fetch [remote-name]
git pull [remote-name]
- 推送数据
git push [remote-name] [branch-name]
- 查看仓库信息
git remote show [remote-name]
- 重命名
git remote rename new-name old-name
- 移除
git remote rm remote-name
二十二、git - 标签
- 查看现有标签
git tag
- 新建
git tag -a v0.1.2 -m ‘version 0.1.2’
- 查看标签
git show v0.1.2
git tag v0.1.2
- 找到历史提交的commit id
git log --pretty=oneline --abbrev-commit
- 后期加标签
git tag -a v0.1.2 -m 89ah87w6w8
还可以通过-s
用私钥签名一个标签:
git tag -s v0.2 -m "signed version 0.2 released" fec145a
签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错,如果报错,请参考GnuPG帮助文档配置Key。
-删除标签
git tag -d v1.0
- 分享标签,推送某个标签到远程
git push remote-name v0.1.2
git push remote-name --tags
二十三、使用git
打开开源项目的网址,fork到自己的账号上,在自己的账号上clone仓库到本地,然后可以干活,干完活推送到自己的github仓库,如果想往官方库推送,可以在github上发起一个pull request,对方是否接受就不一定了。
二十四、自定义git
- 让Git显示颜色,会让命令输出看起来更醒目
git config --global color.ui true
- 配置简写
git config --global alias.st status
很多人都用co
表示checkout
,ci
表示commit
,br
表示branch
- 把暂存区的修改撤销掉(unstage),重新放回工作区
git config --global alias.unstage 'reset HEAD'
- 显示最后一次提交信息
git config --global alias.last 'log -1'
- 丧心病狂地把lg
配置成了
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h^Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
- 每个仓库的Git配置文件都放在.git/config
文件中
cat .git/config
- 当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig
中
最后、安装git
1、如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./config
,make
,sudo make install
这几个命令安装就好了。
2、在Mac OS X上安装Git
如果你正在使用Mac做开发,有两种安装Git的方法。
一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
Xcode是Apple官方IDE,功能非常强大,是开发Mac和iOS App的必选装备,而且是免费的!
3、在Windows上安装Git
实话实说,Windows是最烂的开发平台,如果不是开发Windows游戏或者在IE里调试页面,一般不推荐用Windows。不过,既然已经上了微软的贼船,也是有办法安装Git的。
Windows下要使用很多Linux/Unix的工具时,需要Cygwin这样的模拟环境,Git也一样。Cygwin的安装和配置都比较复杂,就不建议你折腾了。不过,有高人已经把模拟环境和Git都打包好了,名叫msysgit,只需要下载一个单独的exe安装程序,其他什么也不用装,绝对好用。
msysgit是Windows版的Git,从http://msysgit.github.io/下载,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
Git入门详解的更多相关文章
- Git 入门详解
Git git核心概念详解 什么是git git是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布.最初目的是为更好地管理Linux内核开发而设计.应注意的是,这与GNU I ...
- 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 ...
- 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 ...
- 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 ...
- Git应用详解第二讲:Git删除、修改、撤销操作
前言 前情提要:Git应用详解第一讲:Git分区,配置与日志 在第一讲中我们对Git进行了简单的入门介绍,相信聪明的你已经了解Git的基本使用了. 这一讲我们来进一步深入学习Git应用,着重介绍Git ...
- Git应用详解第五讲:远程仓库Github与Git图形化界面
前言 前情提要:Git应用详解第四讲:版本回退的三种方式与stash 这一节将会介绍本地仓库与远程仓库的一些简单互动以及几款常用的Git图形化界面,让你更加方便地使用git. 一.Git裸库 简单来说 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
随机推荐
- NeHe OpenGL教程 第五课:3D空间
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- JavaScript: bind apply call
var foo = function(age,sex){ console.log(this.name,age,sex); }; //call将改变函数运行的context foo.call({name ...
- 简单数据访问类,生成简单SQL,自动转换成java对象
import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; impo ...
- UILabel使用技巧
UILabel的各种属性与方法的使用(转) #import "LabelTestViewController.h" @implementation LabelTestViewCon ...
- 总结Ajax跨域调用问题
原文:http://blog.csdn.net/wangxiaohu__/article/details/7294842 (一):动态脚本注入的方法.即在页面中动态生成<script>脚本 ...
- Performance plugin离线安装
Upload安装plugin Upload安装plugin方式,需要手动下载plugin,然后在Jenkins界面中upload plugin,从而实现安装plugin的目的. 进入Jenkins界面 ...
- [Flex] ButtonBar系列——如何给ButtonBar添加一个ViewStack
<?xml version="1.0" encoding="utf-8"?> <!--如何给ButtonBar添加一个ViewStack--& ...
- Oracle中常用操作
查看表中的字段名和类型 SELECT column_name,DATA_TYPE FROM cols WHERE TABLE_NAME=upper('tableName') ORDER BY COLU ...
- 常用命令之ps
ps : process status ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的:如果想对进程时间监控,应该用 top 工具. kill 命令用于杀死进程. linux上 ...
- java中的final总结
Java关键字final有最终的,不可改变的含义,它可以修饰非抽象类.非抽象类成员方法和变量. 报错:类"TestFinal"要么是abstract,要么是final的,不能两个都 ...