zoukankan      html  css  js  c++  java
  • git 详细的操作指南笔记

    git地址:https://github.com/asd0102433/blog/issues/3
    喜欢的朋友start一下,长期更新文章

    设置

    安装git后我们需要配置一下,告诉git我们的基本信息等等..一般在用户范围内去配置 git ,也就是在 global 范围。

    • global 全局设置

        $ git config --global user.name 'xxxx'
        $ git config --global user.email 'xxxx'

      同时我们可以用 $ git config --list来查看我们的设置,
      如果需要修改重新设置使用

        $ git config --unset --global user.name

      全局范围的配置会保存在当前用户的主目录下面 叫.gitconfig 的文件里面。我们可以使用cat ~/.gitconfig来查看

        $ cat ~/.gitconfig
      设置别名-alias

      通过别名可以简化经常输入的内容,别名的配置也可以在gitconfig里面查看

        git config --global alias.cm commit

      这样当你在commit 的时候 就可以 使用 git cm -m 'xx'来代替了。

    • 全局忽略文件

      有时候我们需要去忽略系统生成的文件比如mac 下的.DS_Store,我们可以在全局设置gitignore

        git config --global core.excludesfile ~/.gitignore_global

      然后在gitignore文件里面写入需要忽略的文件

        .DS_Store

      你可以参考下面的链接来看更多要忽略的文件
      https://gist.github.com/octocat/9257657

      如果在项目中可以创建名为.gitignore,为每个项目配置。具体忽略的文件可以查看上面的链接

      如果你想忽略掉已经跟踪的文件,可以使用 git rm cached选项,再指定一下文件名称,这样可以取消跟踪指定的文件。


    Git 基础命令

    • 初始化Git

      控制和管理项目需要初始化git

        $ git init
    • 查看当前修改 -git status

        $ git status
    • 查看提交的信息 -git log

        $ git log
        $ git log --oneline //显示在一行
        $ git log --oneline --before = '2017-01-01' //显示2017-01-01的提交

      你可以使用git help log 查看更多信息

    • 提交 -git commit

      添加新的文件,或者修改已有的文件,之后使用commit告诉 git 你做了哪些事情。可以使用git log 查看以往的提交。

        $ git commit -m '这里来描述事情'
    • 对比差异 -git diff

      如果你修改了文件,你想查看自己目前修改的了哪些,可以使用

        $ git diff

      如果想跟暂存区里面的文件进行对比(暂存区就是git add 文件),可以用

        $ git diff --staged
    • 重命名,移动 -git mv

      git mv可以重命名或者移动文件和目录

        $ git mv xx1.js xx2.js //重命名
        $ git mv xx1.js js/ //移动文件
        $ git mv js asset/ //移动目录
    • 删除文件 -git rm

        $ git rm fileName

      如果你想删除暂存区的可以使用

        $ git rm --cached fileName
    • 撤销操作 -git amend

      如果提交commit之后发现有遗漏的文件可以使用该命令,具体流程

        $ git conmmit -m "xxx.js"
        $ git add "xxx2.js"
        $ git commit --amend --no-edit

      提交之后你就可以使用git log --name-status提交了哪些文件

    • 修改撤销文件 -git checkout

      比如你删除了index.html,使用以下命令恢复文件,也可以恢复之前修改过的

            git checkout  -- index.html 
    • 取消已经commit的文件 -git revert

      假如你的项目已经commit了,可以用到该命令恢复到指定的commit。
      第一步 git log --oneline

        5c422a3 add html
        6804500 Delete a.css

      第二步

        $ git reset id  //id 是指上面commit 的id

      git reset 有3个选项,
      --soft 不会影响到工作目录还有暂存区里的东西
      --hard 工作目录,暂存区直接重置到指定的提交状态
      --mixed 默认选项,会把暂存区里的东西重置到指定提交状态,并且指针指向这个提交。

      一般情况下如果你发现你的commit文件是有bug的你还需要修改文件,就用默认的mixed,hard 会重置文件的内容到指定的commit。

    • 保存修改恢复进度文件 -git stash

      stath 可以让工作进度先保存起来,需要用到的时候在恢复。

        场景: 你修改文件1.js ,然后你add file后你暂时不想跟后面的文件一起commit,可以先储存起来
      
        $ git stash save "这里可以是说明"

      查看保存的进度,或者显示进度的目录

        $ git stash list
        $ git stash show -p stash@{..}

      恢复进度

        $ git stash apply stash@{..}

      删除不需要的进度

        $ git stash drop 或者 后面跟上stash@{..}代号

    分支branch

    Git 分支 - 何谓分支

    • 查看,创建项目分支

        $ git branch
        $ git checkout -b [name_new_branch] 
    • 删除分支

        $ git branch -d [name_branch] 
    • 切换分支

        $ git checkout [branch-name]
    • 对比分区的区别

        $ git checkout branch
    • 分区合并

        $ git merge [your_branch]

      注意的是你要如果你合并master ,首先需要切换到master 分支下

    • 分区对比

        $ git diff [branch]..[branch]
    • 重命名branch

        $ git branch -m [branch] [new_name_branch]

    远程 remote

    • 添加远程地址

        $ git remote add origin [git_address]
    • 分支推送到远程的版本

        $ git push origin master

    具体很多细节去多看看深入的实战


    git log 命令支持选项参考这里

    选项说明
    -p 按补丁格式显示每个更新之间的差异
    --word-diff 按 word diff 格式显示差异。
    --stat 显示每次更新的文件修改统计信息。
    --shortstat 只显示 --stat 中最后的行数修改添加移除统计。
    --name-only 仅在提交信息后显示已修改的文件清单。
    --name-status 显示新增、修改、删除的文件清单。
    --abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
    --graph 显示 ASCII 图形表示的分支合并历史。
    --relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
    --pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。
    --oneline --pretty=oneline --abbrev-commit 的简化用法。

    更多的深入了解可以去git api查看
    参考
    git 官网
    5.2 代码回滚:Reset、Checkout、Revert的选择
    git 中文
    Create a new branch with git and manage branches

    git resetgit checkoutgit revert是你的Git工具箱中最有用的一些命令。它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件。

    因为它们非常相似,所以我们经常会搞混,不知道什么场景下该用哪个命令。在这篇文章中,我们会比较git resetgit checkoutgit revert最常见的用法。希望你在看完后能游刃有余地使用这些命令来管理你的仓库。

    Git repo的主要组成

    Git仓库有三个主要组成——工作目录,缓存区和提交历史。这张图有助于理解每个命令到底产生了哪些影响。当你阅读的时候,牢记这张图。

    提交层面的操作

    你传给git resetgit checkout的参数决定了它们的作用域。如果你没有包含文件路径,这些操作对所有提交生效。我们这一节要探讨的就是提交层面的操作。注意,git revert没有文件层面的操作。

    Reset

    在提交层面上,reset将一个分支的末端指向另一个提交。这可以用来移除当前分支的一些提交。比如,下面这两条命令让hotfix分支向后回退了两个提交。

    git checkout hotfix
    git reset HEAD~2
    

    hotfix分支末端的两个提交现在变成了悬挂提交。也就是说,下次Git执行垃圾回收的时候,这两个提交会被删除。换句话说,如果你想扔掉这两个提交,你可以这么做。reset操作如下图所示:

    把hotfix分支reset到HEAD~2

    如果你的更改还没有共享给别人,git reset是撤销这些更改的简单方法。当你开发一个功能的时候发现『糟糕,我做了什么?我应该重新来过!』时,reset就像是go-to命令一样。

    除了在当前分支上操作,你还可以通过传入这些标记来修改你的缓存区或工作目录:

    • --soft – 缓存区和工作目录都不会被改变
    • --mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
    • --hard – 缓存区和工作目录都同步到你指定的提交

    把这些标记想成定义git reset操作的作用域就容易理解多了。

    git rese的定义域

    这些标记往往和HEAD作为参数一起使用。比如,git reset --mixed HEAD 将你当前的改动从缓存区中移除,但是这些改动还留在工作目录中。另一方面,如果你想完全舍弃你没有提交的改动,你可以使用git reset --hard HEAD。这是git reset最常用的两种用法。

    当你传入HEAD以外的其他提交的时候要格外小心,因为reset操作会重写当前分支的历史。正如Rebase黄金法则所说的,在公共分支上这样做可能会引起严重的后果。

    Checkout

    你应该已经非常熟悉提交层面的git checkout。当传入分支名时,可以切换到那个分支。

    git checkout hotfix
    

    上面这个命令做的不过是将HEAD移到一个新的分支,然后更新工作目录。因为这可能会覆盖本地的修改,Git强制你提交或者缓存工作目录中的所有更改,不然在checkout的时候这些更改都会丢失。和git reset不一样的是,git checkout没有移动这些分支。

    将 HEAD 从 master 移到 hotfix

    除了分支之外,你还可以传入提交的引用来checkout到任意的提交。这和checkout到另一个分支是完全一样的:把HEAD移动到特定的提交。比如,下面这个命令会checkout到当前提交的祖父提交。

    git checkout HEAD~2
    

    将HEAD移动到任意commit

    这对于快速查看项目旧版本来说非常有用。但如果你当前的HEAD没有任何分支引用,那么这会造成HEAD分离。这是非常危险的,如果你接着添加新的提交,然后切换到别的分支之后就没办法回到之前添加的这些提交。因此,在为分离的HEAD添加新的提交的时候你应该创建一个新的分支。

    Revert

    Revert撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。比如,下面的命令会找出倒数第二个提交,然后创建一个新的提交来撤销这些更改,然后把这个提交加入项目中。

    git checkout hotfix
    git revert HEAD~2
    

    如下图所示:

    revert到倒数第二个commit

    相比git reset,它不会改变现在的提交历史。因此,git revert可以用在公共分支上,git reset应该用在私有分支上。

    你也可以把git revert当作撤销已经提交的更改,而git reset HEAD用来撤销没有提交的更改。

    就像git checkout 一样,git revert 也有可能会重写文件。所以,Git会在你执行revert之前要求你提交或者缓存你工作目录中的更改。

    文件层面的操作

    git resetgit checkout 命令也接受文件路径作为参数。这时它的行为就大为不同了。它不会作用于整份提交,参数将它限制于特定文件。

    Reset

    当检测到文件路径时,git reset 将缓存区同步到你指定的那个提交。比如,下面这个命令会将倒数第二个提交中的foo.py加入到缓存区中,供下一个提交使用。

    git reset HEAD~2 foo.py
    

    和提交层面的git reset一样,通常我们使用HEAD而不是某个特定的提交。运行git reset HEAD foo.py 会将当前的foo.py从缓存区中移除出去,而不会影响工作目录中对foo.py的更改。

    将一个文件从commit历史中移动到stage缓存中

    --soft、--mixed和--hard对文件层面的git reset毫无作用,因为缓存区中的文件一定会变化,而工作目录中的文件一定不变。

    Checkout

    Checkout一个文件和带文件路径git reset 非常像,除了它更改的是工作目录而不是缓存区。不像提交层面的checkout命令,它不会移动HEAD引用,也就是你不会切换到别的分支上去。

    将文件从提交历史移动到工作目录中

    比如,下面这个命令将工作目录中的foo.py同步到了倒数第二个提交中的foo.py。

    git checkout HEAD~2 foo.py
    

    和提交层面相同的是,它可以用来检查项目的旧版本,但作用域被限制到了特定文件。

    如果你缓存并且提交了checkout的文件,它具备将某个文件回撤到之前版本的效果。注意它撤销了这个文件后面所有的更改,而git revert 命令只撤销某个特定提交的更改。

    git reset 一样,这个命令通常和HEAD一起使用。比如git checkout HEAD foo.py等同于舍弃foo.py没有缓存的更改。这个行为和git reset HEAD --hard很像,但只影响特定文件。

    总结

    你现在已经掌握了Git仓库中撤销更改的所有工具。git resetgit checkout、和 git revert命令比较容易混淆,但当你想起它们对工作目录、缓存区和提交历史的不同影响,就会容易判断现在应该用哪个命令。

    下面这个表格总结了这些命令最常用的使用场景。记得经常对照这个表格,因为你使用Git时一定会经常用到。

    命令作用域常用情景
    git reset 提交层面 在私有分支上舍弃一些没有提交的更改
    git reset 文件层面 将文件从缓存区中移除
    git checkout 提交层面 切换分支或查看旧版本
    git checkout 文件层面 舍弃工作目录中的更改
    git revert 提交层面 在公共分支上回滚更改
    git revert 文件层面 (然而并没有)
  • 相关阅读:
    从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
    EF增删改查操作
    将String转化成Stream,将Stream转换成String, C# Stream 和 byte[] 之间的转换(文件流的应用)
    解决远程主机关闭了连接错误(正在中止线程)
    手动爆库详细流程以及语句解析
    asp.net 中将汉字转换成拼音
    jdk1.6下使用sardine和jackrabbit-webdav的问题
    模式匹配-BF算法
    git项目创建
    main thread starting…
  • 原文地址:https://www.cnblogs.com/libin-1/p/6551626.html
Copyright © 2011-2022 走看看