Git相关

Git 快速入门

参考此链接https://www.liaoxuefeng.com/wiki/896043488029600 或者 https://www.yiibai.com/git/git_rebase.html

Git 区域的划分与提交回滚

区域划分

分为工作区,本地库(暂存区和分支),远程库。
工作区:分为原文件和已经修改但是未暂存的文件。
暂存区:存放已经 git add 添加后的文件,此区位于本地库。
分支:存放已经 git commit 提交后的文件,此区位于本地库
远程库:存放已经 git push 后的文件。

  1. 修改本地已被跟踪文件,文件进入未暂存区域。

  2. 未暂存区域转到暂存区域 git add files

  3. 暂存区提交到本地仓库 git commit -m

  4. 直接从未暂存区提交到本地仓库
    git commit -am
    经测试,对已跟踪的文件可以正确执行,而对于未跟踪文件(即新增文件)则会出错

  5. 本地库回退到暂存区
    git reset –soft hash 值
    git reset –soft origin/master
    一般回退到暂存区的文件作排查用,不要直接修改,不然会同时出现在暂存区和未暂存区(其实即使修改了也木有太大关系)

  6. 本地库回退到未暂存区
    git reset –mixed hash 值
    git reset –mixed origin/master
    一般回退到未暂存状态就是为了进一步的修改

  7. 本地库回退到文件初始状态(即此版本的)
    git reset –hard hash 值
    注意这里,通常先执行一次 fetch,保证本地版本是 origin 的最新版本,然后再回退。(最厉害的是,这么操作不会有冲突,直接让文件变成和 origin 保持一致)
    git fetch origin
    git reset –hard origin/master
    特别注意:这么操作会使你对文件的修改全部消失,还原成最初状态。
    (针对上一条情况衍生讲解)通常在推送到 origin 时,先要 pull,然后再推送,一般是修改提交了的文件和 pull 下来的同一个文件产生冲突(所以建议修改代码前,一定先要 pull)
    git pull
    git push origin master

  8. 暂存区回退到未暂存区
    git reset – files
    git rest
    撤销所有暂存区的文件

  9. 未暂存区回退到文件初始状态
    git checkout – files

  10. 暂存区回退到文件初始状态
    git checkout head – files

换一个角度看

  • 从工作区一直到远程仓库的过程是:git add files,git commit, git push.
  • 从远程仓库到工作区的过程是:git fetch/git clone/git pull,git reset – files, git checkout – files。
    files 是指文件名。

git reset

  • git reset –soft,重置位置的同时,保留 working Tree 工作目录和 index 暂存区的内容,只让 repository 中的内容和 reset 目标节点(reset 目标节点是指 reset 命令执行后,head 所指向的节点,或者说 commit 记录)保持一致,因此原节点和 reset 节点之间的【差异变更集】会放入 index 暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和 Reset 节点之间的所有差异都会放到暂存区中。
  • git reset –mixed,重置位置的同时,只保留 Working Tree 工作目录的內容,但会将 Index 暂存区 和 Repository 中的內容更改和 reset 目标节点一致,因此原节点和 Reset 节点之间的【差异变更集】会放入 Working Tree 工作目录中。所以效果看起来就是原节点和 Reset 节点之间的所有差异都会放到工作目录中。
  • git reset –hard,重置位置的同时,直接将 working Tree 工作目录、 index 暂存区及 repository 都重置成目标 Reset 节点的內容,所以效果看起来等同于清空暂存区和工作区。可以使用 **git reset –hard HEAD^ 来回退到上一次 commit 的状态。
    此命令可以用来回退到任意版本:git reset –hard commitid **
  • git reset,用来从暂存区撤销上一次 git add 添加的修改内容。可以使用 git reset HEAD filepathname (比如: git reset HEAD readme.md)来放弃指定文件的缓存,放弃所有的缓存可以使用 git reset HEAD . 命令。不影响工作区中的内容。
    git reset 详细解释可以参看,https://www.jianshu.com/p/c2ec5f06cf1a

git checkout

这要从 git 的分支说起,git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。git 是如何知道你当前在哪个分支上工作的呢?
其实答案也很简单,它保存着一个名为 HEAD 的特别指针。在 git 中,它是一个指向你正在工作中的本地分支的指针,可以将 HEAD 想象为当前分支的别名。

git diff

git 的四个工作区

git diff:是查看 workspace(工作区) 与 index(暂存区) 的差别的。
git diff –cached:是查看 index(暂存区) 与 local repositorty(本地仓库) 的差别的。
git diff HEAD:是查看 workspace 和 local repository 的差别的。(HEAD 指向的是 local repository 中最新提交的版本)

注:git diff 后跟两个参数,如果只写一个参数,表示默认跟 workspace 中的代码作比较。git diff 显示的结果为 第二个参数所指的代码在第一个参数所指代码基础上的修改。如,git diff HEAD 表示 workspace 在 最新 commit 的基础上所做的修改

比较工作区与暂存区

比较本地库的当前版本和上一次版本

git pull 时冲突了怎么办

  1. 忽略本地修改,强制拉取远程到本地
1
2
3
4
5
git fetch --all

git reset --hard origin/dev

git pull
  1. 未 commit 先 pull,视本地修改量选择 revert 或 stash

    • 本地修改量小。-> revert(把自己的代码取消) -> 重新pull -> 在最新代码上修改 -> [pull确认最新] -> commit&push
    • 本地修改量大。-> stash save(把自己的代码隐藏存起来) -> 重新pull -> stash pop(把存起来的隐藏的代码取回来 ) -> 代码文件会显示冲突 -> 右键选择resolve conflict -> 打开文件解决冲突 ->commit&push
      git stash 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。
  2. 已 commit 未 push,视本地修改量选择 reset 或直接 merge

    • 修改量小。-> reset(回退到未修改之前,选hard模式,把自己的更改取消) -> 重新pull -> 在最新代码上修改 -> [pull确认最新] -> commit&push
    • 修改量大。-> commit后pull显示冲突 -> 手动merge解决冲突 -> 重新commit -> push

git revert 和 reset 的区别

git revert 和 git reset 的区别

  • git revert 是用一次新的 commit 来回滚之前的 commit,此次提交之前的 commit 都会被保留;
  • git reset 是回到某次提交,提交及之前的 commit 都会被保留,但是此 commit id 之后的修改都会被删除