zoukankan      html  css  js  c++  java
  • 廖雪峰Git教程—学后笔记

    本文是看完廖雪峰Git教程后,做的一个教程笔记,方便自己查阅。

    廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/896043488029600/896067008724000


    一、创建版本库
    git init 初始化一个git仓库
    git add file—name 添加文件到git暂存区
    git commit -m“说明描述” 提交文件到git仓库


    二、时光穿梭
    1.查看状态
    git status 查看git仓库的当前状态,文件是否被修改过
    git diff 查看文件被修改的地方

    2.版本回退
    git log 查看当前版本之前的提交日志,包括每次提交的:版本号、作者、日期、提交说明
    HEAD 指向当前版本

    git log --pretty=oneline 查看之前commit日志,包括每次commit的:版本号、提交说明

    git reset --hard HEAD^ 退回上一个版本,HEAD指向上一个版本
    git reset --hard HEAD^^ 退回上上个版本,HEAD指向上上个版本
    git reset --hard HEAD~10 退回前10个版本,HEAD...

    cat file-name 显示文件内容

    git reset --hard 版本号 回到指定版本

    git reflog 查看历史提交/切换日志,包括:版本号、提交说明


    3.工作区和暂存区

    工作区——>git add ——>暂存区——>git commit——>分支master/版本库
    Git是跟踪修改的,每次修改,如果不用git add到暂存区,那就不能用commit提交到master分支上。

    总结:修改暂存区:命令前加git,eg: git add /git rm
    修改版本库:先修改暂存区,然后统一git commit即可


    4.管理修改

    每次修改,必须先用 git add 到暂存区,然后再 git commit 到版本库中。


    5.撤销修改:

    场景1:只是在工作区修改
    git checkout -- file_name 把文件在工作区的修改全部撤销,使其恢复到最近一次add、commit的状态

    场景2:在工作区修改 + add到暂存区
    git reset HEAD file_name 把文件在暂存区的修改全部撤销,使其恢复到工作区被修改的状态
    git checkout -- file_name

    场景3:在工作区修改 + add到暂存区 + commit(前提:你没有push到远程库)
    git reset --hard HEAD^ 直接退回上一个版本

    6.删除文件:

    1.工作区删除:rm file_name 删除文件夹:rm -r name
    1.暂存区删除:git rm file_name 删除文件夹:同上
    2.版本库中删除:git rm file_name + git commit -m"说明"
    3.将远程库的文件/文件夹删除,但本地保留:
    git rm -r --cached file_name
    git commit -m""
    git push -u origin master

    7.恢复误删的文件:

    场景:文件已提交到版本库,但工作区的误删除了,要恢复
    git checkout -- file_name 用版本区的版本替换工作区的版本


    三、远程仓库

    1.设置SSH Key:本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以要设置SSH Key

    (1).创建SSH Key:过程略
    (2).添加ssh key到GitHub

    2.在GitHub上创建新仓库:略

    3.关联本地库和github仓库:其实就是在本地库使用git命令添加远程主机+远程仓库
    (1) git remote add origin git@github.com:Github用户名/Github仓库名.git
    (2) git remote add origin https://github.com/Github用户名/Github仓库名.git
    优先选用第一种方法,速度快

    git remote add origin git@gitlab.liquidnetwork.com:wanghailin/sklearn.git

    4.将本地库同步/推送到远程库: 将本地库的当前分支与远程库的远程分支关联
    第一次同步:git push -u origin master
    以后的同步:git push origin master

    5.如果远程库是空的,可以直接将本地库的文件push到远程库
    如果远程库非空+远程分支和本地分支相关,需要用git pull origin master先把远程库的最新branch拉到本地库,与本地库的master合并,然后再git push
    如果非空+不相关:git pull合并分支失败,则要用:git pull origin master --allow-unrelated-histories + git push

    6.git push命令的区别:
    (1)git push <远程主机名> <远程分支名>:一般,远程主机名为origin,分支名为master,即git push origin master

    (2)git push -u origin master:将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了

    (3)git push:-u指定了默认主机+默认分支,或者当前分支只追踪一个远程分支,则可以省略主机名+分支名


    5.将远程库克隆到本地库: git clone git@github.com:Github用户名/Github仓库名.git

    NOTE: (1)remote/origin都表示远程主机名
    (2)git clone 不需要git init

    7.git clone、git pull和git fetch的用法及区别:详情见收藏文件夹
    (1)git clone <版本库的url>:
    本地无需git init,直接将远程仓库clone到本地,包括被clone仓库的版本变化
    (2)git pull <远程主机名> <远程分支名>:<本地分支名>
    git pull = git fetch + git merge,即将远程仓库的分支拉取下来与本地当前分支合并,
    (3)git fetch
    更新远程代码到本地仓库,但没有合并



    四、分支管理
    1.理解分支:工作区——> add ——>暂存区——> commit——>分支master/本地版本库——> push ——>远程库
    在开发新功能时,你如果每天都把未完成的新版本都commit到master分支上,会影响master的程序,所以你可 以创建一个新分支,每次都把新版本commit到新分支,待程序完成之后,再将新分支合并到master分支上

    1.1 疑问:只把新版本commit到本地库,不push到远程库,不就行了???等开发完毕,再统一push到远程库???


    2.创建和合并分支:

    git checkout -b dev 创建并切换到dev分支
    相当于两条命令:
    git branch dev 创建分支dev
    git checkout dev 切换到分支dev

    git branch 列出所有分支,并用*标明当前分支

    git add file—name
    git commit -m“说明描述” 此时是在dev分支上提交

    git checkout master 切换到分支master,此时查看文件,添加的内容消失

    git merge dev 将分支dev合并到master

    疑问:合并是求两个分支的并集吗???

    git branch -d dev 删除分支dev



    3.解决冲突:当待合并的两个分支内容相互冲突时,git merge branch_name,显示合并失败

    Cat file_name 查看文件内容,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
    将合并失败的部分修改后,再合并

    git log --graph 查看分支合并图


    4.分支管理策略

    git merge --no-ff -m "commit说明描述" dev ?????

    master分支:应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
    dev分支:干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到 master上,在master分支发布1.0版本;
    个人分支:每个人都有自己的分支,时不时地往dev分支上合并就可以了

    个人理解:master分支上只能创建dev分支,用于干活,其他个人分支都是在dev分支上创建的,也就是说,master分支只和 dev分支相连。


    5.bug分支

    git stash 把当前工作现场“储藏”起来,等以后恢复现场后继续工作

    git checkout master 切换到master分支
    git checkout -b issue-101 建立并切换到bug分支,修复bug
    git add ~
    git commit -m“” 提交
    git checkout master 切换到master分支
    git merge --no-ff -m "merged bug fix 101" issue-101

    git stash list 查看保存的工作现场列表

    git stash apply 恢复保存的工作现场,但stash内容不删除,要用 git stash drop 来删除
    git stash pop 恢复保存的工作现场,同时把stash删除


    个人疑问:
    1.实验证明,在dev分支没有提交的时候,是可以切换到master分支上新建bug分支的。 好像不是???
    2.那为什么不直接切回到master分支上,新建bug分支,修复bug,合并到master,再切回dev分支工作不就行了????
    3.为什么还非要stash一下??意义何在???

    解答: 1.实验证明,在dev分支的修改没有commit/stash的时候,不能切回到master分支上
    2.所以在master上新建bug分支,必须先在dev上stash,才能切回到master分支上
    3.实验证明,在dev分支的修改没有commit/stash的时候,可以在dev分支上新建并切换到新分支


    6.feature分支:

    个人理解:
    1.bug分支<——master分支——>dev分支——>个人分支,一般的,新分支在哪个分支上建立的,删除时就要在其对应的分支上删除。
    2.一般情况下,分支只有被合并后才能删除。如果新分支没有被合并就需要删除,需要强制删除

    git branch -D branch_name 强制删除分支


    7.多人协作

    git remote 查看远程库的信息
    git remote -v 查看远程库更详细的信息

    git push origin branch_name 将分支推送到远程库/同步

    master分支: 是主分支,因此要时刻与远程同步;
    dev分支: 是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
    bug分支: 只用于在本地修复bug,没必要推到远程,修复完毕后直接合并到master分支即可
    feature分支:是否推到远程,取决于你是否和你的小伙伴合作在上面开发。如果feature是个人开发,则不用推送,开发完毕直接合并到 master即可


    git clone git@github.com:Github用户名/Github仓库名.git 抓取远程仓库到本地,默认情况下,抓取后的本地仓库,只能 看到本地的master分支

    git branch 显示只有一个master分支

    git checkout -b dev origin/dev 抓取dev分支到本地:创建并切换到dev分支,且dev分支是 远程库的dev分支

    NOTE: git clone 本地后,先cd到本地仓库后,再抓取dev分支到本地。然后就可以在dev分支上开发,并push到远程

    在dev分支上修改,提交后,push到远程仓库。然后另一个人也同样在本地的dev修改,提交,push到远程.push失败,因为远程仓库包含了本地没有的内容,原因是有其他人push,同步了远程仓库和其他本地库。
    解决方法:先用git pull把最新的提交从origin/dev抓下来,然后在本地merge,解决冲突,在push


    git branch --set-upstream-to=origin/dev dev 设置dev和origin/dev的链接

    git pull git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一 样。解决后,提交,再push


    8.多人协作模式的总结:

    (1)首先,可以试图用git push origin <branch-name>推送自己的修改;

    (2)如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

    (3)如果合并有冲突,则解决冲突,并在本地提交;

    (4)没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

    如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。


    9.Rebase

    git rebase 把本地未push的分叉提交历史整理成一条直线,使其看上去更加的直观




    五、标签管理

    1.理解:每次commit都是一个版本,对应一个版本号,版本号是一连串的数字,不便于交流,所以有了标签/tag
    eg: commit_1 版本号:6a5819e... tag:v1.2

    2.创建标签

    git branch 查看分支
    git checkout branch_name 切换到想打tag的分支

    git tag tag_name 打标签(默认对该分支的最新commit打标签/HEAD)
    git tag tag_name 版本号 对版本号对应的commit打标签
    git tag -a tag_name -m"说明" 版本号 同上,并带有说明

    git tag 查看所有标签

    git show tag_name 查看标签信息,有说明的标签,可以看到说明信息


    3.操作标签

    git push origin tag_name 推送一个本地标签
    git push origin --tags 推送所有未推送过的标签

    删除标签:
    (1)git tag -d tag_name 删除一个本地标签
    (2)git push origin :refs/tags/tage_name 删除一个远程标签



    六、使用GitHub

    别人的github仓库 ——> fork ——> 自己的github仓库 ——> clone ——> 本地仓库 ——> 修改

    别人的github仓库 <—— request <—— 自己的github仓库 <—— push <—— 本地仓库 <——



    七、使用码云

    1.码云:国内的git托管,功能和github相同,但是比github速度快

    2.添加公钥:和github相同

    3.关联: git remote add origin git@gitee.com:Gitee用户名/Github仓库名.git

    但是会显示关联失败,因为本地库learn已经关联到github了

    git remote -v 查看远程库的信息

    解决方法:
    (1)先删除本地库和github的关联,再关联本地库和gitee的远程库
    git remote rm origin 删除本地库和远程库的关联
    git remote add origin git@gitee.com:Gitee用户名/Github仓库名.git 再关联本地库和gitee的远程库

    git remote -v 查看此时的远程库信息

    (2)本地库同时关联两个远程库:github + gitee
    git remote rm origin 删除本地库和远程库的关联
    git remote add github git@github.com:hailin2018/learn.git 关联本地库和github
    git remote add gitee git@gitee.com:hailin2018/learn.git 关联本地库和gitee

    git remote -v 查看此时的远程库信息


    4.push:

    NOTE: remote/origin都表示远程库

    git push origin branch_name 将分支推送到远程库/同步,远程库名称为关联时定义的origin

    git push github master 将master分支推送到github远程库

    git push gitee master 将master分支推送到gitee远程库




    八、自定义Git

    1.git config --global color.ui true 让git显示颜色


    2.忽略特殊性文件:
    问题:有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,每次git status都会显示Untracked files
    办法:(1)在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
    (2)把.gitignore也提交到Git


    3.配置别名/简化命令
    eg:

    git config --global alias.st status 简化 status 为 st
    git config --global alias.ci commit 简化 commit 为 ci
    git config --global alias.br branch 简化 branch 为 br

    git config --global alias.unstage 'reset HEAD'


    4.配置文件

    配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用

    用户的git配置文件在用户主目录(admin)下的一个隐藏文件.gitconfig中
    仓库的Git配置文件都放在.git/config文件中:

    删除别名,直接删除对应的行即可


    5.搭建gig服务器

    在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。

    GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。




































  • 相关阅读:
    SDN第三次作业
    SDN第二次上机作业
    SDN第二次作业
    第七次作业之总结篇
    第八次_计算器重构
    第六次作业之计算器图形界面化
    C++课程 second work _1025
    第五次作业--计算器项目之学习文件读取方式
    C++课程 first work
    第四次作业-计算功能的实现
  • 原文地址:https://www.cnblogs.com/hailin2018/p/13507569.html
Copyright © 2011-2022 走看看