zoukankan      html  css  js  c++  java
  • 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 filename,然后再提交git commit -m "branch_name, explain",-m后面跟的是提交说明,说明的开头最好是当前分支名称
    添加所有tracked文件到暂存区(文件已经被添加到暂存区则称为tracked已跟踪):git add -u
    添加所有tracked文件和Untracked文件到暂存区:git add -A

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

    清空暂存区中所有改动(工作区不变):git reset 
    清空暂存区中指定文件的改动(工作区不变): git reset -- filename/git reset HEAD 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分支上......


  • 相关阅读:
    使用IOCP完成端口队列做任务队列
    对Zlib单元进行再封装
    XmlReader/XmlWriter 类
    TextReader/TextWriter 的类
    LINQ to XML
    Xml序列化
    动态Linq(结合反射)
    设计模式总结
    深入了解.Net上下文
    应用程序域
  • 原文地址:https://www.cnblogs.com/milanleon/p/6737276.html
Copyright © 2011-2022 走看看