zoukankan      html  css  js  c++  java
  • Git 入门

    安装
    在Linux上安装Git
    sudo apt-get install git
     
    在Windows上安装Git
    安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
     
    安装完成后,还需要最后一步设置,在命令行输入:
     
    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"
     
    创建版本库
    1、创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
     
    $ mkdir learngit
    $ cd learngit
    $ pwd
    /Users/michael/learngit
    2、第二步,通过git init命令把这个目录变成Git可以管理的仓库:
     
    $ git init
    Initialized empty Git repository in /Users/michael/learngit/.git/
     
    把文件添加到版本库
    编写一个readme.txt文件,内容如下:
     
    Git is a version control system.
    Git is free software.
    一定要放到learngit目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git再厉害也找不到这个文件。
     
    把一个文件放到Git仓库只需要两步。
    1、用命令git add告诉Git,把文件添加到仓库:
     
    $ git add readme.txt # 注意,可反复多次使用,添加多个文件;
    执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
     
    2、用命令git commit告诉Git,把文件提交到仓库:
    git commit -m "wrote a readme file" # -m后面输入的是本次提交的说明
     
     
    版本回退
     
    git status #命令可以让我们时刻掌握仓库当前的状态
    git diff #顾名思义就是查看difference
    要随时掌握工作区的状态,使用git status命令。
    如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
     
    git log --pretty=oneline
     
    HEAD指向的版本就是当前版本,一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。因此,Git允许我们在版本的历史之间穿梭,使用命令
    git reset --hard commit_id
     
    穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
     
    要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
     
    工作区和暂存区
     
    工作区(Working Directory)#就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区。
    版本库(Repository) #工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
     
    #暂存区是Git非常重要的概念,弄明白了暂存区,就弄明白了Git的很多操作到底干了什么。
     
    管理修改
     
    为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
    第一次修改 -> git add -> 第二次修改 -> git commit
    git diff HEAD -- readme.txt #查看工作区和版本库里面最新版本的区别
    # 先把第一次修改的add到暂存区,commit 只提交暂存区的内容,所以第二次修改的未在git中。
     
    撤销修改
    git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
     
    一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
     
    一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
     
    总之,就是让这个文件回到最近一次git commit或git add时的状态。
     
     
    git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区
     
    删除文件
    一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:
     
    rm test.txt
    这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,
    git status命令会立刻告诉你哪些文件被删除了:
    确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit
     
    如果删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
     
    $ git checkout -- test.txt
    git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
     
     
    远程仓库
     
    自行注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
     
    第1步:创建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是公钥,可以放心地告诉任何人。(✪ω✪)
    第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
     
    然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”
     
     
    添加远程库
    右上角找到“Create a new repo”按钮,创建一个新的仓库
    在 Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
    git remote add origin https://github.com/wanafan/pool.git # 关联远程库https方式,慢,
    坑1: 每次push都需要输入一次账密,建议修改为git://github.com/wanafan/pool.git
    修改方法: git remote rm origin
    git remote add origin git@github.com:wanafan/pool.git
    git push -u origin master
     
    git push -u origin master #把本地库的所有内容推送到远程库上
    把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
     
    由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
     
    从现在起,只要本地作了提交,就可以通过命令:
    git push origin master #真正的分布式版本库
     
     
    从远程库克隆
     
    勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。
     
    现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:
     
    $ git clone git@github.com:***/***
    要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
     
    Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
     
    分支管理
    每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支
     
    创建与合并分支
     
    首先,我们创建dev分支,然后切换到dev分支:
     
    1、git checkout -b one # 创建分支one并切换到该分支
    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
    # git branch dev
    # git checkout dev
    2、git branch命令查看当前分支
    修改文件,然后提交:
     
    $ git add readme.txt
    $ git commit -m "branch test"
     
    3、现在分支工作完成,再切换到master分支
    git checkout master # 切换回去后,刚刚修改的内容不见了,因为内容在分支中。
     
    现在,我们把dev分支的工作成果合并到master分支上:
     
    $ git merge one #合并
    4、 删除分支 : git branch -d one
     
     
     
    解决冲突
    冲突的产生: 分支修改完成后 ,返回master,再次修改文件,并提交。
    #通常是在不同的分支上修改了某一文件,返回 主分支 合并时才会产生冲突,这时需要把主分支上的修改的内容删除后,再add --> commit 提交就可以了。
     
     
    git log --graph #可以看到分支合并图
     
     
    分支管理策略
    合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
     
    如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
     
    下面我们实战一下 --no-ff 方式的git merge:
     
    1、首先,仍然创建并切换one分支:
    $ git checkout -b one
    2、修改readme.txt文件,并提交一个新的commit:
     
    $ git add readme.txt
    $ git commit -m "add merge"
    3、git checkout master # 切换回master
    4、git merge --no-ff -m "merge with no-ff" one
    # --no-ff 标识禁用Fast forward
    # -m 因为本次合并会创建一个新的commit
     
    合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
     
     
    处理Bug分支
     
    git stash #隐藏工作区
    此时可以创建分支去处理bug,返回工作区,
    git stash list #查看保存的工作区
    恢复方法:1、git stash apply ---> git stash drop 删除stash内容。
    2、git stash pop #恢复的同时把stash内容也删了。
    # 当有多个stash内容时,git stash apply stash@{0}
     
    当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除。
     
     
     
    Feature分支
     
    #软件开发中,总有无穷无尽的新的功能要不断添加进来。
     
    #添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
     
    1、git checkout -b feature-vulcan
    2、add添加,提交
    3、git checkout dev
    #切回工作区 ,开始合并--删除
    但是,新功能计划取消,于是强制删除:
    #要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除
     
     
    多人协作
     
     
    git remote -v # 查看远程库的详细信息
    # 远程仓库的默认名称是origin
     
    推送分支
    # 把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
     
    # git push origin master
    如果要推送其他分支,比如dev,就改成:
    # git push origin dev
     
    哪些分支需要推送,哪些不需要呢?
     
    master分支是主分支,因此要时刻与远程同步;
     
    dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
     
    bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
     
    feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
     
     
    抓取分支
     
    # 多人协作的工作模式通常是这样:
     
    1、可以试图用git push origin <branch-name>推送自己的修改;
     
    2、如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;如果合并有冲突,则解决冲突,并在本地提交;
     
    3、没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
     
    # 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
     
     
     
     
    Rebase
     
    #多人在同一分支上协作时,重复合并、push,log很乱,反正我懵
    git log --graph --pretty=oneline --abbrev-commit #查看
     
     
    git rebase # 整个提交历史就成了一条直线
     
    rebase操作可以把本地未push的分叉提交历史整理成直线;
     
    rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
     
     
     
     
    标签管理
     
    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
     
    Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针。
     
     
    创建标签
     
    1、 git checkout master # 切换到需要打标签的分支上
     
    2、 git tag v1.0 # <name>
    # git tag 查看所有标签
     
    默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
     
    #解决方案:git log --pretty=oneline --abbrev-commit # 找到历史commit id
    git tag v0.9 f52c633 # 提交打标签
     
     
    # 注意:标签不是按时间顺序列出,而是按字母排序的
     
     
     
    还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
     
    git tag -a v0.1 -m "version 0.1 released" 1094adb
     
    git show <tagname> # 查看标签详细信息。
     
     
    操作标签
     
    git tag -d v0.1 # 删除本地标签
     
    git push origin <tagname> # 推送某个标签到远程
     
    git push origin --tags # 次性推送全部尚未推送到远程的本地标签
     
    删除远程标签
     
    1、先删除本地标签
     
    2、 git push origin :refs/tags/v0.9 # 从远程删除
     
     
    使用GitHub
     
    git clone git@github.com:wanafan/learngit.git # 克隆一个项目
     
    pull request # 请求
     
     
     
    使用码云 # GitHub 国内托管
     
    1、 将Ubuntu中的公钥粘贴到码云中 # 操作与git 想同
    2、 码云中创建一个项目, # git 仓库
    3、 git remote add origin git@gitee.com:********
    # 坑,:先将git的仓库移除,因为两个仓库的默认名称都是origin
    # 解决方案: 修改 origin 名称,
    # git remote -v #查看仓库
    # git remote rm origin # 先移除仓库
    # git remote add gitee git@gitee.com:wanzf/*******
    # git remote add github git@github.com:wanafan/*******
     
     
    4、 如果要推送到GitHub,使用命令:
     
    git push github master
     
    如果要推送到码云,使用命令:
     
    git push gitee master
     
     
    自定义Git
     
    让Git显示颜色,会让命令输出看起来更醒目:
     
    # git config --global color.ui true
     
    忽略文件
    在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
     
    1、 创建 .gitignore 文件
    例:# Windows:
    Thumbs.db
    ehthumbs.db
    Desktop.ini
     
    # Python:
    *.py[cod]
    *.so
    *.egg
    *.egg-info
    dist
    build
     
    # My configurations:
    db.ini
    deploy_key_rsa
     
    2、把这文件提交到Git
     
    如果你确实想添加该文件,可以用-f强制添加到Git:
    # git add -f App.class
     
    检查哪个规则写错了
    # git check-ignore -v App.class
     
     
    忽略文件的原则是:
    1、忽略操作系统自动生成的文件,比如缩略图等;
    2、忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
    3、忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
     
     
     
    配置别名
     
    # st 表示 status
    # git config --global alias.st status
     
    配置一个git last,让其显示最后一次提交信息:
     
    # 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"
     
     
     
    配置文件 偷懒文件
    1、*配置Git的时候,加上--global是针对当前用户起作用的;
     
    2、当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中
     
    3、如果不加--global,那只针对当前的仓库起作用。
     
     
    每个仓库的Git配置文件都放在.git/config文件中。
    # 别名就在[alias]后面,要删除别名,直接把对应的行删掉即可
     
     
     
    搭建Git 服务器
     
     
    使用Ubuntu 或 Debian
     
    1、安装 Git
     
    sudo apt-get install git
     
    2、创建一个git用户,用来运行git服务:
     
    sudo adduser git
     
    3、创建证书登录
     
    收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
     
    4、初始化Git仓库:
     
    先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
     
    sudo git init --bare sample.git(自定义**.git)
     
    Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
     
    # sudo chown -R git:git sample.git
     
     
    5、 禁用shell登录:
     
    出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
     
    git:x:1001:1001:,,,:/home/git:/bin/bash
    改为:
    git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
     
     
    6、克隆远程仓库:
     
    现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
     
    # git clone git@server:/srv/sample.git
     
    管理公钥
     
    如果团队很小,把每个人的公钥收集放/home/git/.ssh/authorized_keys
     
    · 要方便管理公钥,用Gitosis;
    要像SVN那样变态地控制权限,用Gitolite。
     
     
     
     
     
     
    git 官网: https://git-scm.com/
     
  • 相关阅读:
    StrutsTestCase 试用手记
    java版的SHA1
    看看junit在一个具体的项目中
    store/index.js中引入并注册modules目录中的js文件:require.context
    vue项目报错:$ is not defined
    状态合并:replaceState
    路由导航守卫中document.title = to.meta.title的作用
    vue路由中meta的作用
    BCryptPasswordEncoder加密与MD5加密
    滑块验证机制
  • 原文地址:https://www.cnblogs.com/wanzf/p/10539453.html
Copyright © 2011-2022 走看看