zoukankan      html  css  js  c++  java
  • Git笔记

    Git笔记

    一:知识点

    1 Githug游戏通关流程-简书 :http://www.jianshu.com/p/482b32716bbe

    有几个概念:

    (1)Woking directory (对应changes not staged for commited)

    (2)Staging area (对应changes to be commited)

    (3)Repository

    关于reset&checkout&revert

    (1)用法:git reset HEAD 文件名,git checkout 文件名

    应用情景:两个文件都被添加到staging area但是只想提交其中一个。

    若使用reset一般情况下就是(1)Woking directory覆盖(2)Staging area 

    而在(1)Woking directory中未修改时,则和checkout相同是(2)Staging area覆盖(1)Woking directory

    (2)用法:

    git reset —hard 直接将上一次修改抛弃

    git  reset —soft 上一次修改放入(2)Staging area

    git reset —mixed 上一次修改放入(1)Woking directory

    git revert HEAD^1 (可选择要撤销的提交)只是撤销当前提交,之后的提交还会保留

    (3)用法:git checkout commit id(reflog得到)

    应用情景:可以恢复误操作

    2 git使用简明指南:http://rogerdudler.github.io/git-guide/index.zh.html

    三个工作树:工作区/index/HEAD

    3 git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了fix 一个紧急的bug,  先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作。

    基础命令:

    $git stash

    $do some work

    $git stash pop

    4 git的文件状态

    状态1:

    Untracked files:

      (use "git add <file>..." to include in what will be committed)

            .DS_Store

            BAFParking/

    nothing added to commit but untracked files present (use "git add" to track)

    操作1:

    git add BAFParking

    状态2:

    Changes to be committed: //意思是在暂存区域生成了快照,等待被提交。注意,只有这个区域的文件才会被提交

      (use "git reset HEAD <file>..." to unstage)

            new file:   BAFParking

    Changes not staged for commit:

      (use "git add <file>..." to update what will be committed)

      (use "git checkout -- <file>..." to discard changes in working directory)

      (commit or discard the untracked or modified content in submodules)

            modified:   BAFParking (modified content, untracked content)

     Untracked files:

      (use "git add <file>..." to include in what will be committed)

             .DS_Store

    Git在未进行commit操作之前,存在三种状态:Untracked files,Changes not staged for commit及Changes to be committed,每种状态之间可以随意进行互相转换。了解这三种状态各自所对应的不同情况,能够帮助你方便有效的使用Git来管理项目。

    5 关于.DS_Store?

    存储文件夹的显示属性,譬如摆放位置等。

    删除 .DS_Store

    如果你的项目中还没有自动生成的 .DS_Store 文件,那么直接将 .DS_Store 加入到 .gitignore 文件就可以了。如果你的项目中已经存在 .DS_Store 文件,那就需要先从项目中将其删除,再将它加入到 .gitignore。如下:

    删除项目中的所有.DS_Store。这会跳过不在项目中的 .DS_Store
    1.find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
    将 .DS_Store 加入到 .gitignore
    2.echo .DS_Store >> ~/.gitignore
    更新项目
    3.git add --all
    4.git commit -m '.DS_Store banished!'

    如果你只需要删除磁盘上的 .DS_Store,可以使用下面的命令来删除当前目录及其子目录下的所有.DS_Store 文件:

    find . -name '*.DS_Store' -type f -delete。

    禁止.DS_store生成:

    defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE

    恢复.DS_store生成:
    defaults delete com.apple.desktopservices DSDontWriteNetworkStores

    .gitignore文件用于忽略文件,其规范如下:(.gitignore文件可根据团队情况或是个人喜好可提交可不提)

    1.所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
    2.可以使用标准的 glob 模式匹配。
    3.匹配模式最后跟反斜杠(/)说明要忽略的是目录。
    4.要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

    glob模式要点:

    1. *:任意个任意字符, 
    2. []:匹配任何一个在方括号中的字符, 
    3. ?:匹配一个任意字符, 
    4. [0-9]:匹配字符范围内所有字符

    所以,我们只需要在对应的Git目录下,创建一个.gitignore文件,然后配置上.DS_Store即可,步骤如下:
    1.命令行下使用touch .gitignore创建.gitignore文件(已有的直接到第二步)
    wdw:test wdw$ touch .gitignore
    2.open .gitignore,输入.DS_Store 换行再输入*/.DS_Store

    3.保存即可生效,这里是忽略了当前目录的.DS_Store以及其子目录的.DS_Store 

    这样问题就解决了么?并没有,因为在今后的使用中,我发现我需要在所有Git目录下加这样的.gitignore配置,心都操碎了。有没有办法可以全局配置呢?让这个配置对所有的Git目录都生效。git config可以帮到我们。

    git config --list命令可以让你查看现有的配置,(在这里我们就先忽略其他的配置项了,有兴趣的同学可以戳这里做更多的了解)实际上它是一个文件,文件的位置在用户根目录,名称是.gitconfig。以下是添加全局忽略文件的步骤:

    1. 创建~/.gitignore_global文件,把需要全局忽略的文件写入该文件,语法和.gitignore一样
    2. ~/.gitconfig中引入.gitignore_global文件
      [core] 
      excludesfile = /Users/reon/.gitignore_global 
      也可以通过git config --global core.excludesfile/Users/reon/.gitignore_global命令来实现 
    3. 配置成功,可以去验证是否生效了 

    到这里,忽略文件的操作已经搞定了.

    6 从git中删除指定的文件和目录

    $ git rm -r 我的文件夹/

    此处-r表示递归所有子目录,如果你要删除的,是空的文件夹,此处可以不用带上-r。或是删除的是文件也不带r。

    提交代码 

    $ git commit -m"我的修改"

    git - 移除文件以及取消对文件的跟踪

    要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

    如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 “Changes not staged for commit” 部分(也就是未暂存清单)看到:

    $ rm grit.gemspec

    $ git status

    On branch master

    Changes not staged for commit:

      (use "git add/rm <file>..." to update what will be committed)

      (use "git checkout -- <file>..." to discard changes in working directory)

            deleted:    grit.gemspec

    no changes added to commit (use "git add" and/or "git commit -a")

    然后再运行 git rm 记录此次移除文件的操作:

    $ git rm grit.gemspec

    rm 'grit.gemspec'

    $ git status

    On branch master

    Changes to be committed:

      (use "git reset HEAD <file>..." to unstage)

            deleted:    grit.gemspec

    最后提交的时候,该文件就不再纳入版本管理了。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。

    另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可:

    $ git rm --cached readme.txt

    后面可以列出文件或者目录的名字,也可以使用 glob 模式。比方说:

    $ git rm log/*.log

    注意到星号 * 之前的反斜杠 ,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜杠。)。此命令删除所有 log/ 目录下扩展名为 .log 的文件。类似的比如:

    $ git rm *~

    会递归删除当前目录及其子目录中所有 ~ 结尾的文件。

    取消对文件的跟踪还有一个命令:git update-index --assume-unchanged <取消跟踪的文件>
    注:该命令只能取消提交到暂存区之前的文件,可以先用git reset <文件名>将暂存区的文件回退到暂存区之前,然后再取消跟踪。

    7 git中的撤销操作(撤销修改,撤销新建,撤销add,撤销commit)

    撤销对文件的修改

    如你修改了文件,但是不想保存对文件的修改。(not staged for commit)

    根据具体情况,你可以选择执行下面的命令:

    git checkout -- <文件名>  #撤销对某个文件的修改

    git checkout -- .  #撤销对所有文件的修改

    删除新建的文件

    如下图所示的情况,注意"Untracked files"提示,你新建了文件,但是想删除掉新建的文件。

    根据具体情况,你可以选择执行下面的命令:

    git clean -f   #删除 untracked files

    git clean -fd  #连 untracked 的目录也一起删掉  

    git clean -n  #在用上述 git clean前,强烈建议先执行git clean -n 看看会删掉哪些文件,防止重要文件被误删

    不过你也可以直接简单粗暴,手动删除或者执行window的rm命令,删除文件,不过执行git rm命令是没法做到的,必须先add,然后执行git rm -f <文件名>强制删除文件。。。。

    撤销暂存区文件

    如你想撤销add命令添加到暂存区的文件。(changes to be commited)

    根据具体情况,你可以选择执行下面的命令:

    git reset head <文件名>   #撤销对某个文件的add命令

    git reset head .  #撤销所有文件的add命令

    撤销已暂存的文件:

    你想撤销commit命令,你可以执行下面的命令:

    git log  #先执行这条命令查看commit的历史

    git reset --hard <commit_id> #跳到某次commit

     撤销之后,由于本地版本低于线上版本,想要提交代码,只能强行提交,覆盖线上,可以使用下面的命令:

    git push -f origin 分支名

    注意:

    1. 命令行中的空格
    2. 其实上面的命令,在Git的命令行窗口中差不多都有提示。

    二:遇到的问题

    注意提交用代码

    git commit -a -m"first commit" 

    三 未读的博客

    1 读懂diff:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html

    2 checkout命令详解:http://www.cnblogs.com/hutaoer/archive/2013/05/07/git_checkout.html?utm_source=tuicool&utm_medium=referral

    3 廖雪峰git教程 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

    4 深入理解git工作流:http://www.jianshu.com/p/91acec85c3a4

    5 git忽略规则.gitignore处理:http://www.cnblogs.com/kevingrace/p/5690241.html

    6 vim 保存退出:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html

    7 初次运行git前的配置gitcofig有关:https://git-scm.com/book/zh/v1/起步-初次运行-Git-前的配置

    小结:

    1.git init      -------创建空的版本库;

    2.git add       -------添加文件到暂存区;

    3.git commit      -------提交文件到版本库(仓库);

    4.git status      -------查看相关状态;

    5.git diff      -------查看具体修改的内容;

    6.git log      -------查看提交历史记录;

    7.git reset      -------回到上一版本;

    8.git reflog      -------查看命令历史记录;

    9.git checkout      -------丢弃工作区的修改;

    10.git rm      -------删除文件;

  • 相关阅读:
    mysql逻辑架构
    delete与truncate的区别
    mycat
    mycat
    MyCat数据库中间件
    mysql主从复制
    docker学习笔记之快速安装
    linux学习笔记之CentOS7系统快速安装
    Redis学习笔记
    双绞线的种类与型号
  • 原文地址:https://www.cnblogs.com/encoreMiao/p/6698238.html
Copyright © 2011-2022 走看看