git 使用小补充(四)

大神博客https://www.cnblogs.com/tugenhua0707/p/4050072.html

一、

新建git本地仓库:
git init 新建一个.git文件,有这个文件就是一个git仓库

git本地仓库分三个区来区别操作(这个思路太重要了):
工作区: 就是一个多了.git文件的文件夹,不要想太多,就按Linux操作文件夹的方法正常操作
暂存区: 暂时讲了两种操作暂存区的方法:
1.存入暂存区 git add filename git rm filename 这两条都是修改暂存区
2.递交暂存区 git commit -m "log" 别忘了正常来说一般对暂存区修改以后一定要commit一下
版本库:git commit以后的最终版本存入地方,git最重要的一个地方,因为只有版本库的修改才可以跟踪

另外有几个命令查看状态也很重要:
git status 查看当前git仓库与上一次commit之后的版本库的一切修改,包括工作区的修改和暂存区的修改(这种信息是不详细的)很人性化的是,git status会提示你下一步可能会做的事,比如你对工作区做了修改,他可能会提示下一步要git add或者git checkout < filename >, 你刚执行完git add以后,git status跟踪的暂存区的修改,他又会提示你下一步可能要提交git commit或者git reset HEAD < filename > git diff:这个命令返回的是你对工作区的修改,别想太多,和什么对比并不重要,你只要知道什么时候他会有信息返回,返回什么信息!什么时候有返回呢!你对工作区已经存在的文件修改(但是没有存入暂存区,也就是说没有git add或者git rm,所以一定要纠结的话,他比较的的确是暂存区和工作区的区别)的话有返回(新建文件git diff看不到),返回什么,返回修改的详细信息,+是新添的行-是删去的行 git diff --cached:这个命令是查看你对暂存区的修改,也就是你git add或者git rm以后,git diff的返回信息就用git diff --cached来用了(这也是为什么这两个命令一样,只有参数不一样的原因,因为其实干的都是一件事,只是git diff针对的对象是工作区,git diff --cached针对的对象是暂存区)
git log:当前版本之前的commit日志记录,也就是说当前版本是回退回来的版本的话,当前版本之后的提交与回退都看不到(有个很重要的commit ID) git reflog:包括版本回退、版本提交的日志,信息教git log会比较简单
这样把命令的针对对象分为三个区来理解,现在看撤销操作就很容易了: 1.针对工作区的撤销(必须保证没有git add/git rm之前): git checkout -- filename
2.针对暂存区的撤销(必须是git add/git rm以后才行) git reset HEAD filename
顺便想起git reset的另一种用法,参数不一样啦,那肯定也是撤销操作,当然就是撤销提交,回退版本啦
git reset --hard (HEAD^^^^)/commit id 哦了,之前的信息全穿起来了!!!

二、常用命令

查看状态:git status
进行比较:git diff(对象是工作区修改) 、
git diff --cached(对象是暂存区修改)
查看日志 :git log
git log --graph --pretty=oneline --abbrev-commit
git reflog

回退前100版本
git reset --hard HEAD~100
回退上个版本
git reset --hard HEAD^
回退当前版本(最近一次提交的版本)
git reset --hard HEAD
恢复某一个特定的版本
git reset --hard 5517cba

我们前面说过使用Git提交文件到版本库有两步:
第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。
第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。

git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件。
注意 -A 选项后面还有一个句点。 git add -A表示添加所有内容, git add . 表示添加新文件和编辑过的文件不包括删除的文件; git add -u 表示添加编辑或者删除的文件,不包括新添加的文件

修改内容有误,怎么进行修正呢?
(关于这一部分,一说的比较好,当然这也是一种思路)
第一:如果我知道要删掉那些内容的话,直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit掉。
第二:全部commit,我可以按以前的方法直接恢复到上一个版本。使用 git reset --hard HEAD^,然后重新修改
第三,撤销工作区的修改
git checkout -- file
1)修改后,还没放到暂存区,撤销后就和版本库一模一样的状态
2)已经放到暂存区了,接着做了修改,撤销后就回到添加暂存区之后的状态

三、其他git命令(补充第二部分)

1.配置用户名和密码
git config --global user.name "song"
git config --global user.email "***********@163.com"

四、git pull 和git fetch的区别

git中,从远程的分支获取最新的版本到本地有两个命令:fetch和pull
相同点:
首先再功能上是大致相同的,都更新代码
1.fetch
从远程获取最新版本到本地,不会自动的merge

 git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
 git log -p master  ..origin/master //比较本地的master分支和origin/master分支的差别
 git merge origin/master //进行合并

这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。

如果你使用git clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库(git remote -v)并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。

如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull命令来自动的抓取然后合并远程分支到当前分支。 这对你来说可能是一个更简单或更舒服的工作流程;默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

2.git pull:相当于是从远程获取最新版本并merge到本地
git pull origin master //相当于git fetch 和 git merge

注:用git pull更新代码的话就比较简单暴力了但是根据commit ID来看的话,他们实际的实现原理是不一样的,所以不要用git pull,用git fetch和git merge更加安全。

原文地址:https://www.cnblogs.com/sggggr/p/15559794.html