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入门详解_第1张图片

三、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添加文件需要addcommit一共两步呢?因为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除外

忽略文件的原则是:

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

七、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 id3628164...,于是就可以指定回到未来的某个版本:

- 制定某个版本

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 - 分支

Git入门详解_第2张图片

Git入门详解_第3张图片

十四、创建分支

创建dev分支,然后切换到dev分支

$ git checkout -b dev
或者
$ git branch dev $ git checkout dev
 

Git入门详解_第4张图片

十五、切换分支

-切换回master分支

git checkout master

Git入门详解_第5张图片

十六、git - 移动指针

git commit -m ‘change it’

Git入门详解_第6张图片

十七、git - 分支历史

git checkout master
vim index.html
git commit -m ‘change’

Git入门详解_第7张图片

十八、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表示checkoutci表示commitbr表示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官网下载源码,然后解压,依次输入:./configmakesudo 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入门详解_第8张图片

安装完成后,还需要最后一步设置,在命令行输入:

$ git config --global user.name "Your Name" $ git config --global user.email "[email protected]" 

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

 

 

你可能感兴趣的:(git)