参考:
https://git-scm.com/book/zh/v1
https://www.cnblogs.com/smuxiaolei/p/7484678.html
https://www.cnblogs.com/lianghe01/p/5846525.html
git一共有四个区:本地工作区(随时更新工作的区域)、暂存区(git add)、本地仓库区(git commit),远程仓库区(git push)
在初始化git版本库之后会生成一个隐藏的文件 .git ,可以将该文件理解为git的版本库 repository,而我们自己建立的项目文件夹即工作区 working directory ,在.git 文件夹里面还有很多文件,其中有一个index 文件 就是暂存区也可以叫做 stage ,git还为我们自动生成了一个分支master以及指向该分支的指针head ,如下图
git init 初始化新仓库,初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。)
请记住,工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪。已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。未跟踪的文件意味着Git在之前的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围。
在编辑过某些文件之后,Git 将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件,如此重复。
git checkout –b [branch-name] 创建并切换分支,相当于如下2条命令:git branch dev git checkout dev
git diff 比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起 来的变化内容。
git commit
-a Git 就会自动把所有已经跟踪过的文件暂存起来一并提交
只要在 “Changes to be committed” 这行下面的,就说明是已暂存状态。如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中。
其实 git add 的潜台词就是把目标文件快照放入暂存区域,也就是 add file into staged area,同时未曾跟踪过的文件标记为需要跟踪。
第一种是:把当前的版本回退到上一个版本, git reset --hard HEAD^ ;如果要回退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此类推。
那如果要回退到前100个版本的话,使用上面的方法肯定不方便,我们可以使用下面的简便命令操作:git reset --hard HEAD~100 即可。
第二种是 git reset --hard 版本号 (版本号通过git reflog 获取)
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<
>>>>fenzhi1 是指fenzhi1上修改的内容当你从远程库克隆时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin。
一般情况下,那些分支要推送呢?
master分支是主分支,因此要时刻与远程同步。
一些修复bug分支不需要推送到远程去,可以先合并到主分支上,然后把主分支master推送到远程去。
1.有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。可以这样:
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
2.如何取消暂存区域中的文件
git reset HEAD
git checkout -- file 丢弃工作区的修改。即取消修改,回到之前的状态(也就是修改之前的版本)。在用这条命令前,请务必确定真的不再需要保留刚才的修改。
记住,任何已经提交到 Git 的都可以被恢复。即便在已经删除的分支中的提交,或者用 --amend
重新改写的提交,都可以被恢复。所以,你可能失去的数据,仅限于没有提交过的,对 Git 来说它们就像从未存在过一样。
此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用 git pull
命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下 git clone
命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行 git pull
,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
-- 2019.11.05 增加
git reflog show --date=iso branchName 查看某分支提交记录及找到最初创建分支的信息
git diff branch1 branch2 --stat 显示两个分支的不同,没有--stat会显示出每个文件具体不同的地方
新分支正式打包提交时,需要再一次从master分支拉取一次。
新分支最好是从主分支迁移出,到最后要打包最后一刻再合代码。中途不要随意合其他分支的代码。不然摘除比较麻烦。