Git使用教程

Git简介

  Git是目前世界上最先进的分布式版本控制系统(没有之一)。 CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?

先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊 那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

分布式版本控制系统除了Git以及促使Git诞生的BitKeeper外,还有类似Git的Mercurial和Bazaar等。这些分布式版本控制系统各有特点,但最快、最简单也最流行的依然是Git!

安装Git

在Mac OS X上安装Git

提供两种方法参考:

1、通过homebrew安装Git,具体方法请参考homebrew的文档
2、直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode。

在Windows上安装Git

https://git-for-windows.github.io 下载,然后按默认选项安装即可,安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

配置Git

config 配置指令 git config 查看系统config git config –system –list 查看当前用户配置 git config –global –list 查看当前仓库配置 git config –global –list

git安装完成的配置,先自报家门:

$ git config –global user.name “your name” $ git config –global user.email “your email”

开始使用-建立仓库:

初始化Git仓库: 你在目标文件夹下使命令:git init

就会创建一个 .git 隐藏文件,相当于已经建立了一个本地仓库。

添加到暂存区:

  • git add . (全部添加到暂存区)
  • git commit -m ‘ first commit’ (提交暂存区的记录到本地仓库)
    git status 查看仓库当前状态
    git diff 查看修改的不同
    git log  查看从最近到最远的提交日志
    git rebase
    注:rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了
    

Git版本控制

关于回退版本:   HEAD表示当前版本,上一个版本就是HEAD^,上上个HEAD^^,更多写成HEAD~100
$ git reset --hard HEAD^
还可以根据版本号切换版本:$ git reset --hard 1094a
git reflog 可以查看以往提交的每一次命令,可以看到每一次提交的版本号
工作区  暂存区(stage)  分支(master)
工作区是实际查看的工作区间,  暂存区和分支都在Git仓库里 .git的隐藏文件下
git add .   添加到暂存区    git commit -m ‘explain’   把暂存区提交到分支
撤销修改:
git checkout -- filename  可以丢弃工作区的修改,这个命令适合还没有提交到暂存区
如果已经提交到暂存区,需要先撤销暂存区的修改:git reset HEAD <file>
 删除文件:
工作区:rm  readme.txt  
版本库中删除该文件: git rm readme.txt
如果删错了可以用 git checkout -- readme.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

远程操作

关于远程仓库: 首先配置SSH Key 流程:本地已有仓库–>再创建远程仓库—> 关联 在本地需关联的文件仓库下运行命令

git remote add origin git@github.com:awandren/learngit.git origin 远程仓库默认名称
git remote 查看远程库信息,git remote -v 可以查看详细信息 推送到远程仓库:git push -u origin master -u只是第一次推送需要,会让本地和远程分支相关联(master) 以后直接git push origin master 推送时,要指定本地分支,如推送其他分支:git push origin dev

从远程克隆: 流程:先创建远程库—>从远程库克隆 在某个文件路径下执行命令:$ git clone git@github.com:awandren/learngit.git

分支管理

查看分支:git branch    创建分支:git branch <name>  切换分支:git checkout <name>  创建+切换:git checkout -b <name>
合并某分支到当前分支:git merge <name>    删除分支:git branch -d <name>
要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除

关于冲突: Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容 ———手动修改并提交
git log --graph 查看分支合并图
分支管理策略:准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward
例:$ git merge --no-ff -m "merge with no-ff" dev

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:git stash 
git stash list 查看工作现场    
恢复工作现场:1、git stash apply  然后删除内容:git stash drop 2、恢复的同时也删掉 git stash pop

多人协作:当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。要查看远程库的信息,用git remote  或者用git remote -v显示更详细的信息;
多人协作的工作模式通常是这样:
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-to <branch-name> 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 branch-name origin/branch-name;
* 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

远程协作

远程分支详解

可以运行 git fetch origin 来同步远程服务器上的数据到本地
git branch -r 用于查看远端库的分支情况
建立本地到上游(远端)仓的链接 --这样代码才能提交上去
git branch --set-upstream-to=origin/dev 
取消对master的跟踪
git branch --unset-upstream master
# 本地分支代码提交到远端库
git push origin master
git push origin HEAD:refs/for/远端分支名
git push origin 本地分支名:refs/for/远端分支名
eg:
git push origin test:refs/for/master #本地test分支代码提交到远端master库
$ git push origin
上面命令表示,将当前分支推送到origin主机的对应分支。 
如果当前分支只有一个追踪分支,那么主机名都可以省略。 
$ git push 如果当前分支与多个主机存在追踪关系,那么这个时候-u选项会指定一个默认主机,这样后面就可以不加任何参数使用git push。
$ git push -u origin master 上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。
在远端服务器新建分支:
方法1:
git checkout -b dev
#建立本地到上游(远端)仓的链接 --这样代码才能提交上去
git branch --set-upstream-to=origin/dev 
git branch --set-upstream debug origin/debug //其中debug为创建的分支
git push origin dev
#取消对master的跟踪
git branch --unset-upstream master

方法2:
git branch -b stage2
git push origin 本地分支名:远端分支名xx  // 在服務器新建新分支名xxx
对比:
git branch -b stag2
git push origin stage2:refs/for/stage2 // 代码入庫命令,不会新建新分支在远端

git fetch 和git pull 的差别

1、git fetch 相当于是从远程获取最新到本地,不会自动merge,如下指令:

 git fetch orgin master //将远程仓库的master分支下载到本地当前branch中

 git log -p master  ..origin/master //比较本地的master分支和origin/master分支的差别

 git merge origin/master //进行合并
也可以用以下指令:
git fetch origin master:tmp //从远程仓库master分支获取最新,在本地建立tmp分支

git diff tmp //將當前分支和tmp進行對比

git merge tmp //合并tmp分支到当前分支
 
2. git pull:相当于是从远程获取最新版本并merge到本地

git pull origin master
git pull 相当于从远程获取最新版本并merge到本地

在实际使用中,git fetch更安全一些

Git标签

  • 命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
  • 命令git tag -a -m "blablabla..."可以指定标签信息;
  • 命令git tag可以查看所有标签;
  • 命令git push origin 可以推送一个本地标签;
  • 命令git push origin –tags可以推送全部未推送过的本地标签;
  • 命令git tag -d 可以删除一个本地标签;
  • 命令git push origin :refs/tags/可以删除一个远程标签。

自定义Git

$ git config --global color.ui true  让Git显示颜色,
某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件
* 忽略某些文件时,需要编写.gitignore;
* .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
配置别名
$ git config --global alias.st status   以后st就表示status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
$ git config --global alias.unstage 'reset HEAD'  把暂存区的修改撤销掉(unstage),重新放回工作区
配置一个git last,让其显示最后一次提交信息:
$ git config --global alias.last 'log -1'
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 
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:
$ cat .gitconfig
[alias]
    co = checkout
    ci = commit
    br = branch
    st = status
[user]
    name = Your Name
    email = your@email.com


转载请注明:awandren的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦