一点一滴成长

导航

Git使用说明

本文内容参考和转载自:Git教程-廖雪峰的官方网站,网址:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000。

一、安装
linux:先在终端下输入git查看系统有没有安装Git,没有的话ubuntu上直接输入sudo apt-get install git安装。
mac: 直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单->“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装。
windows:直接从官网下载合适版本Git进行安装。

安装Git完成后,在Git Bash命令行输入以下命令来配置本机用户名和邮箱:

git config --global user.name "Your Name";  

git config --global user.email "email@example.com"。

进入项目目录,输入git init来初始化本地仓库。

注意事项:

1、linux终端上很多命令git bash上也支持,如ls、cd、pwd等。

2、为了避免遇到各种莫名其妙的问题,请确保项目目录中不包含中文。

3、用到记事本的地方推荐使用Notepad++,并将其默认编码设置为UTF-8 without BOM,避免windows记事本程序中对文件添加一些标记内容。

二、文件操作

提交文件到本地版本库:分两个步骤,先添加到暂存区git add filename1 filename2,然后再提交git commit -m "explain",-m后面跟的是提交说明,commit之后还需要使用push命令来将修改推送到远程版本库,如果远程主机的版本比本地版本更新, 推送时 Git 会报错, 要求先在本地做 git pull 操作来合并差异,如果你一定要推送而不拉取的话, 可以添加参数 --force。

git有好几个区,工作区(workspace)、暂存区(index)、本地仓库(local repository)、还有远程仓库(remote repository)。工作区、暂存区和本地仓库都在本地,这也就是为什么我们在没有网络的环境下也能使用git提交(commit)代码,因为提交仅仅是提交到本地仓库中,待有网络之后可以再push到远程仓库。

push命令:git push <远程主机名> <本地分支名>:<远程分支名>,如git push origin dev:master是将本地的 dev 分支推送到 origin 主机的 master 分支,git push origin HEAD:master表示将本地的当前分支推送到 origin 主机的 master 分支 (HEAD 代表当前的本地分支)。如果push的时候省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建,如git push origin master表示将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。

pull命令:git pull <远程主机名> <远程分支名>:<本地分支名>,如git pull origin master:feature,如果远程分支是与当前分支合并,则冒号后面的本地分支名可以省略,如git pull origin master表示将远程主机的master分支最新内容拉下来后与当前本地分支直接合并。pull相当于是fetch(仅拉去,不合并)+ merge(合并)。

   

 

添加所有已修改的文件到暂存区(不包括untracked文件,即新建一个文件还没有对其进行add或commit操作就称其为untracked,已经在版本库中的文件则为tracked):git add -u,项目中所有已修改的文件都会被添加,包括当前目录、子目录和上级目录中等。
添加所有已修改的文件(包括tracked和untracked)到暂存区:git add -A

添加当前目录下所有已修改文件(不包括untracked)文件到暂存区:git add . -u

添加当前目录下所有已修改文件(包括tracked和untracked)到暂存区:git add .

已经添加到暂存区的文件称为staged change,未添加到暂存区的文件(包括tracked和untracked)称为unstaged change。

清空暂存区中所有改动(工作区不变):git reset 
清除暂存区中指定文件: git reset -- filename

显示工作区和暂存区[文件]的差异:git diff [filename]
显示工作区和HEAD[文件]的差异(HEAD表示当前版本,也就是最近一次的提交):git diff HEAD [-- filename]
显示暂存区和HEAD[文件]的差异:git diff --cached [-- filename]

将工作区中指定文件恢复到最近一次提交操作(add或commit)时的内容: git checkout -- filename 
恢复到最近一次commit的版本: git reset --hard HEAD
恢复到上一次commit版本: git reset --hard HEAD^ 
恢复到上上此commit版本: git reset --hard HEAD^^ 
恢复到第十个commit版本: git reset --hard HEAD~10 
恢复到指定commit版本: git reset --hard commit_id 

查看仓库状态:git status,如果版本库目录中有文件增加、文件被修改、文件被添加到提交暂存区、文件被删除等都会有相应提示。当文件被提交到版本库后运行git status会提示版本库是干净的,无需提交。
查看提交历史日志:git log,其中的一串十六进制数字即为每次commit提交的ID即提交版本号。
查看提交历史日志:git reflog,如果使用reset回退到了指定版本,那么git log只会显示当前版本和之前的版本,而git reflog会显示所有的提交版本。
删除文件:如果文件还未add到暂存区的话直接在本地目录删除,如果文件已经add还需要git rm filename,如果文件已经commit还需要git commit -m "explain"。

三、branch分支管理

创建分支:git branch branch_name
切换到分支:git checkout branch_name
创建并切换到分支:git checkout -b branch_name
查看所有分支:git branch(带*的为当前分支)
合并分支到当前分支:git merge branch_name
合并分支到当前分支(不使用快速模式,推荐):git merge --no-f -m "explain" branch_name
删除已经合并的分支:git branch -d branch_name
删除还未合并的分支:git branch -D branch_name
查看分支合并图:git log --graph

merge合并分支后如果提示有conflict冲突,那我们需要手动修改冲突文件后再对文件进行add和commit。Git会在冲突文件中指明冲突内容:<<<<<<< HEAD到=======中间位当前分支冲突的内容,=======到>>>>>>>branch_name中间内容为要合并的分支上冲突的内容。

git版本库一开始会自动为我们创建当前第一个分支master,HEAD指向的是当前分支,git commit就是往HEAD分支上进行提交。当切换到其它分支上后,HEAD就指向了切换的分支。分支开发完成后就可以与master主干分支合并,合并完成后就可以把这个分支删除掉。Git鼓励大量使用分支。分支创建和切换完毕后我们就可以在自己的分支上进行修改和提交,这与主干分支master互不影响,分支开发完成后切换到master来合并分支并删除分支。

一般在开发中,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。先在master上新建一个dev分支,小伙伴们各自又创建自己的分支,平常我们在自己的分支上干活,并且往dev分支上合并,也就是说dev分支是不稳定的。到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本,dev分支和各自的分支都可以删除了。对于bug可以通过创建一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

四、使用GitHub托管代码

1、SSH

首先需要注册GitHub账号,由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要SSH Key:
① 创建SSH Key:在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:ssh-keygen -t rsa -C "youremail@example.com",然后一路回车,使用默认值即可。如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
② 将SSH key提交到GitHub上:登陆GitHub,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key。

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。假定你有两台电脑,你有时在公司提交,有时在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。如果是其他人从GitHub上clone自己的项目的时候,使用SSH的话要提前把其SSH Key添加到GitHub上。

除了ssh还可以使用https协议地址,使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议就只能用https。

2、从GitHub上push推送和pull抓取分支

① 首先创建一个远程仓库:在GitHub上选择New repository,输入名称,确认,我们就可以看到GitHub上仓库的地址了:git@github.com:milanleon/repository_name.git。创建远程库完成后还需要将本地库与远程库进行关联,使用git remote: git remote add origin git@github.com:milanleon/repository_name.git,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

使用git remote命令可以查看远程库的名字,git remote -v可以查看远程库的地址。

② 创建完成远程库后其他人就可以使用git clone将远程库克隆到他的电脑上,git clone git@github.com:milanleon/gitskills.git。默认情况下,clone后只能看到master分支(可以用git branch查看),使用命令git checkout -b branch_name origin/branch_name创建远程库的分支到本地并转到这个分支。

③ 然后就可以用git push命令把本地库的分支内容推送到远程库上:git push -u origin master,实际上也就是把分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的

master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以不加-u参数。

如果往远程库push失败,一般是因为远程分支比你的本地更新,需要先使用命令git pull拉取分支:git pull origin branch_name, 拉取完成后再提交(add+commit)和push。如果pull结果中提示合并本地和远程分支时有conflict冲突,则应解决冲突后再提交(add+commit)和push,然后通知冲突对方更新代码。如果拉取时提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,使用命令git branch --set-upstream branch_name origin/branch_name 创建链接关系。

抓取分支还有一个命令:git fetch,与git pull不同的是git pull会自动合并本地和远程分支的文件,而git fetch不会自动合并,这样就可以先用git diff HEAD FETCH_HEAD查看需要合并的文件的不同内容,然后使用git merge合并:git merge origin/branch_name。

 3、参与GitHub上的开源项目

如何参与GitHub上的一个开源项目呢?比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页https://github.com/twbs/bootstrap,点击“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:git clone git@github.com:michaelliao/bootstrap.git。一定要从自己的账号下clone仓库,这样你才能推送修改。如果你想在bootstrap新增一个功能,立刻就可以开始干活,干完后,往自己的仓库推送。如果你想修复bootstrap的一个bug,你就可以在其GitHub主页上发起一个pull request。当然,对方是否接受你的pull request就不一定了。

五、标签

发布一个版本时,我们通常先在版本库中打一个标签,标签其实就是指向某个commit的指针,具体来说就是指向发布版本那次commit的指针,通过标签可以快速方便的查找到对应的commit信息。

为当前分支最新的commit打一个标签:git tag tag_name,eg:git tag v1.0
为指定commit打标签:git tag tag_name commit_id
为指定commit打标签并添加说明: git tag -a tag_name -m "explain" commit_id
查看所有标签:git tag
根据标签查看对应的commit信息:git show tag_name
推送标签到远程库:git push origin tag_name
删除标签:git tag -d tag_name
如果标签已经推送到远程,要删除远程标签要先从本地删除:git tag -d tag_name,然后从远程删除:git push origin :refs/tags/tag_name。

六、忽略指定文件
有时候你不想提交一些类型的文件,那么可以在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore。

七、搭建自己的Git服务器

GitHub是一个免费托管开源代码的远程仓库,如果你不想开源自己的项目的话要不就是给GitHub交点钱要不就是搭建自己的Git服务器。具体如何搭建Git服务器可以参考网上的相关教程。

八、总体流程

  先将.gitignore文件放至项目目录中,右键启动git bash->初始化本地仓库:git init->提交所有文件:git add -A; git commit -m "branch_name, explain"->在GitHub上创建远程仓库->将本地版本库与远程库进行关联:git remote add origin git@github.com:milanleon/repository_name.git->将master分支推送到远程库:git push -u origin master,创建dev分支并推送到远程库->创建个人开发分支git branch xsl,平常开发在xsl分支上,开发到一定阶段就将xsl分支合并到dev分支上->功能开发完成后将dev分支推送到远程分支:git push -u origin dev,然后将个人分支删除。push推送dev分支到origin上时可能会失败,一般这是因为有他人在你之前推送了他的dev分支,所以要先pull拉取dev分支到本地:git pull origin dev,拉取完成后再提交到本地分支,然后push到远程分支。pull拉取的时候可能会遇到冲突。->项目完成或发布版本的时候可以将dev合并到master,然后将dev分支删除,打一个标签。

  项目团队中其它人员克隆GitHub上项目:git clone git@github.com:milanleon/winConsole.git->clone后本地只看到了master分支,使用git checkout -b develop origin/develop创建远程库的dev分支到本地并转到这个分支上
->创建个人开发分支lkj,平常开发在lkj分支上,lkj分支开发完成或到一定阶段后后再将lkj分支合并到dev分支上......


posted on 2017-04-20 15:02  整鬼专家  阅读(141)  评论(0编辑  收藏  举报