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 文件层面 (然而并没有)
posted @ 2017-03-15 00:52  最骚的就是你  阅读(421)  评论(0编辑  收藏  举报