查看分支: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 [email protected]
# 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:[email protected]: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除外
忽略文件的原则是:
.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 protected]"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。