Git相关
Git 快速入门
参考此链接https://www.liaoxuefeng.com/wiki/896043488029600
或者 https://www.yiibai.com/git/git_rebase.html
Git 区域的划分与提交回滚
区域划分
分为工作区,本地库(暂存区和分支),远程库。
工作区:分为原文件和已经修改但是未暂存的文件。
暂存区:存放已经 git add 添加后的文件,此区位于本地库。
分支:存放已经 git commit 提交后的文件,此区位于本地库
远程库:存放已经 git push 后的文件。
修改本地已被跟踪文件,文件进入未暂存区域。
未暂存区域转到暂存区域 git add files
暂存区提交到本地仓库 git commit -m
直接从未暂存区提交到本地仓库
git commit -am
经测试,对已跟踪的文件可以正确执行,而对于未跟踪文件(即新增文件)则会出错本地库回退到暂存区
git reset –soft hash 值
git reset –soft origin/master
一般回退到暂存区的文件作排查用,不要直接修改,不然会同时出现在暂存区和未暂存区(其实即使修改了也木有太大关系)本地库回退到未暂存区
git reset –mixed hash 值
git reset –mixed origin/master
一般回退到未暂存状态就是为了进一步的修改本地库回退到文件初始状态(即此版本的)
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暂存区回退到未暂存区
git reset – files
git rest
撤销所有暂存区的文件未暂存区回退到文件初始状态
git checkout – files暂存区回退到文件初始状态
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
HEAD
这要从 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 | git fetch --all |
未 commit 先 pull,视本地修改量选择 revert 或 stash
- 本地修改量小。
-> revert(把自己的代码取消) -> 重新pull -> 在最新代码上修改 -> [pull确认最新] -> commit&push
- 本地修改量大。
-> stash save(把自己的代码隐藏存起来) -> 重新pull -> stash pop(把存起来的隐藏的代码取回来 ) -> 代码文件会显示冲突 -> 右键选择resolve conflict -> 打开文件解决冲突 ->commit&push
git stash 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。
- 本地修改量小。
已 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 之后的修改都会被删除