本节将完成一次从本地仓库修改代码、提交并推送到远程仓库的操做。git
Git 本地仓库有三大区域:工做区、暂存区、版本区。这是一个概念,有这个了解便可,随着使用 Git 的时间增多,慢慢就会理解这三个区域的做用以及为什么要这么设计。接下来以命令为主线介绍 Git 的操做。浏览器
注意,全部 Git 命令都以 git
开头。设计
首先,进入仓库主目录,执行 git status
查看整个仓库的状态:3d
建立一个文件并再次查看仓库状态,这步操做是在工做区中:指针
按照上图的提示,使用 git add [文件名]
命令跟踪此新建文件,即把新增文件添加到暂存区,以备提交:code
若是对多个文件或目录进行了增删改,可使用 git add .
命令所有添加到暂存区。blog
注意这里有个概念,当修改了工做区,git add
命令是将这些修改添加到暂存区,暂存区记录的只是修改。若是要撤销暂存区的修改,根据上图的提示,执行 git reset -- [文件名]
或者 git rm --cached [文件名]
命令便可:教程
上图的命令,若是省略最后的文件名,把命令写成 git reset --
便可把暂存区的所有修改撤销。好,如今暂存区的修改被撤销,又回到了工做区。it
如今介绍另外一个命令 git diff
,它能够用来查看工做区被跟踪的文件的修改详情,此时新建文件 one.txt 并未被跟踪,而已被跟踪的文件 README.md 无修改,因此看不到。注意,只有在版本区中存在的文件才是被跟踪文件。ast
先修改 README.md 文件,而后执行此命令:
如今,将工做区的两处修改(新增文件 one.txt,修改文件 README.md)所有添加到暂存区,并使用 git diff --cached
查看暂存区的所有修改:
接下来,将执行 git commit
命令把暂存区的修改提交到版本区,生成一个新的版本。
在此以前,先介绍另外一个命令 git log
,它用来查看版本区的提交历史记录,当前只有一个提交,就是在 GitHub 上建立新仓库时的初始化提交。一样此命令也会跳到新页面,以下图所示:
关于查看提交历史记录的命令,有些经常使用的选项介绍一下:
接下来须要对 Git 进行一些本地配置:
这两个命令设置身份信息以下图。git config -l
能够查看配置信息(就不展现截图了):
完成后,系统自动生成 Git 的配置文件,就是家目录中的隐藏文件 .gitconfig
:
上图所示的配置文件也是能够直接手动修改。
如今执行 git commit
命令生成一个新的提交,一个必须的选项 -m 用来提供该提交的备注:
提交后,暂存区的修改被清空,执行 git log
查看提交记录,紫色框中的十六进制序列号就是提交版本号,这是很重要的信息,每一个提交都有本身单独的版本号,就像公民身份证号同样:
观察上图的提交信息,提交版本是按时间倒序排列的,也就是最近的提交排在最上面,可能须要查看时间正序排列的信息,那么可使用 git log --reverse
命令。
如今介绍一个超级实用、使用频率极高但几乎全部 Git 教程都不重视的命令 git branch -avv
,它用来查看所有分支信息:
上图执行命令后显示出有三行信息,依次说明:
第一行,开头的星号表示当前所在分支,绿色的 master 是分支名,之因此是绿色,也是由于它是当前所在分支。后面第二项是版本号,第三项中括号里面蓝色的字,表示此分支跟踪的远程分支的名字,固然,这也是克隆远程仓库到本地时的默认设置 -- 建立 master 分支并自动跟踪远程同名分支;冒号后面白色文字表示本地分支领先其跟踪的远程分支一个提交。最后一项是提交时填写的备注信息。
第二行,是 Git 指针信息,它指向远程仓库的 master 分支,这行信息暂不重要。
第三行,远程分支信息,详见第一行的解释。
在执行 commit
命令时,有一个并不推荐的选项 -a
,它的做用是将未添加到暂存区的修改,也就是工做区的修改也一并提交,但会略过未被跟踪的文件,好比新建文件 one.txt,此命令的完整格式:git commit -am xxxxx
。谨慎的作法是按照前文的顺序,修改工做区 - 提交到暂存区 - 随时使用 git status
查看仓库状态 - 将暂存区的修改提交到版本区生成一次新的提交。
最后一个环节,将本地新增的提交推送到 GitHub 远程仓库中,命令是 git push
,后面不须要任何选项和参数,此命令会把本地仓库 master 分支上的新增提交推送到远程仓库的同名分支上,由于当前所在的分支就是 master,并且上文提到,它已经跟踪了远程仓库的同名分支:
此命令须要输入用户名和密码,若是是 Linux 用户,密码为隐藏数据,输入时看不到。若是是 Windows,会弹出一个窗口,告诉你输入用户名和密码,如图所示。
推送成功后执行 git branch -avv
查看分支状况:
如上图所示,本地分支 master 与远程分支 origin/master 的版本号一致,一般看两个版本号是否一致,只需比对前四位。看一下网页上的状况:
彻底符合预期。
以上就是一次完整的修改 - 提交 - 推送操做。一次推送中能够包含多个 git commit
操做,也就是多个提交能够一块儿推送。
若是发现 one.txt 文件内容有误,怎么作?能够修改此文件而后再次添加到暂存区、提交、推送,也能够撤销最近一次提交,修改文件后从新提交推送。如今使用后一种方法来演示撤销提交的操做流程。
首先执行 git reset --soft HEAD^
撤销最近的一次提交,将修改还原到暂存区。--soft
表示软退回,对应的还有 --hard
硬退回,后面会讲到,HEAD^
表示撤销一次提交,HEAD^^
表示撤销两次提交,撤销 n 次能够简写为 HEAD~n
。软退回一个提交后执行 git branch -avv
命令查看分支信息:
能够看到本地仓库的 master 分支的版本号已经发生了变化,变成了前一次提交的版本号,中括号里也有提示信息,本地分支 master 落后其跟踪的远程分支 origin/master 一个提交。
执行 git status
查看仓库状态,果真上一个提交中的修改所有扔回了暂存区:
再次修改 one.txt 文件,执行 git add .
命令将新的修改添加到暂存区,而后执行 git commit
命令生成新的提交:
执行 git status
和 git branch -avv
查看仓库状态和分支状态:
能够看到本地仓库的 master 分支与远程仓库的 origin/master 分支在提交版本上有了冲突,又叫作提交时间线分叉。由于刚才的提交操做不是基于远程仓库 origin/master 分支的最新提交版本,而是撤回了一个版本。这种状况下也是能够将本地 master 分支推送到远程仓库的,须要加一个选项 -f
,它是 --force
的简写,这就是强制推送:
执行 git branch -avv 看一下分支信息,本地 master 与远程 master 的版本号一致,前四位都是 aeea,在浏览器上刷新 GitHub 页面,结果如预期:
假设此时发现状况不对,以前的那次版本号为 e9ac 的提交是正确的,刚才的版本回退操做全都是误操做,怎么办?再次执行一次版本回退吗?固然不须要,有 git reflog
命令,它会记录本地仓库全部分支的每一次版本变化。实际上只要本地仓库不被删除,随你怎么折腾,都能回退到任何地方。reflog
记录只存在于本地仓库中,本地仓库删除后,记录消失。执行此命令以下图所示:
怎么回退到 e9ac 那个版本呢?能够直接执行命令 git reset --hard [版本号]
,若是记不清版本号,也能够根据上图的信息,执行 git reset --hard HEAD@{2}
命令,其中 HEAD@{2}
就是上图第 5 行第 2 列所示,这个命令的意思是回到当前分支最近两次提交版本变化前:
还想反悔,刚才仍是改错了,怎么办?再执行一次便可,此次大括号里就是 1 了:
重要的一点,本节所有命令中,只有 push
是须要联网执行的,它对远程仓库进行了修改。
本节内容包括: