17.3.02 Git学习笔记

来源:互联网 发布:各种软件神器手机软件 编辑:程序博客网 时间:2024/06/06 06:37

Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。—-百度百科

一. Git安装
安装包下载地址:http://msysgit.github.io/,默认选项安装即可,安装完成后点击右键弹出快捷菜单会出现Git GUI Here,Git Bash Here选项。在开始菜单的git目录下可以看到这两个选项,点击Git Bash Here会弹出如下界面
Git命令窗口
即Git安装成功,此窗口就是接下来一直会使用的git命令行窗口!
二. Git创建仓库

接下来将从创建仓库开始,进一步进入Git的世界,Follow me   
  1. 在F盘创建文件夹GitRep,充当git仓库
  2. 进入目录GitRep,点击鼠标右键,点击Git Bash Here
  3. 输入命令行git init,创建仓库成功

三. Git基本操作

  1. 添加文件
    在仓库中新建文件note.txt,在命令行依次输入以下命令

    git add note.txtgit commit -m "第一次添加note.txt"
    • 其中git add note.txt 是把文件note.txt添加到仓库
    • commit 命令是将文件提交到仓库 -m 后面是本次提交的说明,如果直接输入命令git commit命令不加-m注释则会跳入一个让你编写注释的页面,在此页面中按下Esc 键输入:wq即可退出到命令页面,如果你实在不想对本次提交添加注释可以使用以下命令
      git commit --allow-empty-message -m  ""

    至此就完成了将note.txt文件加入了Git版本库控制
    接下来打开note.txt添加数据,我在这里添加hello git,运行git status命令,可以查看当前版本库的状态,如下结果:

    $ git statusOn branch masterChanges not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git checkout -- <file>..." to discard changes in working directory)        modified:   note.txtno changes added to commit (use "git add" and/or "git commit -a")

    提示我们note.txt文件有修改,可通过 git diff note.txt命令查看修改内容。这是就可以通过add 和 commit命令把修改过的note.txt文件提交到版本库,其中可以试着使用git status命令查看版本库状态。最终状态会是如下:

    On branch masternothing to commit, working directory clean

    不需要提交任何文件, 工作区是干净的

  2. 版本控制

    这时咱们的一共添加了两版本的文件,版本一:提交文件,版本二:加入hello git ,我们可以使用git log 查看文件日志显示如下:
    这里写图片描述
    也可使用以下命令,显示简化日志信息

     git log --pretty=oneline

    为了更好的演示我们加入版本三,使用add 和 commit命令,查看日志,现在版本库中一共有三个版本:
    这里写图片描述
    但这是我们想会退到上一个版本,可以使用以下命令:

    git reset --hard HEAD^

    即可回到hello git 版本二中,可以使用git log 查看日志,会发现版本库中还有两个版本,如果我们现在还行再回到第三个版本中,我们可以使用commit id 代替HEAD^,commit id 就是类似上图中fa61c9eb…6748一长串字符,现在可以在返回第三个版本中

     git reset --hard fa61c9eb9f

    commit id可以不写全,git 会自动去找,如果回退之后没有记住版本三的commit id 可以使用以下命令查看

     git reflog
  3. 修改版本注释信息
    对于版本三我们可以更改其版本信息,在命令行输入

    git commit --amend

    会进入文本编辑页面,如图,在第一行更改为 hello git v2 ,之后再退出:wq
    这里写图片描述
    其实命令git commit –amend 就是重做上一次提交信息,而版本一加入note.txt文件的时候,咱们没用加入日志,版本二加入了日志 hello git,现在我们想给第一次提交加上日志,第一次嘛,总是要留下点什么。。。→_→,我最初的思路是使用reset –hard回到版本一,在使用commit –amend 修改注释,最后在回到版本三,但是会发现注释依旧没有添加上,那么如何给版本一添加注释呢,可以使用rebase 命令,具体操作如下:
git rebase -i --root

使用此命令会弹出界面
这里写图片描述
修改pick 为reword 在这我们修改三次提交的备注分别为 v1,v2,v3:
这里写图片描述
输入:wq返回,会依次跳到三次提交的文本编辑页面,在编辑页面修改备注信息即可,如图为修改第三个版本备注信息:
这里写图片描述
修改结束,查看日志如图:
这里写图片描述

四. 理解工作区与暂存区

  1. 基本概念

    工作区:就是电脑上看到的目录,在咱们的仓库中就是GitRep目录就是一个工作区版本库:工作区有一个隐藏目录.git,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD

    我们向版本库添加文件的时候使用了add和commit命令,实际上第一步add的时候就是把文件修改添加到暂存区,commit就是把暂存区的所有内容提交到当前分支。下面可以具体看一下:

    修改note.txt文件内容为hello git v4,并在目录下添加一个新文件demo.txt,内容为demo,使用git status查看状态:
    这里写图片描述
    可以看到,git提示我们,note.txt文件有修改,demo.txt是Untracked files文件,现在我们使用add命令把这两个文件加入到暂存区,再使用git status 查看状态如下:
    这里写图片描述
    可以看到,暂存区有两个文件可以提交,我们可以使用commit一次提交,提交之后再查看状态会提示工作区是干净的

  2. 管理,撤销,删除
    上一步我们想暂存区添加了,note.txt和demo.txt文件,如果我们暂时不进行commit,修改demo.txt文件内容为demo v1,查看状态如图:
    这里写图片描述
    会提示我们demo.txt文件有修改,如果我们现在使用commit提交,这个时候只是提交了暂存区的内容,而对于demo.txt最新的修改并没有提交,可以使用git status查看,如果需要把最新的修改一次提交,就需要在commit的之前对demo.txt再执行一次add操作,这里不再演示。
    如果对于暂存区的内容,想撤销修改,我们可以使用 reset命令。例如上一步中,如果突然不想把demo.txt文件添加进版本库了,可以使用命令:

     git reset HEAD demo.txt

    这是在查看状态
    这里写图片描述
    即demo.txt没有加入暂存区,这是使用commit提交,只提交了note.txt的修改;
    对于demo.txt文件我们就可以使用以下命令,进行删除了

    $ rm demo.txt

    如果我们已经吧demo.txt添加到了版本库中,想再删除的话可以使用命令

    $ git rm demo.txt

五. 远程仓库

  1. github配置

    自行注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:

    第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:

    ssh-keygen -t rsa -C "你的邮箱地址"

    由于我本地此前运行过一次,所以本地有,如下所示:
    这里写图片描述
    id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
    第二步:登录github,打开” settings”中的SSH Keys页面,然后点击“Add SSH Key”,填上任意title,在Key文本框里黏贴id_rsa.pub文件的内容:
    这里写图片描述
    完成配置,下面添加版本库并进行关联

  2. 添加版本库
    我们需要在github上创建git仓库,如下图
    这里写图片描述
    创建完成后,可以看到,GitHub给我们的提示内容,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
    这里写图片描述
    现在我们在本地已经存在仓库,运行命令

    git remote add origin https://github.com/GaoStudio/GitRep.gitgit push -u origin master

    当然仓库地址要换成自己的,这样现在你就拥有了真正的分布式版本库了!

  3. clone仓库
    我们如果换了一台电脑,想把github上的项目拉下来继续开发,并加入版本库,可以使用clone库,现在我们在D盘,创建文件夹GitRepClone,打开bash输入命令

     git clone https://github.com/GaoStudio/GitRep.git

    既可以把github上的GitRep来了下来,其实这时候就可以协同开发,但是在真正的项目中,并不会这样开发,一般会创建dev分支,在dev分支上协同开发,在master上发版,接下来介绍分支

六. 分支管理

  1. 创建和合并分支

    当我们创建我们的版本库的时候,其实git给我们默认创建master分支,以上我们的操作都是在master中进行的,而git的版本回退操作其实是操作的head指针,我们可以通过gitk使用可视化界面查看,指针的位置。接下来我们开始创建dev分支:

    git checkout -b dev  创建分支git branch查看分支

    这里写图片描述
    这时使用gitk命令查看指针,
    这里写图片描述
    即 dev和master和remote/origin/master均指向当前版本,remote/origin/master代表远程库,现在我们在dev分支上开发,
    第一步:切换到dev分支 使用命令 git checkout dev
    第二步:修改note.txt,第二行添加,dev v1。再add commit到版本库
    第三步:可以使用命令gitk查看 结果如下:
    这里写图片描述
    结果即为dev向前移动,为了好演示,重复步骤加入dev v2
    现在dev分支上有了两次提交,回到主分支,git checkout master 查看note.txt,还是只有hello git v2,接下来将dev分支合并到主分支中,使用命令:

    git merge dev

    这里写图片描述
    这时查看note.txt中的内容,和dev分支中一样,注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快,可以使用gitk查看版本指向
    这里写图片描述
    具体说一下“快进模式”,如果这时候删除dev分支,再使用gitk查看分支信息的时候,是看不出有合并痕迹的,我们可以不使用快进模式,切换到dev分支中添加dev v3,然后在主分支上进行合并,合并时不使用Fast-forward模式,即使用命令

    git merge --no-ff -m "merge with no-ff" dev

    再使用gitk查看版本信息,如下图,把本次合并当做了一次commit,就是删除了分支dev,查看版本信息是也可查看到之前的分支记录
    这里写图片描述

  2. 解决冲突
    根据上面的合并我们的master和dev分支中note.txt内容一致,我们在master分支的最后一加上From master并提交到版本库,这是切换到dev分支,在note.txt文件最后一行添加From dev并提交,这个时候合并分支,会出现如下提示
    这里写图片描述
    及产生了冲突,这是打开note.txt文件会是以下内容:

    hello git v2dev v1dev v2dev v3<<<<<<< HEADFrom master=======From dev>>>>>>> dev

    Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们解决冲突修改如下后保存:

    $ git add readme.txt $ git commit -m "conflict fixed"

    使用gitk查看版本信息即为
    这里写图片描述

  3. 推送分支
    现在我们的远程master还停留在hello git v3,现在把dev分支推送到github,使用命令

    git push origin dev

    查看版本信息,github生成了一个dev分支也指向dev本地dev,现在把master推送过去,结果如下:
    这里写图片描述
    即完成同步

  4. 抓取分支
    抓取分支需先从服务端clone下来,咱们已经在D盘clone过之前的项目,其版本还停留在hello git v3版本,使用命令git branch查看本地分支,会看到只有master分支,若想再dev分支上开发,就必须创建远程origin的dev分支到本地,于是可用这个命令创建本地dev分支:

    git checkout -b dev origin/dev

    对于以后的获取可以使用git pull执行抓取,

    多人协作的工作模式通常是这样:

    1.首先,可以试图用git push origin branch-name推送自己的修改;

    2.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

    3.如果合并有冲突,则解决冲突,并在本地提交;

    4.没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

    如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令>git branch –set-upstream branch-name origin/branch-name。这就是多人协作的工作模式,一旦熟悉了,就非常简单。

六. git常用命令总结

  1. 新建代码库

    # 在当前目录新建一个Git代码库$ git init# 新建一个目录,将其初始化为Git代码库$ git init [project-name]# 下载一个项目和它的整个代码历史$ git clone [url]
  2. 配置

    # 显示当前的Git配置$ git config --list# 编辑Git配置文件$ git config -e [--global]# 设置提交代码时的用户信息$ git config [--global] user.name "[name]"$ git config [--global] user.email "[email address]"
  3. 增加/删除文件

    # 添加指定文件到暂存区$ git add [file1] [file2] ...# 添加指定目录到暂存区,包括子目录$ git add [dir]# 添加当前目录的所有文件到暂存区$ git add .# 添加每个变化前,都会要求确认# 对于同一个文件的多处变化,可以实现分次提交$ git add -p# 删除工作区文件,并且将这次删除放入暂存区$ git rm [file1] [file2] ...# 停止追踪指定文件,但该文件会保留在工作区$ git rm --cached [file]# 改名文件,并且将这个改名放入暂存区$ git mv [file-original] [file-renamed]
  4. 文件提交

    # 提交暂存区到仓库区$ git commit -m [message]# 提交暂存区的指定文件到仓库区$ git commit [file1] [file2] ... -m [message]# 提交工作区自上次commit之后的变化,直接到仓库区$ git commit -a# 提交时显示所有diff信息$ git commit -v# 使用一次新的commit,替代上一次提交# 如果代码没有任何新变化,则用来改写上一次commit的提交信息$ git commit --amend -m [message]# 重做上一次commit,并包括指定文件的新变化$ git commit --amend [file1] [file2] ...
  5. 分支

    # 列出所有本地分支$ git branch# 列出所有远程分支$ git branch -r# 列出所有本地分支和远程分支$ git branch -a# 新建一个分支,但依然停留在当前分支$ git branch [branch-name]# 新建一个分支,并切换到该分支$ git checkout -b [branch]# 新建一个分支,指向指定commit$ git branch [branch] [commit]# 新建一个分支,与指定的远程分支建立追踪关系$ git branch --track [branch] [remote-branch]# 切换到指定分支,并更新工作区$ git checkout [branch-name]# 切换到上一个分支$ git checkout -# 建立追踪关系,在现有分支与指定的远程分支之间$ git branch --set-upstream [branch] [remote-branch]# 合并指定分支到当前分支$ git merge [branch]# 选择一个commit,合并进当前分支$ git cherry-pick [commit]# 删除分支$ git branch -d [branch-name]# 删除远程分支$ git push origin --delete [branch-name]$ git branch -dr [remote/branch]
  6. 标签

    # 列出所有tag$ git tag# 新建一个tag在当前commit$ git tag [tag]# 新建一个tag在指定commit$ git tag [tag] [commit]# 删除本地tag$ git tag -d [tag]# 删除远程tag$ git push origin :refs/tags/[tagName]# 查看tag信息$ git show [tag]# 提交指定tag$ git push [remote] [tag]# 提交所有tag$ git push [remote] --tags# 新建一个分支,指向某个tag$ git checkout -b [branch] [tag]
  7. 查看信息

        # 显示有变更的文件$ git status# 显示当前分支的版本历史$ git log# 显示commit历史,以及每次commit发生变更的文件$ git log --stat# 搜索提交历史,根据关键词$ git log -S [keyword]# 显示某个commit之后的所有变动,每个commit占据一行$ git log [tag] HEAD --pretty=format:%s# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件$ git log [tag] HEAD --grep feature# 显示某个文件的版本历史,包括文件改名$ git log --follow [file]$ git whatchanged [file]# 显示指定文件相关的每一次diff$ git log -p [file]# 显示过去5次提交$ git log -5 --pretty --oneline# 显示所有提交过的用户,按提交次数排序$ git shortlog -sn# 显示指定文件是什么人在什么时间修改过$ git blame [file]# 显示暂存区和工作区的差异$ git diff# 显示暂存区和上一个commit的差异$ git diff --cached [file]# 显示工作区与当前分支最新commit之间的差异$ git diff HEAD# 显示两次提交之间的差异$ git diff [first-branch]...[second-branch]# 显示今天你写了多少行代码$ git diff --shortstat "@{0 day ago}"# 显示某次提交的元数据和内容变化$ git show [commit]# 显示某次提交发生变化的文件$ git show --name-only [commit]# 显示某次提交时,某个文件的内容$ git show [commit]:[filename]# 显示当前分支的最近几次提交$ git reflog
  8. 远程同步

     # 下载远程仓库的所有变动$ git fetch [remote]# 显示所有远程仓库$ git remote -v# 显示某个远程仓库的信息$ git remote show [remote]# 增加一个新的远程仓库,并命名$ git remote add [shortname] [url]# 取回远程仓库的变化,并与本地分支合并$ git pull [remote] [branch]# 上传本地指定分支到远程仓库$ git push [remote] [branch]# 强行推送当前分支到远程仓库,即使有冲突$ git push [remote] --force# 推送所有分支到远程仓库$ git push [remote] --all
  9. 撤销

     # 恢复暂存区的指定文件到工作区$ git checkout [file]# 恢复某个commit的指定文件到暂存区和工作区$ git checkout [commit] [file]# 恢复暂存区的所有文件到工作区$ git checkout .# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变$ git reset [file]# 重置暂存区与工作区,与上一次commit保持一致$ git reset --hard# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变$ git reset [commit]# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致$ git reset --hard [commit]# 重置当前HEAD为指定commit,但保持暂存区和工作区不变$ git reset --keep [commit]# 新建一个commit,用来撤销指定commit# 后者的所有变化都将被前者抵消,并且应用到当前分支$ git revert [commit]# 暂时将未提交的变化移除,稍后再移入$ git stash$ git stash pop

    参考链接
    http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

0 0
原创粉丝点击