Git的简单学习

来源:互联网 发布:电脑软件升级 编辑:程序博客网 时间:2024/06/06 02:01

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

前言

基本概念


在使用git的过程中,相信大家对工作区、暂存区、本地仓库以及远程仓库应该都心知肚明,从这幅图中大家也应该很清楚的看出4个名词的含义,在此不多说

准备工作

我们先在github上创建一个远程仓库gitstudy,路径为https://github.com/r17171709/gitstudy。然后在本地磁盘中随便创建一个gitstudy文件夹,里面放一个hello_git的txt文件,文件里面写着hello。准备工作完成

准备工作

基本操作

git init

初始化git仓库

git init

git add

添加文件到暂存区中

git add

可以同时添加多个文件比如git add a.txt b.txt

cat

查看文件的内容

cat hello_git.txt

git rm --cached

将文件从暂存区中移除

git rm --cached

git status

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

文件全都完成提交

尚有文件未完成提交

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

git commit

将暂存区的文件提交到本地仓库

git commit

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

git 第一次提交示意图

git 第二次提交示意图

我们每一次的提交会在当前分支上被记录为commit(A\B\C),最终git会将这些commit形成的快照以时间轴的形式展现出来。HEAD指针指向正在工作的本地分支,我们每次新增commit或者回滚commit,都是修改这些HEAD指针的指向而已

git push

上传到远程仓库去。首先将仓库地址命名为origin,这个名字没有硬性要求,只是一个习惯而已。然后往这个地址上push以上传

git push

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

上传结果

git diff

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

查看hello_git.txt的差别

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

查看整个分支中文件的差别

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的区别在于

  1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit,两者的方向是相反的
  2. git reset删除某一个commit之后,是不能直接提交,而git revert并不会

我们来看看实际操作流程

我们需要撤销b9b3c95版本并在之前版本进行一些修改
git revert b9b3c95

push之后自动生成流程文字,代表从change版本revert之后的来的版本

git log

查看所有commit记录

git log

git reflog

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

git reflog

分支

为什么要建立分支,想必人人都心中有数,没有分支会带来什么样的麻烦,无需多说

git branch

查看当前仓库下的所有分支。默认是master分支

git branch

这里当前分支都是用*前缀来表示的。

如果你要创建一个分支,直接 git branch xxx即可

git branch dev

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

新建分支后的示意图

git checkout

切换分支

git checkout dev


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

git checkout -b demo

新增并切换分支

在其他分支上提交并不影响主分支功能

git merge

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

git merge示意图


git merge master


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

merge 冲突


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

merge 冲突具体部分

git branch -d/git branch -D

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

git branch -d demo

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

git log --branches="dev"

git branch dev 6145e7

git stash

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

add之后直接checkout分支报错

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

git stash apply恢复之后,提示哪些文件被修改

git stash pop

git tag

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

git tag v1.0

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

git tag

同样,上传分支

git push origin v1.0

看看结果

上传结果

标签可以通过的checkout去切换,但是最好不要直接对其进行操作,因为切换后的标签实际上在一个空分支上,最终还是得创建一个分支去提交最终得操作

参考文档(简书作者)

Git大法好——1.Git的引入以及概念解析
Git大法好——2.Git本地操作指令详解
Git大法好——3.Git分支本地操作详解
Git大法好——4.Github作为远程仓库的使用详解



文/r17171709(简书作者)
原文链接:http://www.jianshu.com/p/29e6755c68de

0 0
原创粉丝点击