git是什么?这个我相信没有人会问这么愚蠢的问题。一般项目开发过程中,我们是100%会接触到git或者svn,这里我不评价孰优孰劣,仅仅从学习的角度去了解git命令行工具如何使用
前言

在使用git的过程中,相信大家对工作区、暂存区、本地仓库以及远程仓库应该都心知肚明,从这幅图中大家也应该很清楚的看出4个名词的含义,在此不多说
准备工作
我们先在github上创建一个远程仓库gitstudy,路径为https://github.com/r17171709/gitstudy。然后在本地磁盘中随便创建一个gitstudy文件夹,里面放一个hello_git的txt文件,文件里面写着hello。准备工作完成

基本操作
git init
初始化git仓库

git add
添加文件到暂存区中

可以同时添加多个文件比如git add a.txt b.txt
cat
查看文件的内容

git rm --cached
将文件从暂存区中移除

git status
查看当前工作区与暂存区的状态,比如文件有没有添加到暂存区,或者已经添加到暂存区的文件有没有添加到本地仓库中等


这个功能其实相当不错,当你忘记了哪些文件需要添加到暂存区哪些文件需要提交到仓库中的时候,这个命令就起作用了
git commit
将暂存区的文件提交到本地仓库

我们来简单看下同一个分支2次提交的区别以及相关概念,先看下示意图


我们每一次的提交会在当前分支上被记录为commit(A\B\C),最终git会将这些commit形成的快照以时间轴的形式展现出来。HEAD指针指向正在工作的本地分支,我们每次新增commit或者回滚commit,都是修改这些HEAD指针的指向而已
git push
上传到远程仓库去。首先将仓库地址命名为origin,这个名字没有硬性要求,只是一个习惯而已。然后往这个地址上push以上传

如果需要修改别名,可以使用git remote set-url origin xxxx,或者先删除git remote rm origin,再添加git remote add origin xxx

git diff
查看工作区与暂存区的差别。
这里我将hello_git.txt文件的内容进行了修改,之前是"dev12345678",现在变成“dev1234567890”

我又新增了一个文件并且添加到了暂存区,同时罗列出整个分支中所有差异性文件

git reset/git checkout
手贱误删或者代码重置需要用到这2个命令,来看看使用场景
-
文件恢复-未add
当你执行删除文件操作,无非是2种情况:(a) 手贱了一下,不小心删除了 (b) 真的是要删除
删除了hello_git2.txt之后,git status给予的后续动作提示
首先得明确一下,因为未add,所以不管你是什么删除情况,你删除的仅仅是工作区的文件,暂存区的文件依然存在,所以我们应该这样处理2种不同的情况
(a) 直接git checkout恢复即可
git checkout -- hello_git2.txt
(b) rm去掉之后再commit
彻底删除文件并提交
-
文件恢复-已add
代码写的乱七八糟的,又add添加到暂存区了,现在想重新写了。折腾!。对于这种已经add到暂存区的情况,直接像之前那种checkout是不行的,那么需要先回到上一次提交时的状态然后再调用checkout
git reset HEAD hello_git2.txt git checkout -- hello_git2.txt
-
文件恢复-已commit
已经commit了,现在想撤销了回到某一个版本,通过git reset --hard即可回到指定版本
git reset --hard 749e548
git revert
这个也是起到回滚的作用,但是与git reset的区别在于
- git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit,两者的方向是相反的
- git reset删除某一个commit之后,是不能直接提交,而git revert并不会
我们来看看实际操作流程



git log
查看所有commit记录

git reflog
这个跟git log有异曲同工之妙,但是又完全不是一回事。他可以查看所有分支的所有操作记录,比如commit、reset等,甚至被删除的commit记录都可以查看,而git log是不可以的。这样,就算你使用git reset --hard去回滚到指定版本,也不用担心滚不回来了。不过需要注意的是,git reflog并不会永远保存,你可能现在就看不到之前的一些信息了

分支
为什么要建立分支,想必人人都心中有数,没有分支会带来什么样的麻烦,无需多说
git branch
查看当前仓库下的所有分支。默认是master分支

这里当前分支都是用*前缀来表示的。
如果你要创建一个分支,直接 git branch xxx即可

新建完分支之后,HEAD指针仍然指向的是我们的master主分支,后续一切提交依然在主分支上,所以要想在dev分支上进行提交,得切换到dev分支

git checkout
切换分支

如果你想同时创建并且切换分支,则使用 git checkout -b xxxx



git merge
如果你现在需要将master的代码合并到demo分支去,那么你首先需要切换到demo分支,然后使用git merge master就可以自动将代码合并过去


如果遇到如下图所示的冲突

需要先修改冲突部分后再提交

git branch -d/git branch -D
删除分支。d与D区别在于XXX分支如果没有被合并,使用d删除就会报错;D则无视

假设我手贱,误删了分支,这时候怎么恢复呢?我们使用git log --branches="被删的分支名"查询被删除的分支的commitId,通过相应id再使用git branch 被删的分支名 版本id即可恢复


git stash
我们会遇到一种场景:我们在开发过程中,在dev分支写的很high,然后这时候领导告诉你,有客户投诉你上一个版本什么地方会闪退,然后你突然一方,直接add就切换想去看看了,这时候你checkout肯定是失败了

一般在代码还没写完的情况下我们是不会提交本次修改信息的,那么我们就临时使用git stash去保存当前状态,切换完分支再回来之后,使用git stash apply或者git stash pop去恢复。git stash apply恢复后,stash内容并不删除,你需要用git stash drop来删除,git stash pop是直接删除stash内容


git tag
刚才我们注意到分支的旁边有一个tags
tags与分支的功能是差不多的,我们给master添加一个v1.0的标签

然后使用git tag列出所有本仓库所有标签

同样,上传分支

看看结果

标签可以通过的checkout去切换,但是最好不要直接对其进行操作,因为切换后的标签实际上在一个空分支上,最终还是得创建一个分支去提交最终得操作
参考文档
Git大法好——1.Git的引入以及概念解析
Git大法好——2.Git本地操作指令详解
Git大法好——3.Git分支本地操作详解
Git大法好——4.Github作为远程仓库的使用详解
网友评论