git基础操作

git:基于C语言开发的分布式版本控制系统

  • 安装git

    yum install -y git
    

git操作

  • 创建版本库

    版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

    $ mkdir project
    $ cd project/
    $ ls
    $ git init
    Initialized empty Git repository in F:/GitRepository/project/.git/
    
    $ ls -a
    ./  ../  .git/
    
  • 提交文件

    工作区:就是你在电脑上看到的目录,比如目录下里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。

    版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

    把文件往Git版本库里添加的时候,是分两步执行的:

    第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

    所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

    # 因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识
    # git config --global user.email "you@example.com"
    # git config --global user.name "Your Name"
    $ git config --global user.name "zzy"
    $ git config --global user.email "2284156175@qq.com"
    # git add 添加至缓存区
    $ git add test.txt
    # git status 查看是否有文件未提交
    $ git status
    On branch master
    
    No commits yet
    
    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
            new file:   test.txt
    # git commit 把文件提交到仓库
    ## -m 参数:提交的注释
    ## 1 file changed:1个文件被改动(我们新添加的readme.txt文件);
    ## 4 insertions:插入了两行内容(readme.txt有两行内容)。
    $ git commit -m "test"
    [master (root-commit) d677b5b] test
     1 file changed, 4 insertions(+)
     create mode 100644 test.txt
    

    第一次修改 -> git add -> 第二次修改 -> git commit

    Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

    验证:

    # 当前没有需要提交的修改
    $ git status
    On branch master
    nothing to commit, working tree clean
    $ cat test.txt
    111111
    222222
    333333
    444444
    # 修改文件
    $ cat test.txt
    111111
    222222
    333333
    444444
    555555
    # 提交至缓存区
    $ git add test.txt
    $ git status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   test.txt
    # 第二次修改文件
    $ cat test.txt
    111111
    222222
    # commit提交
    $ git commit -m "modiffied 7"
    [master 1bf4353] modiffied 7
     1 file changed, 1 insertion(+)
     # 查看状态却发现还有未提交的修改
     $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
            modified:   test.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    # 虽然工作区看到的文件是第二次修改的样子,但是diff仍能看到文件的改动
    $ git diff test.txt
    diff --git a/test.txt b/test.txt
    index 78e88e4..06ec666 100644
    --- a/test.txt
    +++ b/test.txt
    @@ -1,5 +1,2 @@
     111111
     222222
    -333333
    -444444
    -555555
    \ No newline at end of file
    # 退回至刚刚commit后的版本,不难发现,commit只提交了第一次git add至缓存区的内容,第二次修改并未提交
    $ git reset --hard HEAD
    HEAD is now at 1bf4353 modiffied 7
    $ cat test.txt
    111111
    222222
    333333
    444444
    555555
    
  • 跟踪文件修改信息

    # 修改测试文件
    # 查看状态
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
            modified:   test.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    # 提交
    $ git add test.txt
    # 查看期间文件修改了什么内容
    $ git diff test.txt
    diff --git a/test.txt b/test.txt
    index 07ece74..3801997 100644
    --- a/test.txt
    +++ b/test.txt
    @@ -4,4 +4,5 @@
     444444
     55555
     666666
    -撒大大
    \ No newline at end of file
    +撒大大
    +阿斯顿
    \ No newline at end of file
    $ git commit -m "modefied 1"
    [master 120934a] modefied 1
     1 file changed, 4 insertions(+), 1 deletion(-)
    # 查看日志
    ## git log命令显示从最近到最远的显示日志
    $ git log
    commit 120934a3c175421a09c499590124636c671a9f62 (HEAD -> master)
    Author: zhaoziyan <2284156175@qq.com>
    Date:   Mon May 31 17:38:43 2021 +0800
    
        modefied 1
    
    commit d677b5bbd489bdcdc144773a045ae3123926c95b
    Author: zhaoziyan <2284156175@qq.com>
    Date:   Mon May 31 17:23:00 2021 +0800
    
        test
    ## 如果嫌上面显示的信息太多的话,我们可以使用命令 git log –pretty=oneline
    $ git log --pretty=oneline
    120934a3c175421a09c499590124636c671a9f62 (HEAD -> master) modefied 1
    d677b5bbd489bdcdc144773a045ae3123926c95b test
    
  • 版本回退

    1. 通过git内部变量回退
    $ git log
    commit b8073973eb7ed3f0a3d94fc552cf236da7530351 (HEAD -> master)
    Author: zhaoziyan <2284156175@qq.com>
    Date:   Mon May 31 17:45:58 2021 +0800
    
        modiffied 3
    
    commit 184a6754b427497f50cd5e0f3a01baa5767fa06d
    Author: zhaoziyan <2284156175@qq.com>
    Date:   Mon May 31 17:45:21 2021 +0800
    
        modiffied 2
    
    commit 120934a3c175421a09c499590124636c671a9f62
    Author: zhaoziyan <2284156175@qq.com>
    Date:   Mon May 31 17:38:43 2021 +0800
    
        modefied 1
    
    commit d677b5bbd489bdcdc144773a045ae3123926c95b
    Author: zhaoziyan <2284156175@qq.com>
    Date:   Mon May 31 17:23:00 2021 +0800
    
        test
    # 回退上一版本
    ##        HEAD        当前状态 
    ##        HEAD^       上一次状态
    ##        HEAD^^      上上次状态 
    ##        HEAD~10
    $ git reset --hard HEAD^
    HEAD is now at 184a675 modiffied 2
    $ git log --pretty=oneline
    184a6754b427497f50cd5e0f3a01baa5767fa06d (HEAD -> master) modiffied 2
    120934a3c175421a09c499590124636c671a9f62 modefied 1
    d677b5bbd489bdcdc144773a045ae3123926c95b test
    
    

    2.通过git记录的每次修改的ID实现版本回退

    # 查看操作ID
    $ git reflog
    184a675 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
    b807397 HEAD@{1}: commit: modiffied 3
    184a675 (HEAD -> master) HEAD@{2}: commit: modiffied 2
    120934a HEAD@{3}: commit: modefied 1
    d677b5b HEAD@{4}: commit (initial): test
    $ git reflog test.txt
    184a675 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
    b807397 HEAD@{1}: commit: modiffied 3
    184a675 (HEAD -> master) HEAD@{2}: commit: modiffied 2
    120934a HEAD@{3}: commit: modefied 1
    d677b5b HEAD@{4}: commit (initial): test
    # 版本控制回退
    $ git reset --hard b807397
    HEAD is now at b807397 modiffied 3
    
    
  • 撤销修改

    1.撤销未提交的修改

    # git checkout  -- file 可以丢弃工作区的修改,将文件在工作区做的修改全部撤销,如果没有 -- 的话,那么命令变成创建分支了
    ## 文件自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。
    ## 另外一种是文件已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
            modified:   test.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    $ git checkout -- test.txt
    $ git status
    On branch master
    nothing to commit, working tree clean
    
    

    2.撤销已经提交到暂存区的修改

    git reset HEAD 是将暂存区和HEAD的提交保持一致,拉取最近一次提交到版本库的文件到暂存区,改操作不影响工作区

    简单的来说 就是可以帮我们从版本库中 拉取文件到 暂存区 当我们把工作区的某个文件弄乱了 我们就可以使用该命令 把版本库中的那个文件拉到暂存区 然后在拉回工作区

    git reset --hard HEAD 是将工作区、暂存取和HEAD保持一致

    $ git diff test.txt
    diff --git a/test.txt b/test.txt
    index 07ece74..e69de29 100644
    --- a/test.txt
    +++ b/test.txt
    @@ -1,7 +0,0 @@
    -111111
    -222222
    -333333
    -444444
    -55555
    -666666
    -撒大大
    \ No newline at end of file
    $ git add test.txt
    $ git diff test.txt
    diff --git a/test.txt b/test.txt
    index e69de29..d39cda9 100644
    --- a/test.txt
    +++ b/test.txt
    @@ -0,0 +1,2 @@
    +aaa
    +bbb
    \ No newline at end of file
    $ git status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   test.txt
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
            modified:   test.txt
    $ git reset HEAD test.txt
    Unstaged changes after reset:
    M       test.txt
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
            modified:   test.txt
    $ git checkout -- test.txt
    # 相当于git reset HEAD之后紧接着又checkout
    $ git reset --hard HEAD
    HEAD is now at 1d91802 modiffied 5
    

    3.撤销已经提交到工作区的修改

    通过git记录的每次修改的ID实现版本回退

  • 删除文件

    # 删除文件
    $ git rm test.txt
    rm 'test.txt'
    $ git status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            deleted:    test.txt
    # 恢复文件
    $ git reset HEAD test.txt
    Unstaged changes after reset:
    D       test.txt
    $ git checkout -- test.txt
    # 彻底从版本库中删除
    $ git rm test.txt
    rm 'test.txt'
    $ git commit -m "delete 1"
    [master c46c5cc] delete 1
     1 file changed, 7 deletions(-)
     delete mode 100644 test.txt
    # 恢复文件
    $ git reset --hard HEAD^
    HEAD is now at 1d91802 modiffied 5
    

git分支

  • 创建与合并分支

    在版本回填退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

    # 创建分支
    $ git branch dev
    # 查看分支
    $ git branch
      dev
    * master
    # 切换分支
    $ git checkout dev
    Switched to branch 'dev'
    $ git branch
    * dev
      master
    # 删除分支
    $ git branch -d test
    Deleted branch test (was 1bf4353).
    # 合并分支
    ## 将指定的分支合并到当前分支
    $ git merge master
    Already up to date.
    
  • 分支管理策略

    通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息,现在我们来使用带参数 –no-ff来禁用”Fast forward”模式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 由于Git是一个分布式的版本控制系统,所以在本机上的某一个文件夹(learngit)中使用”git init“就创...
    0进阶的菜鸟0阅读 90评论 0 0
  • 本节课程我们将完成一次从本地仓库修改代码、提交并推送到远程仓库的操作。 Git 本地仓库有三大区域:工作区、暂存区...
    Manchangdx阅读 466评论 0 0
  • 为什么学习git 工作必备 提升团队协作效率 面试加分项 学习目标 安装、使用 对文件的基础操作 对分支的基础操作...
    流眸Tel阅读 287评论 0 1
  • 版本控制的关键是可撤销性,即可以使项目回退到某些操作之前状态。Git作为一款非常优秀的版本控制软件具备了丰富的撤销...
    此间有道阅读 409评论 0 0
  • 初始化本地仓库 Git 使用git init命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的...
    朝鹿志阅读 68评论 0 0