听说指令看起来比客户端骚——Git指令操作和使用

前言:

Git作为分布式版本控制系统,是我们工作和开源代码平台项目管理最火的工具之一,基本上是每个入职的同学都要熟知和学习的。由于我以前的公司都是用的SVN,有时也会用的github客户端,最近抽空来学习下Git的指令使用,听说这样的操作比较骚哦

一、Git下载

  • Git下载地址:https://git-scm.com/downloads
  • 这边我在win10安装,桌面右键打开Bash输入界面,在本地创建我们的测试仓库
    cd ..
    //进入d盘创建我们的测试仓库
    cd d:
    mkdir git_repository
    cd git_repository/
    //pwd打印当前目录地址
    $ pwd
    /d/git_repository
  • 通过git init初始化,ls -ah显示隐藏目录即可看到相应的文件,我们的git仓库便创建好了

    image

二、Gti文件状态生命周期和文件流向

1. Git文件状态通过git status查询,分别是Untracked,Unmodified,Modified,staged,对应关系如下图

image

下面我们来验证,我这边测试是我github上的一个demo,通过一个简单的txt文档的创建修改和提交,来演示这四种生命状态:

  • 创建新的文档,识别味Untracked状态

    image
  • 下面add a.txt,状态编码Umodified,显示我们可以直接commit,add之后修改文档,显示味Modified状态

    git_2.png
  • commit 文件,再次查看,状态回到了Unmodified,再次修改又回出现上一条的状态结果

    git_3.png

三、Git关联&推送&回退&删除&克隆操作以github为例

  1. 进入我的github个人账号,new a Repositories,我的项目名称:NativeRegisterDemo

  2. 关联并上传项目

     //进入项目工程目录,初始化工程目录为git仓库
     echo "# NativeRegisterDemo" >> README.md
     git init
     git add README.md
     git add . //此处为添加工程所有文件到git暂存区
     git commit -m "first commit"
     git remote add origin https://github.com/fmer/NativeRegisterDemo.git //关联一个远程仓库
     git push -u origin master //要求输入Github的账号密码,推送到主线
    
  3. **修改提交: **README.md

     git add README.md
     git commit -m "update my readme.md"
     git push -u origin master   
    
    image
  4. 查看提交日志:能看到我们的2次提交记录,git log --pretty=oneline 命令显示从最近到最远的提交日志,后缀"--pretty=oneline"为过滤信息,其中那一串

    image

  5. 回退我们的上一个版本,回退后我们再看log历史就只有一条提交记录了

     git reset --hard HEAD~1 //HEAD代表当前版本,0-100代表往后的版本,0为当前,1为上一个版本
     cat README.md//果然已经回退到上个 first commit版本
    
    • 参数含义:通过git reset --help查看

        git reset [<mode>] [<commit>]
        This form resets the current branch head to <commit> and possibly updates the index (resetting it to the tree of <commit>) and the working tree depending on <mode>. If <mode> is omitted, defaults to "--mixed". The <mode> must be one of the following:
        
        --soft
        Does not touch the index file or the working tree at all (but resets the head to <commit>, just like all modes do). This leaves all your changed files "Changes to be committed", as git status would put it.
        
        --mixed
        Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.
        
        If -N is specified, removed paths are marked as intent-to-add (see git-add(1)).
        
        --hard
        Resets the index and working tree. Any changes to tracked files in the working tree since <commit> are discarded.
        
        --merge
        Resets the index and updates the files in the working tree that are different between <commit> and HEAD, but keeps those which are different between the index and working tree (i.e. which have changes which have not been added). If a file that is different between <commit> and the index has unstaged changes, reset is aborted.
        
        In other words, --merge does something like a git read-tree -u -m <commit>, but carries forward unmerged index entries.
        
        --keep
        Resets index entries and updates files in the working tree that are different between <commit> and HEAD. If a file that is different between <commit> and HEAD has local changes, reset is aborted.
      
  6. 如果我们想再回到刚才"update my readme.txt"的版本,也就是在当前的版本上前进到未来版本,我们需要通过git reflog 查看操作记录,然后再通过reset 指定历史版本的commit id即可推进到我们最新的版本

     git reflog
     git reset --hard 4cabf0bd3fb24768bc108ef5bc81fa581d115fee
    
    image
  7. 撤销修改:git checkout -- file,将文件撤回到上一个commit或者add状态或者 通过git reset HEAD file将暂存区的修改撤回到工作区

  8. 删除文件,rm a.txt 删除本地 git rm a.txt 本地库删除 然后commit

  9. 从远程库克隆,上面说了推送本地项目到我们的github仓库,现在介绍如何克隆项目,我们还是这个项目,新建一个文件夹test

     git clone git@github.com:fmer/NativeRegisterDemo.git
    
  10. ssh的使用:以上一条clone为例,为了避免https麻烦的密码输入,我们可以选择使用ssh的方式,需要在本地和远程仓库关联一个ssh key,否则会被权限拒绝,如图操作。

    • 本地生成ssh的rsa密钥:ssh-keygen -t rsa -C fmer_lin@foxmail.com,会在本地生成一个.ssh文件夹,里面包含文件id_rsa和id_rsa.pub
    • 关联远程库,以github为例:在https://github.com/settings/keys页面新建一个SSH key,将本地id_rsa.pub内容复制进去,具体操作如下图:
      image

      image

四、Git项目分支创建管理

  1. 创建分支:git checkout -b branch_1 "git checkout -b "---创建并选择分支

  2. 查看分支:git branch

  3. 选择分支:git checkout master

    image

  4. 合并分支:git merge branch_1 ,可以通过指定参数--no-ff,如git merge --no-ff branch_1 禁用fast forward模式,默认味分支改动模式,这样方便知道改动内容

    image

  5. 合并冲突处理:再次在brach_1的a.txt添加内容再合并,会发现出现合并冲突,下图可以看到分别在主线和支线提交相同文档造成的冲突问题,合并后可通过指令查看:git log --graph --pretty=oneline --abbrev-commit

     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (master)
     $ git checkout branch_1
     M       a.txt
     Switched to branch 'branch_1'
     
     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (branch_1)
     $ echo modify_branch>merge.txt
     
     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (branch_1)
     $ git add merge.txt
     warning: LF will be replaced by CRLF in merge.txt.
     The file will have its original line endings in your working directory.
     
     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (branch_1)
     $ git commit -m "modify from branch_1"
     [branch_1 cc45372] modify from branch_1
     warning: LF will be replaced by CRLF in merge.txt.
     The file will have its original line endings in your working directory.
      1 file changed, 1 insertion(+)
      create mode 100644 merge.txt
     
     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (branch_1)
     $ git checkout master
     M       a.txt
     Switched to branch 'master'
     Your branch is ahead of 'origin/master' by 1 commit.
       (use "git push" to publish your local commits)
     
     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (master)
     $ echo modify_master>>merge.txt
     
     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (master)
     $ git add merge.txt
     warning: LF will be replaced by CRLF in merge.txt.
     The file will have its original line endings in your working directory.
     
     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (master)
     $ git commit -m "modify from master"
     [master 71e1e12] modify from master
     warning: LF will be replaced by CRLF in merge.txt.
     The file will have its original line endings in your working directory.
      1 file changed, 1 insertion(+)
      create mode 100644 merge.txt
     
     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (master)
     $ git merge branch_1
     Auto-merging merge.txt
     CONFLICT (add/add): Merge conflict in merge.txt
     Automatic merge failed; fix conflicts and then commit the result.
     
     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (master|MERGING)
     $ cat merge.txt
     <<<<<<< HEAD
     modify_master
     =======
     modify_branch
     >>>>>>> branch_1
    
     LP@lp MINGW64 /d/ipcdemo/test/NativeRegisterDemo (master)
     $ git log --graph --pretty=oneline --abbrev-commit
     *   71d1f1a fix my abort
     |\
     | * cc45372 modify from branch_1
     * | 71e1e12 modify from master
    
    
     |/
     * 0c2dc77 add from branch_1 tes
     * ab377d0 remove a.txt
     * f7b229e a.txt
     * 4cabf0b update my readme.md
     * bd26f65 first commit
    
  6. 删除分支:git branch -d brach_1

  7. 分支状态保管:git stash,保存当前的分支状态即工作内容,便地切换到其他分支工作,它的保存历史作为一个list存储,可以保存多次

    • git stash list查看列表
    • git stash apply 恢复,通过git stash apply stash@{x} x为保管列表id,指定恢复
    • git stash drop 取第一个恢复并删除
    • git stash drop 删除
  8. 关联本地分支和远程分支:git branch --set-upstream-to <branch-name> origin/<branch-name>

  9. 查看远程库信息:git remote -v

  10. 添加标签: git tag v1.0.0 在当前的commit上打标签,或者在后面指定commit id指定打在相应的commit记录上如:git tag v1.0.1 fsfag143

  11. 删除本地git仓库:find . -name ".git" | xargs rm -Rf 在线:rm -rf https://github.com/NeroSolomon/VLearning.git

四、在具体项目协作中如何整合版本

  • 在与同事协作开发时,如果出现同事事先提交了代码,我们再去push就会出现推送失败的情况,这是我们需要先抓取远程仓库代码,在本地合并后再提交
  • 要注意的时,抓取远程分支需要关联本地和远程分支,参考上节第8
  • 在抓取代码再提交中,学会使用rebase去把本地的分支提交记录归档成一条主线
  • 在提交代码或者版本时,打上标签,这样能让大家简单明了的浏览history,上节第10

好了,一些常用的指令操作已经学完了,快去练习一下吧。git的操作远远不止这些,在开发过程中可以参考他的中文指导文档:

https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5

参考文档:

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