Git工具使用


Git是目前世界上最先进的分布式版本控制系统(没有之一)。

在Linux上安装Git:
sudo apt-get install git 
在Mac OS X上安装Git:

一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。

在Windows上安装Git:

在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:

git config --global user.name "Your Name"
git config --global user.email "email@example.com"
创建版本库:

创建一个文件夹(文件夹名称不要是中文,Git对中文不是很友好),进入到创建的文件夹内打开Git Bash输入命令:

git init

创建成功后当前目录下会多一个.git的目录(.git目录是隐藏文件,设置一下就能看见),这个目录是Git来跟踪管理版本库的,切记改动。
版本仓库创建完毕,接下来就可以在这个仓库里进行一些操作了.
在这里先了解一下工作区、暂存区和版本库的概念,以便下面的学习。工作区:就是你对文件的各种修改操作都是在工作区进行的;暂存区:就是将你修改的东西暂存起来,通过git add命令可将工作区的某个文件提交到暂存区暂存;版本库:存放各种不同的提交版本,是Git本地版本管理仓库,所有通过git commit命令提交的修改版本都会保存到这里,通过git commit 命令将暂存区的所有的修改一起保存到版本库。
把文件添加暂存区,filename为你要添加的文件名:

git add filename

将文件提交到版本库,description是对本次提交的描述,此命令会把暂存区的所有文件提交到版本库:

git commit -m "description"

查看当前仓库的状态(那个文件被修改了,那个文件还在暂存区没有被提交到版本库):

git status

时光机穿梭

版本回退:

查看版本库的历史记录,显示从最远到最近的提交日志记录,加上–pretty=oneline参数可以将每次提交记录只在一行中显示出来:

git log

如果要进行回退,首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
将当前版本回退到上一个版本:

git reset --hard HEAD^

除此之外还一种方法可以回退,那就是用下面的命令,但前提是必须知道要回退的版本的版本号(只需前5位版本号即可),查看版本号可以通过git log或者git reflog命令查看:

git reset --hard 版本号

Git跟踪并管理的是修改,而非文件。比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。

管理修改:

查看工作区和版本库里面最新版本的区别:

git diff HEAD -- filename
撤销修改:

如果要撤回工作区所做的修改,可以通过命令:

git checkout -- filename

撤销对工作区的修改,如果这里只是对工作去进行了修改,执行此命令后,工作区的状态就会和版本库的状态保持一致,如果作了修改,然后提交到了暂存区,这时又在工作区做了修改,通过执行上述命令后,工作区的状态就会和暂存区的状态保持一致。此命令只是把将工作区的状态回退到上一次的状态。
如果你已经将修改提交到了暂存区,此时想撤销的话可以通过命令:

git reset HEAD filename

此命令可以将提交到暂存区的修改回退到工作区。

删除文件:

如果你要删除一个文件,步骤如下:
1、先在工作区将文件删除
2、将版本库中的文件删除

git rm filename

3、通过 git cimmit命令提交到版本库中
如果是不小心讲一个文件删除,可通过之前学过的命令恢复:

git checkout -- filename

以上都是对本地仓库的操作,下面学习一下远程仓库的相关操作。
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作。好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
在继续阅读后续内容前,请自行注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

ssh-keygen -t rsa -C "your email"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
点“Add Key”,你就应该看到已经添加的Key。

远程仓库

添加远程仓库:

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库。
下一步就是将本地仓库与远程仓库相关联,命令(jimmylegend为在github官网上的账号,test为远程仓库名):

git remote add git@github.com:jimmylegend/test.git

将本地仓库的所有内容推送到远程仓库,命令:

git push -u origin master

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

从远程克隆:

将远程仓库拉倒本地,命令(jimmylegend为github上的用户名,test为要拉取的远程仓库名称):

git clone git@github.com:jimmylegend/test.git

GitHub给出的地址不止一个,还可以用https://github.com/jimmylegend/test.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

分支管理:

创建与合并分支

在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点,每次提交,master分支都会向前移动一步。当我们创建新的分支dev时,指向master的相同提交,再把HEAD指向dev,就表示当前分支在dev上(这里其实存在两步:第一步创建dev分支,第二步将HEAD指针指向dev分支)。如果在dev分支上完成了工作并且想把dev合并到master分支上,通过将master直接指向dev当前提交就可以了,合并完成后就可以将dev分支删除掉了。
下面我们就用具体的命令实现上面的描述:
首先,我们创建dev分支,然后切换到dev分支:

git checkout -b dev # 这条命令创建了dev分支,然后将当前分支切换到dev
git checkout 命令加上-b参数表示创建分支并进行切换,相当于以下两条命令:
git branch dev
git checkout dev

查看当前分支:

git branch # 此命令会列出所有分支,当前分支前面会有一个*标志

  我们在dev分支上进行一系列操作并进行提交,然后切换到master分支上查看,刚刚修改的内容就不见了,因为刚刚做的修改在dev分支上,master分支没有做任何修改。
如果我们想将dev分支上的修改合并到master分支上,可以通过命令:

git merge dev # 将dev分支合并到master分支上

合并完成后在master分支上就可以看到dev分支上修改的那部分内容了。
合并完成后就可以删除dev分支了:

git branch -d dev # 删除dev分支
解决冲突

如果我们有多个分支(多个成员协作开发),当不同的分支对同一部分内容作了修改后,最后合并的时候就会发生冲突。
当冲突发生时,我们必须手动解决冲突在提交。通过git status命令可以查看存在冲突的文件。找到发生冲突的文件打开手动解决冲突,git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。
解决完后再提交:

git add 发生冲突的文件名
git commit -m "描述"
分支管理策略

在合并分支时git会用Fast forward模式,但这种模式下,删除分之后,会丢掉分支信息。如果要强制禁用Fast forward模式,git就会在merge 时生成一个新的commit,这样,从分支历史上就可以看出分支信息(–no-off参数表示禁用Fast forward)。

git merge --no-off -m "merhe whith no-off" dev
Bug分支

当我们正在dev分支上进行开发时,这时我们急需修改一个Bug,我们的思路是将现在的dev分支上的修改提交,然后再创建新分支修改Bug,问题是dev上的开发进行到一半,还没有办法提交,这时我们就可以使用stash功能来把当前工作现场保存起来,等修改完Bug后恢复现场继续工作。

git stash

执行完以上命令后后,用git status查看工作区,就是干净的,可以放心进行Bug修改。
修改Bug的过程就是创建分支,然后修改Bug,最后将修改合并到master分支上,这里不做详细的描述。
修改完Bug以后就可以切换到dev分支继续工作了,但是这时工作区是干净的什么都没有,所以我们要恢复现场:
查看工作现场:

git stash list

这里恢复工作现场有两种方式:
第一种方式:

git stash apply # 这种方式回复后,stash内容并不删除
git stash drop # 删除stash内容

第二种方式:

git stash pop # 回复的同时吧stash内容删除掉

注:可以多次stash,回复的时候,先用git stash list命令查看,然后恢复指定的stash:

git stash apply stash@{0}
Feature分支

这种分支的场景是开发一个新的功能,然后这个功能开发完成后,由于各种原因又需要将此分支删除掉。
如果在合并后再删除,很容易就像之前删除分支一样,然后在创建一个分支将这次修改的内容在修改回来便是了。如果创建了分支进行了开发,开发完成后还没有将分支合并,然后就将分支删除:

git branch -d 分支名称

上面这条命令删除失败!Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。
我们可以强行删除:

git branch -D 分支名称
多人协作

查看远程库信息:

git remote

查看远程库详细信息:

git remote -v

推送分支

git push origin master # 将master分支推送到远程库
git push origin dev # 将dev分支推送到远程库

但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

Rebase

Git有一种称为rebase的操作,把分叉的提交变成直线。

git rebase

问题

错误:smudge filter lfs failed

超过100M将限制下载

git lfs install --skip-smudge  #跳过smudge
git clone  #克隆github文件,大文件为LFS的一个地址
git lfs pull  #将大文件pull回来
git lfs install --force    #恢复smudge

参考:廖雪峰Git教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值