Git教程

作者: CoderShang | 来源:发表于2019-08-14 15:48 被阅读0次

    😎来自最贴心的Git教程👉👉👉 Git教程 - 廖雪峰的官方网站

    1.安装
    2.版本回退
    3.远程仓库
    4.分支管理
    5.标签管理

    1.安装

    Mac使用Git,首先安装homebrew

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    brew install git
    

    安装完成后,还需要设置用户名,在命令行输入:

    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"
    

    第一步,创建一个版本库非常简单,选个空目录:

    $ mkdir learngit
    $ cd learngit
    $ pwd
    /Users/shang/learngit
    

    第二步,把这个目录变成Git可以管理的仓库(.git目录默认是隐藏的,用ls -ah命令可看见):

    git init
    提示:Initialized empty Git repository in /Users/shang/learngit/.git/
    

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。(Git自动创建了master分支,默认是提到此分支上的)
    把文件修改添加到暂存区 →→ 把暂存区的所有内容提交到当前分支:

    $ git add file1.txt
    $ git add file2.txt file3.txt
    $ git commit -m "add 3 files.提交的说明(必填)"
    

    git status命令可以查看当前的修改状态,但是要看具体修改了什么(difference),需要使用git diff

    git diff readme.txt    
    

    知道修改了什么,可以放心git add了,不过在执行第二步git commit之前,再运行git status 确认无误后,方可提交,之后再用git status查看(养成细心的好习惯~)。
    查看提交的历史记录 (从最近到最远):

    git log
    或
    git log --pretty=oneline
    

    2.版本回退

    HEAD表示当前版本:

    # 上一个版本就是HEAD^,上上一个版本就是HEAD^^
    git reset --hard HEAD^
    提示:HEAD is now at 352d83a  xxxxx
    

    如果此时想再回去,需要找到原来的commit_id,不需要写全,git会自动找:

    $ git reset --hard 1094a
    提示:HEAD is now at 83b0afe xxxx 表示已经反悔成功
    

    为了防止commit_id被忘记,Git记录你的每一次命令:

    git reflog
    

    add之前,丢弃工作区的修改(没有--,就变成了“切换到另一个分支”的命令):

    git checkout -- readme.txt
    

    把暂存区的修改撤销掉,重新放回工作区:

    git reset HEAD readme.txt
    

    本地删除一个文件并提交:

    git rm test.txt
    git commit -m "remove test.txt"
    

    好啦,以上是对一个文件的基本操作,掌握之后就可以继续学习远程仓库的操作了!

    3.远程仓库

    使用GitHub
    第1步:创建SSH Key,密码不一定和邮箱一致,但要牢记

    ssh-keygen -t rsa -C "youremail@example.com"
    

    如果创建了,直接到.ssh下查看, id_rsa是私钥不能泄露,id_rsa.pub是公钥可以告诉任何人:

    cat id_rsa.pub
    

    第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容(一个字不落的全部复制出来),一台电脑对应一个Key,这样就OK啦~

    如果本地创建了一个仓库后,又想在GitHub创建一个仓库,并且让这两个进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,该怎么操作呢?

    这种情况必须是空仓库,创建时什么都不要勾选,不然会合并失败!
    在本地的KrBase仓库下运行命令:

    git remote add origin git@github.com:CoderShang/KrBase.git
    

    把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

    git push -u origin master
    

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

    git push origin master
    

    把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

    如果从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆:

    git clone git@github.com:CoderShang/KrBase.git
    

    可以看到,GitHub给出的地址不止一个,还可以用https://xxx,其缺点是:速度慢、每次推送都必须输口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

    4.分支管理

    我们创建dev分支,然后切换到dev分支:

    git checkout -b dev
    提示:Switched to a new branch 'dev'
    # ``-b``参数表示创建并切换:
    git branch dev
    git checkout dev
    # 可查看当前分支:
    git branch
    

    dev分支合并到master分支上:

    git merge dev
    

    合并完成后,就可以放心地删除dev分支了:

    git branch -d dev
    git branch -D dev 强制删除用大写D
    

    当执行merge后Git无法自动合并分支时,就必须手动解决冲突后,再提交
    合并分支的log可以使用参数查看:

    git log --graph --pretty=oneline --abbrev-commit
    

    如果要强制禁用Fast forward(快进)模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
    --no-ff方式的git merge

    git merge --no-ff -m "merge with no-ff" dev
    

    有时候工作只进行到一半,没法提交,预计完成还需1天时间。但是,必须在两个小时内修复某个bug,怎么办?
    幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,便于以后继续工作:

    git stash
    # 工作现场列表
    git stash list
    

    Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
    一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
    另一种方式是用git stash pop,恢复的同时把stash内容也删了:

    git stash pop
    

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

    git stash apply stash@{0}
    

    dev分支上修复bug,然后在master分支上复制一个特定的提交:

    git cherry-pick 4c805e2
    

    查看远程库的信息,显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址:

    git remote -v
    origin  git@github.com:CoderShang/KrBase.git (fetch)
    origin  git@github.com:CoderShang/KrBase.git (push)
    

    若本地创建了dev分支,则同步到远端并且指定链接关系:

    git push origin dev
    git branch --set-upstream-to=origin/dev dev
    

    若本地没有dev,远端有,则创建远程origindev分支到本地:

    git checkout -b dev origin/dev
    

    删除本地分支后,使用如下命令删除远端分支:

    git push origin --delete dev
    git branch -a
    

    多人协作的工作模式通常是这样:
    首先,可以试图用git push origin <branch-name>推送自己的修改;
    如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    如果合并有冲突,则解决冲突,并在本地提交;
    没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

    5.标签管理

    打一个新标签,可以用命令git tag查看所有标签:

    # 打过后查看show:
    git tag v1.0
    git show v1.0
    # 对应的commit id打标签:
    git log --pretty=oneline --abbrev-commit
    git tag v0.9 f52c633
    

    还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

    git tag -a v0.1 -m "version 0.1 released" 
    

    注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

    如果标签打错了,也可以删除:

    git tag -d v0.1
    

    因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

    如果要推送某个标签到远程,使用命令:

    git push origin v1.0
    # 或者,一次性推送全部尚未推送到远程的本地标签:
    git push origin --tags
    

    如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

    git tag -d v1.0
    git push origin :refs/tags/v1.0
    

    !!!重点说一下:git pull要慎用,最好使用如下命令更新代码:

    git fetch
    &
    git merge
    

    (^-^)好啦~!基本功修炼结束,送大家一条命令作为礼物:

    # 运行下面命令后 再运行:git 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"
    git lg
    

    关于搭建Git服务器请参考:搭建Git - 廖雪峰的官方网站

    相关文章

      网友评论

          本文标题:Git教程

          本文链接:https://www.haomeiwen.com/subject/oglbjctx.html