Git学习笔记


  • 创建版本库

    1.创建目录 mkdir learngit,进入cd learngit

    2.将目录变成Git可以管理的仓库git init,此时Git仓库就建好了,可以通过ls -ah来查看

  • 常用的git命令及解释

    1.git init 初始化Git管理仓库

    2.git add file文件添加到仓库

    3.git commit -m "添加的注释" 提交

    4.git status 查看add之后未commit的文件

    5.git diff 查看上一步的区别

    6.git log --pretty=oneline 查看版本历史,后面参数可以单行查看,显示更加清晰

    7.git reset --hard commit_id版本回退

    8.git checkout -- readme.txt

    把readme.txt文件在工作区的修改全部撤销,就是让这个文件回到最近一次git commitgit add时的状态。例如:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。或者当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,先git reset HEAD file,就回到了场景1,第二步按场景1操作。

    9.git rm test.txt并且git commit删除。

    10.git remote add origin git@github.com:michaelliao/learngit.git添加远程仓库。

    11.git push -u origin master

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

    12.git push origin master本地提交之后就可以远程推送。

    13.git clone git@github.com:michaelliao/gitskills.git从远程库克隆,首先远程库创建仓库gitskills

    14.git checkout -b dev创建并切换分支相当于git branch devgit checkout dev

    15.git branch 查看分支情况,当前分支有星号。

    16.git merge
    合并指定分支到当前分支,当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。git status可以查看冲突情况

    17.git branch -d dev删除分支。

    18.git checkout name切换分支。

    19.git log --graph --pretty=oneline --abbrev-commit查看分支情况。

    20.git merge --no-ff -m "merge with no-ff" dev
    不使用Fast forward合并模式,因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去


    21.git stash将当前的工作现场储存起来等以后恢复现场继续工作。

    场景:当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交,并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

    a、git stash暂存。

    b、git status确认工作区是干净的。

    c、决定在master分支上解决git branch master

    d、git checkout -b issu-101创建临时分支

    e、修复bug,然后提交文件git add file..

    f、修复完成后,切换到master分支,合并,删除issu-101分支

    g、回到dev分支继续干活git checkout dev

    h、git stash list查看暂存

    i、git stash apply恢复,但是恢复后,stash内容并不删除

    j、git stash drop删除

    k、git stash pop恢复并删除stash

    22.git checkout -b feature-vulcan

    软件开发中,总有无穷无尽的新的功能要不断添加进来。
    添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。

    23.git branch -D <name>强行删除


    24.git remote -v查看远程仓库

    25.git push origin branch-name从本地推送分支

    26.git pull远程抓取分支

    27.git checkout -b branch-name origin/branch-name在本地创建和远程分支对应的分支

    28.git branch --set-upstream branch-name origin/branch-name建立本地分支和远程分支的关联


    29.git tag v1.1给当前分支的最新提交的commit上打一个标签

    30.git tag查看所有标签

    31.git tag v0.9 6224937给某个commit_id打上标签

    32.git show tagname查看标签信息

    33.git tag -a v0.1 -m "version 0.1 released" 3628164 创建带有说明的标签,用-a指定标签名,-m指定说明文字

    34.git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;

    35.git tag -d v0.1删除标签

    36.git push origin v1.0推送某个标签到远程

    37.git push origin --tags一次性推送全部尚未推送到远程的本地标签

    38.git tag -d v0.9先从本地删除

    39.git push origin :refs/tags/v0.9从远程删除


    40.git config --global color.ui true文件名就会标上颜色


    41.git check-ignore查找哪个规则写错了,忽略文件时需要添加.gitignore文件,所有配置文件可以直接在线浏览:<a href="https://github.com/github/gitignore">传送门</a>


    42.git config --global alias.st status配置别名,告诉Git,以后st就表示status

    43.git config --global alias.unstage 'reset HEAD'此时 git unstage test.py相当于git reset HEAD test.py

    44.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 log估计会很爽...

  • 多人协作

    a、可以试图用git push origin branch-name推送自己的修改;

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

    c、如果合并有冲突,则解决冲突,并在本地提交;

    d、没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

    如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。这就是多人协作的工作模式,一旦熟悉了,就非常简单。

  • 标签

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,
    就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的
    版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是
    版本库的一个快照。tag就是一个让人容易记住的有意义的名字,它跟
    某个commit绑在一起

  • 注意

    1.git loggit reflog的区别:

    前者回退版本之后,此版本之后的记录就自动抹除了,而后者不会,可以查到所有的记录。

    2.git diffgit diff --cache的区别:

    前者是是工作区(work dict)和暂存区(stage)的比较,而后者是暂存区(stage)和分支(master)的比较。

    3.合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

    4.忽略文件的原则是:
    忽略操作系统自动生成的文件,比如缩略图等;
    忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通 过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比 如Java编译产生的.class文件;
    忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

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

    a、每个仓库的Git配置文件都放在.git/config文件中
    b、当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig

  • 概念

    工作区:就是建立的文件夹仓库learngit

    版本库:工作区的隐藏的.git文件夹

    暂存区:版本库里的最重要的部分,git add添加的位置

    分支:git自动为我们创建的为master,还有一个指向master的指针HEAD,git commit提交的位置

    如下图:

    工作区与缓存区

分布式VS集中式:</br>
  分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

推荐阅读更多精彩内容

  • 学习资料pro git[https://git-scm.com/book/zh/v2]git - 简明指南[htt...
    合肥黑阅读 14,083评论 1 20
  • Git教程 一、Git简介 1.1. Git的诞生1.2.集中式的vs分布式 二、安装Git 三、创建版本库 四、...
    曹渊说创业阅读 562评论 0 2
  • git学习笔记 声明 本文是本人学习Git过程中所做的笔记,以便日后查阅,文中多有错漏之处,不建议用作学习材料,文...
    sayonara_yoyo阅读 331评论 0 1
  • 书《一个广告人的自白》 作者:大卫·奥格威 昨天的晨读分享说的是如何将所要做的事情做好并能培养出习惯;今天...
    思悦澄心阅读 103评论 0 1
  • 前不久参加一次朋友的聚会,席间见到了多年不见的老友峰,一直愁容满面,沉默寡言。原来他见别的同学都买了房买了车,而自...
    冰叶草阅读 176评论 2 2
  • 大学中的各种课程基本都是开放的,也就是说只要你能出入大学基本就能在大学里听任意你想听的课。这就是所谓的蹭课,据此我...
    瑜yuon阅读 158评论 0 0
  • 古老的敌意这个话题,出自于里尔克的一首诗歌,诗歌读得很早己经完全忘记了。可是当此一诗语句再次被当代诗人北岛重新提起...
    诗哲魂阅读 923评论 2 3