【Git】2.Git常用指令

来源:互联网 发布:cmd连不上mysql 编辑:程序博客网 时间:2024/05/18 03:25
上一节我们安装了Git并创建了本地仓库,和GitHub远程仓库。下面我们来通过实例操作学习一下Git的常用命令。

1.提交修改
首先目前我们本地仓库的情况如下:


README.md的内容为:
# HelloWorldSystemTestGit's Function

此时我们修改一下README.md,在HelloWorld于System之间添加一个“Test”:
# HelloWorldTestSystemTestGit's Function

然后右键选择仓库git_repo,选择git bash调出命令行,然后运行git status命令查看当前仓库状态:

Git提示我们README.md文件被修改了,但是还没有提交。如果修改了文件忘记提交,下次记不得什么修改了什么,可以使用“git diff 文件名”查看修改:

可以看到是第一行多了一个“Test”。然后我们需要提交修改,首先要设定我们即将要提交的文件的名称,使用“git add 文件名”可以指定一会要提交的文件,如果是目录下的所有,则将文件名换为“.”。这里我们添加README.md文件预提交:

使用git status命令查看仓库当前状态时,可以发现目前将要提交的修改有哪些文件(这里就是README.md)。


然后我们使用“git commit -m "提交注释"”命令来提交刚刚我们add的修改:

可以看到有一个文件被成功的提交了,提交后重新查看仓库的状态,发现已经没有需要提交的修改了。


2.版本回退
下面我们讲讲版本回退,首先我们再次修改README.md文件,在“Function”后加“s”:
# HelloWorldTestSystemTestGit's Functions

然后add并提交:


此时可以使用“git log”命令查看Git的历史记录:

上面是最近3次的提交,分别创建了README.md文件,添加了“Test”和添加了“s”。
如果不想日志输出的太多,可以在“git log”后加上“--pretty=oneline”参数,可以只让日志输出核心信息:

可以看到简洁的commit id和提交信息,前面的commit id是Git通过SHA1计算出来的数字,用十六进制表示。

现在想把README.md回退到上一个版本,那么首先要告诉Git需要回到哪个版本。在Git中,“HEAD”表示当前版本,上一个版本是“HEAD^”,上上个版本为“HEAD^^”,其它版本自然往上面递加“^”。但是如果版本多,那使用“HEAD~版本数”即可,例如第120版就是“HEAD~120”即可。

将README.md的版本退回到上一版加“Test”的版本,此时使用“git reset -head 版本号”即可,由于我们回退的是上一个版本,版本号为“HEAD^”即可:

可以看到最新版本添加的“s”恢复到上个版本了(也就是没了)。

如果想回到新版本,此时记住之前新版本的commit id即可,同样使用“git reset -head 版本号”:


这里要注意的是,当回退版本之后,git Log会自动删除新版本的commit id信息,如果记不得commit id,此时使用git reflog指令会查看用户执行过的命令信息,在这里可以找到被忽略的回退的新版本的commit id信息:

可以看到提交“s”版本最前面的commit id信息,这里的commit id是缩写,其实恢复版本时不用输入全的commit id只要输入前7位,Git会自动匹配到。

3.Git的区域
在Git中分为工作区(Working Directory)以及版本库(Repository)。工作区就是我们之前的git_repo文件夹,版本库就是工作区隐藏的“.git”文件夹下保存的暂存区(stage)和分支(目前只有主分支master)信息:

有一个指向master的一个指针叫HEAD,该指针决定目前提交的分支信息。

当我们添加“README.md”时,实际上执行了两步:
第一步,使用“git add”指令添加修改的即将要提交的文件,实际上是把文件修改添加到暂存区;
第二步,使用“git commit”提交了更改,实际上是将暂存区的所有内容提交到当前分支。

所以,“git add”指令是将所有修改和新增文件放入暂存区(Stage),然后“git commit”会将暂存区所有的修改提交到分支上。

当我们创建版本库的时候,Git会自动为我们创建一个主分区“master”。所以刚才我们的提交都是提交到名为“master”的主分支上的。

要注意,必须先将修改“get add”放入暂存区,执行“git commit”的时候修改才能被提交。如果前面修改过一次,也add了一次,那么再次修改同一文件之后再次add,暂存区会将两次修改合并。

如果不小心修改错误,不想要了,也不想手动改回来,此时使用“git checkout -- 文件名”可以撤销工作区的修改,这里有两种情况:
(1)文件自修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;
(2)文件已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态。
如果想撤销暂存区的修改,使用“git reset HEAD 文件名”即可,它会将文件在暂存区撤掉(unstage),然后将其重新放回工作区。

前面我们也使用过“git reset”,其实git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

如果我们删除了文件,那么也算作一个修改,此时不需要“git add”,而是“git rm 文件名”,然后commit就可以了。
这里我们在工作区添加一个“test.txt”文件,并提交:

(提交注释中test打成text了,抱歉T_T)

然后我们删除test.txt文件,并查看状态:

可以看到有一个未提交的删除动作。此时我们使用“git rm 文件名”将更改提交缓存区,然后commit提交仓库:


如果我们在提交版本库前后悔了,不想删除test.txt了,此时可以通过“checkout”把在工作区误删的文件恢复到版本库的最新版本:
$ git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

如果删除并提交到版本库了,使用“checkout”是不能恢复的,此时就要使用前面的commit id号去恢复状态。

4.远程仓库
使用“git remote add 远程仓库名 远程仓库的SHHkey”就可以关联远程仓库,
然后使用“git push 远程仓库名 分支名”就可以将本地版本库的所有东西推送到远程库中。如果是第一次提交的话,要在push后面加“-u”,是为了把本地的master分支和远程的master分支关联起来。

关联了远程仓库后,只要本地作了提交,就可以通过命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub

要克隆一个仓库,首先知道仓库的地址,然后使用“git clone 仓库的SSHkey或HTTPS地址”命令克隆。

我们使用“git push origin master”将本地库提交至远程库:

然后登录GitHub,可以看到README.md中真的添加了一个Test:


5.同步远程库代码
如果远程库代码被修改,我们本地的Git要从远程的分支获取最新的版本到本地,
以下两种方法:
(1)git fetch
此时会从远程Git仓库中获取最新代码,但是不会自动merge
git fetch origin master

可以使用下面的指令比较本地的master分支和origin/master分支的差别
git log -p master..origin/master

然后本地master分支代码合并远程资源库origin/master分支代码
git merge origin/master



如果是单个文件,可以使用下面的方式来进行:
git fetch origin master:test.txt
git diff test.txt
git merge test.txt

从远程获取最新的Test.txt版本到本地,之后再进行比较合并。

(2)git pull
相当于是从远程获取最新版本并merge到本地 
git pull origin master

上述命令其实相当于git fetch和git merge,
在实际使用中,git fetch更安全一些,
因为在merge前,我们可以查看更新情况,然后再决定是否合并。

6.指令总结:
git status:查看当前仓库状态。
git diff 文件名:查看修改。
git add 文件名:将文件提交到暂存区。
git commit -m "提交注释":将暂存区的修改提交至版本库。
git log:查看Git历史记录,后加上“--pretty=oneline”参数输入简要信息。
git reset -head 版本号:回退版本,版本号为“HEAD^”或“HEAD~n”或commit id都可以。
git checkout -- 文件名:用版本库里的版本替换工作区的版本。
git reset HEAD 文件名:撤销暂存区的修改。
git rm 文件名:将修改提交到暂存区。
git remote add 远程仓库名 远程仓库的SHHkey:关联远程仓库
git push 远程仓库名 分支名:把本地某分支的最新修改推送至GitHub
git fetch 远程仓库名 分支名:文件名:从远程的仓库的分支下载最新的版本到本地分支上,但不进行合并。如果不带“:文件名”就是指库中所有文件。
git pull 远程仓库名 分支名:从远程获取最新版本并merge到本地。

关于分支部分,后期专门会有一篇总结讲述它。

转载请注明出处:http://blog.csdn.net/acmman/article/details/77621326

原创粉丝点击