Git&GitHub学习
---- Git本地仓库和命令 ----
本地库初始化
选择一个目录,使用命令创建一个目录,使用git init 命令将目录变成一个仓库,当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
mkdir 创建目录
pwd 显示当前目录
配置用户(设置签名)
形式:
用户名: abc
Email地址: abcde@qq.com
作用:
区分不同开发人员的身份
辨析:
这里设置的签名和登录远程仓库(代码托管中心)的用户名密码没有任何关系
命令:
1.项目级别/仓库级别:
当前本地库范围内有效
git config user.name xxx
git config user.email xxx@xxx.com
签名信息保存位置:当前仓库位置/.git/config文件
cat 打印、合并文件
2.系统用户级别:
登录当前操作系统的用户范围内有效
git config --global user.name xxx
git config --global user.email xxx@xxx.com
签名信息保存位置:~/.gitconfig文件(cat ~/.gitconfig)
3.优先级:
项目级别优先于用户系统级别,二者都有时使用项目级别;
如果只有系统用户级别的签名,就采用系统用户级别;
如果二者都没有则不允许;
添加文件
首先新建一个文件read.txt
(1)使用命令git add
将read.txt
添加到仓库:
(2)使用命令git commit
将read.txt
提交到仓库:
其中,-m
后面是本次提交的说明,1 file changed
表示有一个文件发生改动,2 insertions
表示插入了两行内容。
如果我们不小心直接使用了git commit
操作,而不是git commit -m "XXX"
操作的话,会弹出这样一个窗口提示我们输入为什么要合入本次修改
修改文件
首先,将我们的read.txt
文件修改一下,使用git status
查看当前仓库的修改状态,其中,modified: readme.txt
告诉我们,readme.txt
被修改了。
如果我们要看具体修改的是什么内容,使用git diff
命令来查看
其中,可以看出readme.txt
被修改了,修改内容是 + 修改修改修改 。
知道了修改内容,认为没有问题就可以将它提交到仓库里面了,也是同样的步骤git add <file>
,git commit -m "xxx"
版本穿梭
看到历史提交的数据命令:
git log 空格向下翻页,b向上翻页,q退出
git log --pretty=oneline
git log --oneline
git reflog HEAD@{移动到当前版本需要多少步}
前进后退:
①基于索引值[推荐]
git reset --hard 索引值
②使用^符号:只能后退
git reset --hard HEAD^
一个^表示后退一步,n个表示后退n步
③使用~符号:只能后退
git reset --hard HEAD~n
表示后退n步
撤销修改场景
假如read.txt
原内容为A,修改后为A+B:
①此时没有执行git add
操作,工作区想要恢复为A,则执行:
执行前,工作区内容为A+B,暂存区内容为A,版本库内容为A。
执行后,工作区内容变为A,暂存区内容为A,版本库内容为A。
②此时执行了git add
操作,想要撤回本次git add
操作(工作区恢复为A+B,暂存区恢复为A)则执行:
等同于
--mixed
表示重置HEAD
指针和暂存区,但是工作区内容保持不变。
执行前,工作区内容为A+B,暂存区内容为A+B,版本库内容为A。
执行后,工作区内容为A+B,暂存区内容为A,版本库内容为A。
③此时执行了git add
操作,想要撤回本次git add
操作(工作区恢复为A,暂存区恢复为A),则执行:
执行前,工作区内容为A+B,暂存区内容为A+B,版本库内容为A。
执行后,工作区内容为A,暂存区内容为A,版本库内容为A。
④此时执行了git add
操作和git commit
操作,想要撤回本次操作(工作区恢复为A+B,暂存区恢复为A+B,版本库恢复为A),则执行:
--soft
表示仅仅重置HEAD
指针,不重置工作区和暂存区的内容。
执行前,工作区内容为A+B,暂存区内容为A+B,版本库内容为A+B。
执行后,工作区内容为A+B,暂存区内容为A+B,版本库内容为A。
⑤此时执行git add
操作和git commit
操作,想要撤回本次操作(工作区恢复为A,暂存区恢复为A,版本库恢复为A),则执行:
执行前,工作区内容为A+B,暂存区内容为A+B,版本库内容为A+B。
执行后,工作区内容为A,暂存区内容为A,版本库内容为A。
mixed,soft,hard 比较:
-
--mixed
:重置HEAD
指针和暂存区,工作区保持不变。
说明:--mixed
后面可以接文件名或者指定的指针比如HEAD^
,接文件名时表示仅仅重置当前的暂存区(暂存区的内容还是HEAD
的),接指针比如HEAD^
时,表示重置当前的指针到HEAD^
,暂存区内容变为HEAD
时的内容(也就是空的)。 -
--soft
:后面只能接指针,仅仅重置版本(比如将当前版本HEAD
改为HEAD^
,但是暂存区和工作区的内容还是HEAD
的)。 -
--hard
:后面只能接指针,重置版本、暂存区和工作区内容(比如将当前版本HEAD
改为HEAD^
,暂存区和工作区的内容都变成HEAD^
的)。
git 删除远程仓库的某次提交
①撤销中间某次提交
git revert commitId
②撤销 '到' 某次提交并暂存
git reset commitId (注:不要带–hard)到上个版本
git stash 暂存修改
git push --force 强制push,远程的最新的一次commit被删除
git stash pop 释放暂存的修改,开始修改代码
git add . -> git commit -m "massage" -> git push
git 只提交部分修改的文件(提交指定文件)
在我们的项目中,经常会在本地编译一些代码,还未写完,测试那边来告诉你要改改某个文件的bug,非常着急,此时改完了,提交的时候,自己还在编译的代码并不想提交,此时,你可以利用git这些指令帮助你!
1 git status -s 查看仓库状态
2 git add src/components/文件名 添加需要提交的文件名(加路径--参考git status 打印出来的文件路径)
3 git stash -u -k 忽略其他文件,把现修改的隐藏起来,这样提交的时候就不会提交未被add的文件
4 git commit -m "哪里做了修改可写入..."
5 git pull 拉取合并
6 git push 推送到远程仓库
7 git stash pop 恢复之前忽略的文件(非常重要的一步)
git 从某次commit处切新分支
1 git log 查看提交
2 // 通过checkout 跟上commitId 即可创建制定commit之前的本地分支
git checkout commitId -b 本地新branchName
3 git push 推送到远程仓库
git出现Your branch and ‘origin/master‘ have diverged解决方法
如果不需要保留本地的修改,只要执行下面两步:
git fetch origin
git reset --hard origin/master
当我们在本地提交到远程仓库的时候,如果遇到上述问题,我们可以首先使用如下命令:
git rebase origin/master
然后使用
git pull --rebase
最后使用
git push origin master
把内容提交到远程仓库上。
git强制覆盖本地分支
git强制覆盖:
git fetch --all
git reset --hard origin/master
git pull
git强制覆盖本地命令(单条执行):
git fetch --all && git reset --hard origin/master && git pull
.gitignore文件不生效
# 清除缓存文件
git rm -r --cached .
git add .
git commit -m ".gitignore重写缓存成功"
git push
删除文件
①rm read.txt
②现在你有两个选择,
一是确实要从版本库中删除该文件 :
git add read.txt
git commit -m "xxx"
二是删错了,还原
git checkout -- read.txt
---- Git远程仓库 ----
添加远程库
①注册github账号并登录
②在右上角找到“new repository”按钮,创建一个新的仓库:
在Repository name填入你起的名字,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
创建成功后跳到了这个页面:
这个地址就是我们远程仓库地址
③将创建的远程库与本地库进行关联:
然后我们在本地的test仓库下打开git bash,运行命令:
远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库
关联完成后,运行git remote - v命令,可以看到有两个地址,fetch地址用来取回,push地址用来推送
④将文件推送到远程仓库,运行命令git push origin master,origin后面跟的分支,因为我们目前没有创建分支,所以用的master
然后弹出github账户登录页面:
验证后:
推送完成,然后在github中就可以看到我们推送的内容了
远程克隆
如果我们已经有了一个远程库,如何将它拉取到本地呢?
git clone [远程地址],首先复制要克隆项目的远程地址
然后执行命令:
成功后,会发现项目已经克隆到本地
克隆的效果:
完整的把远程库下载到本地
创建origin远程地址别名
初始化本地库
远程库拉取
本地存在clone下来的文件 就用pull更新
pull = fetch + merge
git fetch 别名 分支名
git merge 别名 分支名
git pull 别名 分支名
解决冲突
要点:
1,如果不是基于远程库最新版做的修改不能推送,必须先拉取pull
2,拉取下来如果进入冲突状态,则按照“分支冲突解决” 解决即可
跨团队协作
①点击别人仓库的fork 到自己的仓库
② 然后clone下来 修改后推送到远程库
③ 点击Pull Request请求
④ Create pull request发消息
SSH 免密登录
以上示例我们在clone 和 push的时候都用的 https类型的地址,其实还有一种SSH类型的地址,使用SSH类型的地址推送的时候,就不会让我们输入账号密码了
步骤:
①cd ~ 进入家目录 输入:ssh-keygen -t rsa -C GitHub邮箱地址 然后一路回车
②进入.ssh
目录,复制id_rsa.pub
文件内容
③登录GitHub Settings
--> SSH and GPG keys
--> New SSH Key
④回到git通过ssh地址创建 git remote add 别名 SSH地址
---- Git分支管理----
如果在多人协作的项目中,我们有一个新的功能要去实现,当前我们已经实现了50%,如果此时我们将代码合入master
分支,就有可能影响其他人无法工作,如果我们不合入master
分支,则会有代码丢失的风险。
那么,针对这种情况,我们就可以新建一个只有自己能看见的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作
创建分支
git branch 分支名
查看分支
git branch
git branch -v
切换分支
git checkout 分支名
git checkout -b 分支名 #创建分支并直接切换到该分支
合并分支
例如:b分支已修改完毕,申请合并到a分支上
第一步 切换到接受新内容的分支a
git checkout a
第二步 执行merge命令
git merge b
删除分支
git branch -d 分支名
---- Git工作流----
在项目开发过程中使用Git的方式
分类:
①集中式工作流
像SVN一样,集中式工作流有一个中央仓库,所有的修改都提交到了Master分支上
②GitFlow工作流 *
主干分支master
开发分支develop
修复分支hotfix
预发布分支release
功能分支feature
GitFlow 有独立的分支,让发布迭代过程更流畅。
③Forking 工作流
在 GitFlow 基础上, 充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。 安全可靠地管理大团队的开发者
---- Git补充功能----
设置命令颜色
给Git设置命令颜色,使我们的命令输出更醒目:
git config --global color.ui true
设置忽略文件
比如有些文件需要放在Git仓库目录下,但是又不需要提交到Git的,可以新建一个名称为.gitignore
的文件,然后把你不想要被提交的文件添加进去。很多开发语言的忽略文件都已经写好了忽略文件,我们只需要再往里面添加自己想要添加的就可以了。
设置别名
比如我觉得输入git status
太麻烦,想简化成git st
行吗?当然可以,给git status
配置别名:
git config --global alias.st status
标签
当我们需要一个指定的版本的时候,通常需要这个版本的commit id,但是commit id我们一般记不住,则我们可以使用git tag
给某个版本打上一个标签。commit id和tag的关系类似于网站的IP地址和域名的关系
打标签:
git tag v1.0
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
给历史版本打上标签,先找到commit id,再打标签
git tag 标签名 commit id
查看标签:git tag
查看具体标签对应的版本提交信息:git show v1.0
删除标签:git tag -d v1.1
推送标签到远程仓库:git push origin v1.0
删除远程标签:
需要先删除本地标签,再用命令git push origin :refs/tags/<tag-name>
删除远程标签:
以上文档已上传至github:https://github.com/cuijl123/Git-Github