一文掌握git的基本操作

    科技2025-07-18  8

    0.基础知识

    0.1 版本管理

    项目在开发的过程中, 经常会出现多人分工协作进行项目分发并开发整合的过程, 所以项目在刚开始流行的时候经常会出现一些协作开发的同步的问题, 同时存在项目整体进度的控制和管理的问题,所以在程序开发行业衍生出来了版本管理工具。常见的版本管理工具有svn和git等等。Linus大神因为忍受不了其他的版本管理工具,亲手写了git这个软件,这也是github的基石,大神毕竟是大神,在此膜拜一下。

    下图表示了实际开发过程中的版本管理流程图

    0.1 git和svn的区别

    svn是增量式的更新 git每个版本都单独存储一个独立的拷贝,这样牺牲了空间,换区了分支管理带来的便利

    0.2 git的三棵树

    git中存在着工作目录、暂存区和git仓库三个重要的树

    0.3 git中文件的状态

    包括untracked/unmodified/modified/staged等四种状态,如下

    1.初始化git项目

    1.1 git config

    git config --global user.name "XXX" #设置用户名 git config --global user.email "XXX" #设置邮箱名 git config --list #查看配置信息,比如用户名和邮箱信息都可以在打印信息中查看到

    1.2 git init

    该命令用来初始化一个git项目,初始化完了之后,在该目录下会出现一个.git文件夹,里面包含了用来管理这个项目的一些配置文件,一般情况下不要去动他们。

    2.git的工作流程

    2.0 git的三棵树

    上文提到的git的三棵树在其工作流程中有着自己独特的作用,具体的工作内容如下所示:

    2.1 git add

    该指令用来将文件添加到暂存区域,使用的语法如下:

    git add filename

    一般使用之后没有什么反应,因为这个是常规操作,所以不带来额外的信息,一旦把文件添加到了暂存区,git就会对这些文件进行跟踪,也就是track。

    2.2 git commit

    该指令将暂存区域中的文件提交到git仓库,使用的语法如下:

    git commit -m "注释"

    如果成功运行,会返回结果如下所示

    2.3 git commit -am

    相信当你使用Git有一段时间之后你渐渐发现git add 和 git commit 是使用得如此之频繁,要是能把它合并成一步或一条命令操作就好了。 其实git早就想到了这一点,只需要在git commit的时候使用-am参数就可以完成以上得到需求:

    git commit -am "注释"

    3. 查看工作状态和历史提交

    3.1 git status

    直接输入这个命令,我们可以看到目前版本的状态信息。

    如果所有文件都已经提交了,那么会显示一下信息: 如果有新的文件添加进来,我们会看到如下提示: 这表明git检测到这个文件在working directory里面,但是没有添加到index中,所以是没有被track到的,因此git建议将文件add到index中,这样就可以对文件进行track了。

    3.2 git reset HEAD

    我们可以使用git reset HEAD指令来返回add的操作,也就是把暂存区的文件退回到工作区中。

    3.3 git checkout

    如果在工作区域修改了一些内容出了问题,我们想退回到暂存区域中的版本,我们可以使用git checkout指令来进行回退。

    git checkout -- filename

    这个命令要慎用,毕竟回退了之后你的修改就没有了。

    3.4 git log

    我们可以使用git log指令来查看版本修改的日志,排序是从近到远的顺序 注意commit的那一行是一个sha1的哈希,这个是为了多人协作时候产生的冲突

    我们还可以使用以下参数来定制化打印log

    git log --decorate --online --graph --all

    4.版本回滚快照

    4.1 git reset

    其实,我们懂得了git工作流程的原理之后,这些指令的含义就非常简单了,我们可以通过以下的图形来对各个指令进行可视化的理解。 reset命令回滚快照有三步如下,我们可以使用git reset命令进行版本的回滚 默认的reset是使用mixed的参数,也就是如果回滚的话,在工作区域不一定能看得到文件,需要checkout把暂存区的文件拉回到工作区域或者直接使用–hard参数一步到位。

    除了整体的回滚之外,还可以通过制定文件名的方式来将某一个具体的文件回滚到制定的版本快照:

    4.2 git reflog

    往前回滚的时候,我们经常会遇到git log找不到id号的窘境,这个时候,为了找到回滚的快照的id,我们可以使用git log,也可使用gitreflog来查看

    5. 版本文件对比

    5.1 git diff

    可以使用该指令比较暂存区和工作区文件的区别 我们看到git把两个文件存放到了a和b两个文件夹中进行比较,@@后面表示修改文件的位置,-表示旧文件,后面的1表示从第1行开始打印,5表示显示了旧文件中的5行内容;同理, +表示新文件,1表示从第1行开始打印,后面的数字5表示行号,也就是打印了5行内容。

    当然,我们也可以通过指定快照的id号来精确的对比,如下所示:

    如果只有一个id,git会比较当前工作目录和制定id的快照之间的diff,当然如果是最新版本的快照,我们只需要使用HEAD指针作为快照id即可。 如果是需要比较stage和repository之间的区别,我们则可以使用–cached参数如下 终极奥义可以通过以下图形进行对比,我们看到,其实只要搞清楚了工作流程和三棵树,这些都比较容易理解:

    6. 修改提交amend

    6.1 git commit --amend

    我们不可避免的在提交的时候会犯一些错误,然后想修改但是不想增加新的版本,这个时候我们就可以使用amend更正指令来进行修改了。 效果如下:

    7.恢复误删文件

    7.1 git checkout – filename

    使用checkout命令就可以把暂存区的文件恢复过来啦

    git checkout -- filename

    8.删除误提交的文件

    8.1 git rm filename

    如下所示,我commit了一些奇怪的东西,删除了但是留下了痕迹。

    我们可以使用以下指令的组合来不留痕迹的删除错误提交的文件,第一步是git rm指令,第二步是reset指令回滚HEAD指针。

    git rm filename git reset --soft HEAD~

    我们看到,gitlog中没有奇奇怪怪的提交信息了

    当然,如果我们想只删除暂存区域的文件,或者遇到工作区域和暂存区域文件冲突的情况,我们可以使用对应的参数指令来强制删除。

    总结一下,删除指令这么使用:

    9. 重命名文件

    我们一般不直接在工作区域修改文件的名字,这样会让git认为你新建了一个新的文件,正确的做法是使用以下指令

    git mv oldname newname

    效果如下,git认为你进行了rename操作 git的一句mv指令实际上打包了以上3个指令的全部内容

    10. git 分支管理

    git分支的优点:一个字“快”!

    10.1 创建分支

    使用一下指令就可以创建分支了

    git branch branchname

    创建之后,我们看到git log中新增了一个分支

    10.2 切换分支

    使用以下指令,我们可以切换到指定的分支

    git checkout branchname

    我们看到,git告诉我们switch到了feature分支上,并且HEAD指针指向了feature

    我们也可以使用以下语句来在创建的同时切换分支,一步到位:

    git checkout -b feature2

    10.3 合并分支

    我们可以使用merge命令来分支两个branch,在一个branch下,输入以下指令即可:

    git merge branchname

    但是,一般情况下都会遇到conflict也就是冲突的情况,这个时候就需要手动修改冲突 我们此时如果打开冲突的那个文件,可以看到git给文件进行了一些注释,如下: 我们把文件改成正确的样子,然后运行add和commit操作,就可以完成update操作了

    10.4 删除分支

    我们只需要使用以下命令就可以删除不必要的分支了

    git branch -d branchname 或者 git branch --d branchname

    注意-d是–d的精简形式,这是命令行的一种约定成俗的规矩

    我们可以看到feature2分支已经从log中消失了,我们再切换到feature2分支的时候会发现这个分支已经是notfound状态了,说明已经被成功的删除了。

    10.5 匿名分支

    我们可以使用checkout HEAD~指令来进入一个分支,这个分支没有名字,被称为匿名分支。下图是使用checkout指令来到之前3步的匿名分支之后的截图

    git checkout HEAD~3

    一向不善言辞的 Git 这次似乎说了很多话,帮大家翻译一下:

    当前的 HEAD 指针处于分离状态,你可以环顾四周,做一些实验性修改并提交它们,并且你可以在这个状态中丢弃任何你所做的提交,而不影响任何分支,做法是执行 checkout 命令切换回别的分支。 如果你希望创建一个新分支,并保持你所做创建的提交,你可以(现在或稍后)通过使用带有 -b 选项的 checkout 命令实现。例如: git checkout -b <new-branch-name> HEAD 指针当前指向 52861cf... 2.txt

    你使用了 checkout 命令但没有指定分支名,所以 Git 帮你创建了一个匿名分支,OK,既然是匿名,那么当你切换到别的分支时,这个匿名分支中的所有提交都会被丢弃掉(因为你都没给人家命名,反正以后都找不回了,不丢了干啥?)。因此,你可以利用匿名分支来做做实验什么的,反正不会有负面影响。

    11. 与github联动

    首先还是上原理图,理解了原理图,指令就非常简单了,这里的远程仓库其实就是github服务器。

    11.1 git clone

    我们可以通过以下指令来将github中的项目fork(复制)到本地

    git clone httpAddress

    11.2 git push

    经过修改之后,我们根据之前的操作进行本地仓库代码的修改,最后可以使用以下命令push代码到github服务器上

    git push

    操作截图如下 操作完之后,我们可以看到github中已经成功的更新了,成功完成任务!

    12.图解总结

    我们最后引用这两张图来对文章进行一个原理性的总结

    参考文献: 1.Git 实用教程(小甲鱼 2.深入浅出图解Git,入门到精通(保姆级教程)

    Processed: 0.011, SQL: 8