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的世界,Follow me
- 在F盘创建文件夹GitRep,充当git仓库
- 进入目录GitRep,点击鼠标右键,点击Git Bash Here
- 输入命令行git init,创建仓库成功
三. Git基本操作
添加文件
在仓库中新建文件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
不需要提交任何文件, 工作区是干净的
版本控制
这时咱们的一共添加了两版本的文件,版本一:提交文件,版本二:加入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
- 修改版本注释信息
对于版本三我们可以更改其版本信息,在命令行输入
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返回,会依次跳到三次提交的文本编辑页面,在编辑页面修改备注信息即可,如图为修改第三个版本备注信息:
修改结束,查看日志如图:
四. 理解工作区与暂存区
基本概念
工作区:就是电脑上看到的目录,在咱们的仓库中就是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一次提交,提交之后再查看状态会提示工作区是干净的管理,撤销,删除
上一步我们想暂存区添加了,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
五. 远程仓库
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文件的内容:
完成配置,下面添加版本库并进行关联添加版本库
我们需要在github上创建git仓库,如下图
创建完成后,可以看到,GitHub给我们的提示内容,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在我们在本地已经存在仓库,运行命令git remote add origin https://github.com/GaoStudio/GitRep.gitgit push -u origin master
当然仓库地址要换成自己的,这样现在你就拥有了真正的分布式版本库了!
clone仓库
我们如果换了一台电脑,想把github上的项目拉下来继续开发,并加入版本库,可以使用clone库,现在我们在D盘,创建文件夹GitRepClone,打开bash输入命令git clone https://github.com/GaoStudio/GitRep.git
既可以把github上的GitRep来了下来,其实这时候就可以协同开发,但是在真正的项目中,并不会这样开发,一般会创建dev分支,在dev分支上协同开发,在master上发版,接下来介绍分支
六. 分支管理
创建和合并分支
当我们创建我们的版本库的时候,其实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,查看版本信息是也可查看到之前的分支记录
解决冲突
根据上面的合并我们的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查看版本信息即为
推送分支
现在我们的远程master还停留在hello git v3,现在把dev分支推送到github,使用命令git push origin dev
查看版本信息,github生成了一个dev分支也指向dev本地dev,现在把master推送过去,结果如下:
即完成同步抓取分支
抓取分支需先从服务端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常用命令总结
新建代码库
# 在当前目录新建一个Git代码库$ git init# 新建一个目录,将其初始化为Git代码库$ git init [project-name]# 下载一个项目和它的整个代码历史$ git clone [url]
配置
# 显示当前的Git配置$ git config --list# 编辑Git配置文件$ git config -e [--global]# 设置提交代码时的用户信息$ git config [--global] user.name "[name]"$ git config [--global] user.email "[email address]"
增加/删除文件
# 添加指定文件到暂存区$ 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]
文件提交
# 提交暂存区到仓库区$ 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] ...
分支
# 列出所有本地分支$ 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]
标签
# 列出所有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]
查看信息
# 显示有变更的文件$ 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
远程同步
# 下载远程仓库的所有变动$ 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
撤销
# 恢复暂存区的指定文件到工作区$ 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
- 17.3.02 Git学习笔记
- 【git】git学习笔记
- 二 git学习笔记02
- Git学习笔记-Git Branching
- Git学习笔记:Git命令
- git常用命令-Git学习笔记
- Git学习笔记--Git入门
- Git 学习笔记 --- 自定义Git
- Git学习笔记02-- 初次运行 Git 前的配置
- Git学习笔记02_仓库操作
- git/github学习笔记
- git 学习笔记
- Git 学习笔记
- git学习笔记
- git 学习笔记
- Git学习笔记 - 1
- Git学习笔记
- Git学习笔记 - 1
- 1. java对象 引用
- 解决win10用户权限导致软件启动异常问题
- 一步一步走向自定义控件
- Java —— 静态变量的声明和初始化
- PAT A1090 highest price of supply chain(25)
- 17.3.02 Git学习笔记
- iOS内存泄露检测工具MLeaksFinder
- 九度OJ 题目1023:EXCEL排序
- 线程池的最优大小
- mysql 带参数的存储过程插入百万条记录示例
- thread.join()的实例
- quartz定时持久化改造
- linux cut用法
- Ubuntu 安装TensorFlow安装