文中红色的文字(标为:## 插曲)是在Git学习/实践过程中,我个人遇到的一些问题,每个“## 插曲”之后,都有相应的解决方案。

一、创建版本库

版本库又名仓库,英文名repository,可简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。

* 创建仓库的两种方式:

1.用Git之前已经有的项目代码

$ cd 项目所在的文件夹
$ git init

2.用Git之前还没有项目代码

$ cd 某个文件夹
$ git init your_project #会在当前路径下创建和项目名称相同的文件及
$ cd your_project

方法2的演示:

如下我是F盘 –> www下 目录下新建一个testgit版本库。

pwd 命令是用于显示当前的目录。

1)通过命令 git init 把这个目录变成git可以管理的仓库,如下:

## 插曲:git init 后没有生成.git文件夹

2)把文件添加到版本库中

首先要明确下,所有的版本控制系统,只能跟踪文本文件的改动。

比如txt文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化。

demo如下演示:
在版本库testgit目录下新建一个记事本文件 readme.txt文件:

第一步:使用命令 git add readme.txt添加到暂存区里面去。

## 插曲:可能会出现这样的提示:

fatal: pathspec 'readme.txt' did not match any files

这说明在文件夹里并没有readme.txt这个文件

解决办法

1.手动创建readme.txt

2.通过git命令创建touch readme.txt

第二步:用命令 git commit告诉Git,把文件提交到仓库。

现在我们已经提交了一个readme.txt文件了,可以通过命令 git status 来查看是否还有文件未提交,如下:

当我们在readme.txt文件中添加内容,再执行 git status 来查看时,会出现如下结果:

上面的命令告诉我们 readme.txt文件已被修改,但是未被提交的修改。
readme.txt文件到底改了什么内容,如何查看呢?

可以使用如下命令:

$ git diff readme.txt 

知道了对readme.txt文件做了什么修改后,我们可以放心的提交到仓库了,提交修改和提交文件是一样的2步
(第一步是git add 第二步是:git commit)。如下:

二:版本回退:

现在我已经对readme.txt文件做了三次修改了,那么我现在想查看下历史记录,如何查呢?
可以使用命令 git log 演示如下所示:
git log命令显示从最近到最远的显示日志,还可以使用命令 :
$ git log --pretty=oneline
演示如下:
 
** 现在想使用版本回退操作,把当前的版本回退到上一个版本,要使用什么命令呢?
 
可以使用如下2种命令:
第一种是:git reset --hard HEAD^ 那么如果要回退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此类推。
那如果要回退到前100个版本的话,命令操作:git reset --hard HEAD~100 即可。
未回退之前的readme.txt内容如下:

## 插曲:可能出现如下提示

fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]'
 
问题解决:
git log看看你是不是有且只有一个commit
 

通过命令cat readme.txt查看

获取到版本号:
$ git reflog
演示如下:
通过上面的显示我们可以知道,增加内容333333333333333的版本号是 3752a62.我们现在可以命令:
$ git reset --hard 3752a62
来恢复了。演示如下:
 
三、理解工作区与暂存区的区别?
 
工作区:就是你在电脑上看到的目录,比如目录下testgit里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。
版本库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。
使用Git提交文件到版本库有两步:
第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。
第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。
 
使用demo来演示下:
我们在readme.txt再添加一行内容为7777,接着在目录下新建一个文件为test.txt 内容为test,我们先用命令 git status来查看下状态,如下:
现在我们先使用git add 命令把2个文件都添加到暂存区中,再使用git status来查看下状态,如下:

接着我们可以使用git commit一次性提交到分支上,如下:

 
四、Git撤销修改和删除文件操作
(1)撤销修改:
比如我现在在readme.txt文件里面增加一行 内容为11111,我们先通过命令查看如下:
 
在未提交之前,我发现添加11111内容有误,所以要马上恢复以前的版本,可以有如下几种方法可以做修改:
第一:如果我知道要删掉那些内容的话,直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit掉。
第二:可以按以前的方法直接恢复到上一个版本。使用 git reset --hard HEAD^
第三:但是,现在不想使用上面的2种方法,想直接想使用撤销命令该如何操作呢?
首先在做撤销之前,我们可以先用 git status 查看下当前的状态。如下所示:
可以发现,

$ git checkout -- file #可以丢弃工作区的修改

如下命令:
git checkout -- readme.txt(--与readme之间要有个空格),如下所示:

命令 git checkout --readme.txt 意思就是,把readme.txt文件在工作区做的修改全部撤销,这里有2种情况,如下:
1.readme.txt自动修改后,还没有放到暂存区,使用撤销修改就回到和版本库一模一样的状态。
2.另外一种是readme.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。
对于第二种情况,做demo演示如下所示:

注意:命令git checkout -- readme.txt 中的 -- 很重要,如果没有 -- 的话,那么命令变成创建分支了。

 
(2)删除文件
在版本库testgit目录添加一个文件b.txt,然后提交。如下:
如上:如果我想彻底从版本库中删掉了此文件的话,可以再执行commit命令 提交掉。
 
== 在没有执行commit前,如果我想在版本库中恢复此文件如何操作呢?
可以使用如下命令 git checkout -- b.txt,如下所示:
 
五、远程仓库
 
在了解之前,先注册github账号,由于你的本地Git仓库和github仓库之间的传输是通过SSH加密的,所以需要一点设置:
第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,执行以下步骤:
## 插曲:使用该工具生成.ssh目录及公钥和私钥
1.在“用户目录”下,右击选择“Git Bash hear”,效果见下图:

输入以下命令并执行,然后一路按“回车”即可,效果见图:

$ ssh-keygen

重新查看我们的用户目录,发现是否多了一个“.ssh”目录,且该目录下存在两个文件:

(1)公钥:id_rsa.pub

(2)私钥:id_rsa

打开终端,输入以下命令行

$ ssh-keygen -t rsa -C"your_email@youremail.com"(后面的your_email@youremail.com改为你的邮箱。)

直接点回车,说明会在默认文件id_rsa上生成ssh key。 然后系统要求输入密码,直接按回车表示不设密码。重复密码时也是直接回车,之后提示你shh key已经生成成功。

打开id_rsa.pub,复制里面的key。

回到github网站,进入Account Settings,左边选择SSH Keys,Add SSH Key,

title随便填,粘贴key。

Add SSH key

验证是否成功,在git bash下输入

$ ssh -T git@github.com

回车就会看到:You’ve successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github。

 
**  如何添加远程库?
现在的情景是:已经在本地创建了一个Git仓库后,又想在github创建一个Git仓库,并且希望这两个仓库进行远程同步,这样github的仓库可以作为备份,又可以其他人通过该仓库来协作。
执行步骤:
首先,登录github上,然后在右上角找到“create a new repo”创建一个新的仓库。如下:
 
在Repository name填入testgit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
 
目前,在GitHub上的这个testgit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的testgit仓库下运行命令:
 
 
## 插曲:报错error: src refspec master does not match any

原因分析:

1.本地git仓库目录下为空

2.本地仓库add后未commit

3.git init错误

解决方法:

1.控制面板打开文件夹选项  打开隐藏文件和文件夹显示

2.到本地仓库目录下查看是否有.git文件夹——无 则git init

3.看.git文件夹下是否有之前提交的文件——若无 则重新 git commit (如果之前git add过的话 没有就要重新 add commit)

4.新装的git要留意是否需要配置用户名和邮箱名

把本地库的内容推送到远程,使用 git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了 –u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
 
## 插曲:报错! [rejected] master -> master (fetch first)
解决:
1.git push -f  进行解决错误,从而提交成功。
2.如果上述解决方式不管用也可以输入:git pull --rebase origin master 之后再进行git push 即可。
github上显示:

六、获取 Git 仓库

两种取得 Git 项目仓库的方法。 第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库。

1.在现有目录中初始化仓库

如果你打算使用 Git 来对现有的项目进行管理,你只需要进入该项目目录并输入:

$ git init

该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。

如果你是在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 仓库来进行版本控制的话,你应该开始跟踪这些文件并提交。 你可通过 git add 命令来实现对指定文件的跟踪,然后执行 git commit 提交:

$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'

2.克隆现有的仓库

获得一份已经存在了的 Git 仓库的拷贝,这时就要用到 git clone 命令。

首先,登录github,创建一个新的仓库,名字叫testgit3.如下:

Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。 事实上,如果你的服务器的磁盘坏掉了,你通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库。

其次,克隆仓库的命令格式是 git clone [url]

$ git clone https://github.com/zzbd444/testgit3

在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。

如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以使用如下命令:

$ git clone https://github.com/zzbd444/testgit3 mylibgit

这将执行与上一个命令相同的操作,不过在本地创建的仓库名字变为 mylibgit

接着在我本地目录下 生成testgit2目录了,如下所示:

Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议,比如 user@server:path/to/repo.git

注意:

因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。git config --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。
 
七、创建与合并分支
 
在版本回退里可以发现,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。
HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
(1)创建分支:
首先,我们来创建dev分支,然后切换到dev分支上。如下操作:
git checkout 命令加上 –b参数表示创建并切换,相当于如下2条命令
$ git branch dev
$ git checkout dev

git branch查看分支,会列出所有的分支,当前分支前面会添加一个星号。

然后我们在dev分支上继续做demo,比如我们现在在readme.txt再增加一行ccccccccccc

首先我们先来查看下readme.txt内容,接着添加内容cccccccccc,如下:

现在dev分支工作已完成,现在我们切换到主分支master上,继续查看readme.txt内容如下:

(2)合并分支

现在把dev分支上的内容合并到分支master上了,可以在master分支上,使用如下命令 git merge dev 如下所示:

git merge命令用于合并指定分支到当前分支上,合并后,再查看readme.txt内容,可以看到,和dev分支最新提交的是完全一样的。

注意到上面的Fast-forward信息,即次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

合并完成后,我们可以接着删除dev分支了,操作如下:

* * 总结创建与合并分支命令如下:

git branch :查看分支

git branch name :创建分支

git checkout name :切换分支

git checkout –b name :创建+切换分支

git merge name :合并某分支到当前分支

git branch –d name :删除分支

* 如何解决冲突?

demo:先新建一个新分支,比如名字叫dev2,在readme.txt添加一行内容8888888,然后提交,如下所示:

同样,我们现在切换到master分支上来,也在最后一行添加内容,内容为aaaaaaaaaaa,如下所示:

现在我们需要在master分支上来合并dev2,如下操作:

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容:

其中<<<HEAD是指主分支修改的内容;

>>>>>dev2是指dev2上修改的内容,我们可以修改下如下后保存:

如果想查看分支合并的情况的话,需要使用命令 git log.命令行演示如下:

(3)分支管理策略

通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息,现在我们来使用带参数 –no-ff来禁用”Fast forward”模式。首先我们来做demo演示下:

①创建一个dev分支;

②修改readme.txt内容;

③添加到暂存区;

④切换回主分支(master);

⑤合并dev分支,使用命令 git merge –no-ff  -m “注释” dev;

⑥查看历史记录;

截图如下:

分支策略:首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。

八、bug分支

在开发中,会经常碰到bug问题,那么有了bug就需要修复,在Git中,分支是很强大的,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉。

比如我在开发中接到一个404 bug时候,我们可以创建一个404分支来修复它,但是,当前的dev2分支上的工作还没有提交。比如如下:

并不是我不想提交,而是工作进行到一半时候,我们还无法提交。

比如我这个分支bug要2天完成,但是我issue-404 bug需要5个小时内完成。怎么办呢?还好,Git还提供了一个stash功能,可以把当前工作现场 ”隐藏起来”,等以后恢复现场后继续工作。

$ git stash

如下:

所以,现在我可以通过创建issue-404分支来修复bug了。

首先,我们要确定在那个分支上修复bug,比如我现在是在主分支master上来修复的,现在我要在master分支上创建一个临时分支,演示如下:

修复完成后,切换到master分支上,并完成合并,最后删除issue-404分支。演示如下:

现在,我们回到dev2分支上干活了:

工作区是干净的,那么我们工作现场去哪里呢?我们可以使用命令 git stash list来查看下。如下:

工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,可以使用如下2个方法:

1.git stash apply恢复,恢复后,stash内容并不删除,你需要使用命令git stash drop来删除。

2.另一种方式是使用git stash pop,恢复的同时把stash内容也删除了。

演示如下:

九、多人协作

当你从远程库克隆时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin。

1.要查看远程库的信息 使用:

$ git remote

2.要查看远程库的详细信息 使用:

$ git remote –v

* 推送分支:

推送分支就是把该分支上所有本地提交到远程库中,推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:

使用命令;

$ git push origin master

比如我现在的github上的readme.txt代码如下:

本地的readme.txt代码如下:

本地更新的readme.txt代码推送到远程库中,使用命令如下:

推送成功,我们可以继续来截图github上的readme.txt内容 如下:

如果我们现在要推送到其他分支,比如dev2分支上,我们还是那个命令:

$ git push origin dev

** 那么一般情况下,那些分支要推送呢?

1.aster分支是主分支,因此要时刻与远程同步。

2.一些修复bug分支不需要推送到远程去,可以先合并到主分支上,然后把主分支master推送到远程去。

* 抓取分支:

多人协作时,大家都会往master分支上推送各自的修改。现在我们可以模拟另外一个同事,可以在另一台电脑上(注意要把SSH key添加到github上)或者同一台电脑上另外一个目录克隆,新建一个目录名字叫testgit2.

但是我首先要把dev3分支也要推送到远程去,如下:

接着进入testgit2目录,进行克隆远程的库到本地来,如下:

现在目录下生成有如下所示:

 现在,我们的小伙伴要在dev2分支上做开发,就必须把远程的origin的dev2分支到本地来,于是可以使用命令创建本地dev分支:
$ git checkout  –b dev origin/dev
现在小伙伴们就可以在dev分支上做开发了,开发完成后把dev分支推送到远程库时。
如下:
小伙伴们已经向origin/dev分支上推送了提交,而我在我的目录文件下也对同样的文件同个地方作了修改,也试图推送到远程库时,如下:
由上面可知:
推送失败,因为我的小伙伴最新提交的和我试图推送的有冲突,解决的办法也很简单,上面已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后在本地合并,解决冲突,再推送。
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:如下:
 
这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的 解决冲突完全一样。解决后,提交,再push:
我们可以先来看看readme.txt内容了。
现在手动已经解决完了,我接在需要再提交,再push到远程库里面去。如下所示:
因此:多人协作工作模式一般是这样的:
1.首先,可以试图用git push origin branch-name推送自己的修改.
2.如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并。
3.如果合并有冲突,则需要解决冲突,并在本地提交。再用git push origin branch-name推送。
 
**本文借鉴网络文章:http://www.imooc.com/article/20411 跟着这位大神一点点敲的。
我的这篇文章中遇到了很多问题(插曲),这些问题都是我自己网上搜索进行解决的,它们比较针对我自己在此过程中碰到的问题。
 
补充:通过图形界面工具来查看版本历史:
$ gitk

 
-------------------------------------------分割线-------------------------------------------------------------------------------------
 
下面是在网上搜罗Git常用命令,整理到这里方便以后我复习:
下文来自,阮一峰博客:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
他整理的Git命令清单:
一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。
常用 Git 命令清单。几个专用名词的译名如下:
* Workspace:工作区
* Index / Stage:暂存区
* Repository:仓库区(或本地仓库)
* Remote:远程仓库

一、新建代码库

# 在当前目录新建一个Git代码库
$ git init
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]
# 下载一个项目和它的整个代码历史
$ git clone [url]

二、配置

Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。

# 显示当前的Git配置
$ git config --list
# 编辑Git配置文件
$ git config -e [--global]
# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

三、增加/删除文件

# 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]

四、代码提交

# 提交暂存区到仓库区
$ git commit -m [message] # 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message] # 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a # 提交时显示所有diff信息
$ git commit -v # 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message] # 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

五、分支

# 列出所有本地分支
$ git branch # 列出所有远程分支
$ git branch -r # 列出所有本地分支和远程分支
$ git branch -a # 新建一个分支,但依然停留在当前分支
$ git branch [branch-name] # 新建一个分支,并切换到该分支
$ git checkout -b [branch] # 新建一个分支,指向指定commit
$ git branch [branch] [commit] # 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch] # 切换到指定分支,并更新工作区
$ git checkout [branch-name] # 切换到上一个分支
$ git checkout - # 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch] # 合并指定分支到当前分支
$ git merge [branch] # 选择一个commit,合并进当前分支
$ git cherry-pick [commit] # 删除分支
$ git branch -d [branch-name] # 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

六、标签

# 列出所有tag
$ git tag # 新建一个tag在当前commit
$ git tag [tag] # 新建一个tag在指定commit
$ git tag [tag] [commit] # 删除本地tag
$ git tag -d [tag] # 删除远程tag
$ git push origin :refs/tags/[tagName] # 查看tag信息
$ git show [tag] # 提交指定tag
$ git push [remote] [tag] # 提交所有tag
$ git push [remote] --tags # 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]

七、查看信息

# 显示有变更的文件
$ git status # 显示当前分支的版本历史
$ git log # 显示commit历史,以及每次commit发生变更的文件
$ git log --stat # 搜索提交历史,根据关键词
$ git log -S [keyword] # 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s # 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature # 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file] # 显示指定文件相关的每一次diff
$ git log -p [file] # 显示过去5次提交
$ git log -5 --pretty --oneline # 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn # 显示指定文件是什么人在什么时间修改过
$ git blame [file] # 显示暂存区和工作区的差异
$ git diff # 显示暂存区和上一个commit的差异
$ git diff --cached [file] # 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD # 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch] # 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}" # 显示某次提交的元数据和内容变化
$ git show [commit] # 显示某次提交发生变化的文件
$ git show --name-only [commit] # 显示某次提交时,某个文件的内容
$ git show [commit]:[filename] # 显示当前分支的最近几次提交
$ git reflog

八、远程同步

# 下载远程仓库的所有变动
$ git fetch [remote] # 显示所有远程仓库
$ git remote -v # 显示某个远程仓库的信息
$ git remote show [remote] # 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url] # 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch] # 上传本地指定分支到远程仓库
$ git push [remote] [branch] # 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force # 推送所有分支到远程仓库
$ git push [remote] --all

九、撤销

# 恢复暂存区的指定文件到工作区
$ git checkout [file] # 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file] # 恢复暂存区的所有文件到工作区
$ git checkout . # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file] # 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit] # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit] # 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit] # 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit] # 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

十、其他

# 生成一个可供发布的压缩包
$ git archive
一、新建代码库

作者:AllySu
链接:http://www.imooc.com/article/20411
来源:慕课网

Git学习笔记--实践(三)的更多相关文章

  1. Git 学习笔记(三)

    我记得最初学习的时候我提到了使用版本控制软件的最大好处是让你可以永远后悔,那么如何吃后悔药呢?在项目过程中我们很有可能因为各种因素对我们的操作进行回滚,对于传统的版本控制系统来说,并不复杂,拿 SVN ...

  2. Git学习笔记(三)

    一.标签是什么 发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一 ...

  3. git——学习笔记(三)分支管理

    一.创建.合并分支 每次提交,git都往后走一格,串成一跳时间线,head指向的是分支,分支指向提交.master是主分支,dev是另一条分支,分支就像指针一样,合并.删除分支时,修改的都是指针,工作 ...

  4. git学习笔记 (三)

    学习地址 http://www.liaoxuefeng.com http://www.cnblogs.com/renkangke/archive/2013/05/31/conquerAndroid.h ...

  5. git学习笔记(三)—— 远程仓库

    一.gitHub&&SSH Key 为git仓库提供托管服务的,所以注册一个github账号,就可以免费获得git远程仓库. 本地Git仓库和GitHub仓库之间的传输是通过SSH加密 ...

  6. Git学习笔记(三)远程库(GitHub)协同开发,fork和忽略特殊文件

    远程库 远程库,通俗的讲就是不再本地的git仓库!他的工作方式和我们本地的一样,但是要使用他就需要先建立连接! 远程库有两种,一个是自己搭建的git服务器:另一种就是使用GitHub,这个网站就是提供 ...

  7. Git学习笔记(四)

    一.忽略特殊文件 在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件. 不需要从头写.gitignore文件,GitHub已经为我们 ...

  8. GIT学习笔记(3):分支管理

    GIT学习笔记(3):分支管理 何谓分支 GIT是如何存储数据的 GIT不是存储文件差异或者变化量,而是一系列文件的快照.在Git提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容 ...

  9. GIT学习笔记(2):时光机穿梭与远程仓库

    GIT学习笔记(2):时光机穿梭与远程仓库 撤销操作 1.GIT如何跟踪修改 在我们修改了代码内容后,执行了git add和git commit命令来将其交由Git进行版本控制.我们前面举的例子是这样 ...

随机推荐

  1. SQL Server 使用文件组备份降低备份文件占用的存储空间

    对于DBA来说,备份和刷新简历是最重要的两项工作,如果发生故障后,发现备份也不可用,那么刷新简历的重要性就显现出来,哇咔咔!当然备份是DBA最重要的事情(没有之一),在有条件的情况下,我们应该在多个服 ...

  2. Versioning information could not be retrieved from the NuGet package repository. Please try again later.

    Versioning information could not be retrieved from the NuGet package repository. Please try again la ...

  3. asp net core Remote Validation 无法验证

    [注意这里,Remote Validation是需要引入Jquery插件和启用客户端验证的]

  4. Listener学习

    监听器Listener用于监听web应用中某些对象.信息的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法.常用于统计 ...

  5. error adding symbols:DSO missing from command line

    编译时加上-lz,如果是使用eclipse,则在添加库z

  6. leetcode动态规划笔记一---一维DP

    动态规划 刷题方法 告别动态规划,连刷 40 道题,我总结了这些套路,看不懂你打我 - 知乎 北美算法面试的题目分类,按类型和规律刷题 题目分类 一维dp House Robber : 求最大最小值 ...

  7. python_协程

    协程 问题一: 生成器与函数的区别?生成器分阶段的返回多个值,相当于有多个出口(结果): yield ''' yield # 中断.返回函数值 1.只能在函数中使用 2.会暂停函数执行并且返回表达式结 ...

  8. 【题解】Luogu P5360 [SDOI2019]世界地图

    原题传送门 每次查询的实际就是将地图的一个前缀和一个后缀合并后的图的最小生成树边权和 我们要预处理每个前缀和后缀的最小生成树 实际求前缀和(后缀和)的过程珂以理解为上一个前缀和这一列的最小生成树进行合 ...

  9. [SOJ #498]隔膜(2019-10-30考试)/[POJ2152]Fire

    题目大意:有一棵$n$个点的带边权树,第$i$个点有两个值$w_i,d_i$,表示在这个点做标记的代价为$w_i$,且这个点距离$d_i$以内至少要有一个点被标记,为最小代价.$n\leqslant6 ...

  10. 小程序加入echart 图表

    github上的地址 https://github.com/ecomfe/echarts-for-weixin 复制到当前项目根目录下 添加展示bar图表例子的文件夹 index.json 中配置使用 ...